2

I'm migrating a lot of Git repositories in my company and everything was fine until I faced a repository with a very specific layout for branches:

/trunk/
/branches/
/branches/lvl1branch1
/branches/lvl1branch2
/branches/lvl1branch3
/branches/lvl2/lvl2branch1
/branches/lvl2/lvl2branch2
/branches/lvl2/lvl2branch
/branches/lvl2/lvl3/lvl3branch1
/branches/lvl2/lvl3/lvl3branch2
/branches/lvl2/lvl3/lvl3branch3
/tags/

As you can see, we have branches not only in the top level of /branches/ (e.g. lvl1branch1), but only in other two levels (e.g. lvl2/lvl2branch1 and lvl2/lvl3/lvl3branch3).

This is my .git/config:

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true
    symlinks = false
    ignorecase = true
[svn-remote "svn"]
    url = https://myrepourl/
    fetch = test/trunk:refs/remotes/origin/trunk
    branches = test/branches/*:refs/remotes/origin/*
    branches = test/branches/lvl2/*:refs/remotes/origin/lvl2/*
    branches = test/branches/lvl2/*/*:refs/remotes/origin/lvl2/*/*

And I get this error when I try to run the git svn fetch command:

fatal: update_ref failed for ref 'refs/remotes/origin/lvl2/lvl3/lvl3branch1': cannot lock ref 'refs/remotes/origin/lvl2/lvl3/lvl3branch1': 'refs/remotes/origin/lvl2/lvl3' exists; cannot create 'refs/remotes/origin/lvl2/lvl3/lvl3branch1' update-ref -m r1638 refs/remotes/origin/lvl2/lvl3/lvl3branch1 e421f7d976832aa2efe84da02378e7f89eb55c26: command returned error: 128

I can see I can create the branch lvl2/lvl3/lvl3branch1 because Git is considering lvl2/lvl3 is a branch, which is not true. Probably the line below in .git/config is causing the problem:

branches = test/branches/RT-Delivery/*:refs/remotes/origin/lvl2/*

How can I tell Git to avoid reading lvl2/lvl3 as a branch? I believe I will also face the same problem with lvl2, which is not a branch. Is there a way to add exceptions?

1 Answer 1

2

I found out a solution, we can use the wildcards (*) also for filtering the directory names. Here is the .git/config:

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true
    symlinks = false
    ignorecase = true
[svn-remote "svn"]
    url = https://svn.it.volvo.net/svn/rtdms_tools/
    fetch = test/trunk:refs/remotes/origin/trunk
    branches = test/branches/lvl1*:refs/remotes/origin/*
    branches = test/branches/lvl2/lvl2*:refs/remotes/origin/lvl2/*
    branches = test/branches/lvl2/lvl3/*:refs/remotes/origin/lvl2/lvl3/*

For instance, in order to make sure we will only get the branches in the first level (the ones starting with "lvl1"), instead of

branches = test/branches/*:refs/remotes/origin/*

we can use

branches = test/branches/lvl1*:refs/remotes/origin/*
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.