Я мигрирую много репозиториев Git в своей компании, и все было хорошо, пока я не столкнулся с репозиторием с очень специфической компоновкой для веток:
/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/
Как видите, у нас есть ветки не только на верхнем уровне /ветви/ (например, lvl1branch1), но только на двух других уровнях (например, lvl2 / lvl2branch1 и lvl2 / lvl3 / lvl3branch3).
Это мой .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/*/*
И я получаю эту ошибку, когда пытаюсь запустить команду git svn fetch:
фатальный: ошибка update_ref для ref 'refs / remotes / origin / lvl2 / lvl3 / lvl3branch1': невозможно заблокировать ref 'refs / remotes / origin / lvl2 / lvl3 / lvl3branch1': существует 'refs / remotes / origin / lvl2 / lvl3'; не удается создать 'refs / remotes / origin / lvl2 / lvl3 / lvl3branch1' update-ref -m r1638 refs / remotes / origin / lvl2 / lvl3 / lvl3branch1 e421f7d976832aa2efe84da02378e7f89eb55c26: команда вернула ошибку: 128
Я вижу, что могу создать ветку lvl2 / lvl3 / lvl3branch1, потому что Git рассматривает lvl2 / lvl3 как ветку, что неверно. Вероятно, проблема возникает в строке ниже в .git / config:
branches = test/branches/RT-Delivery/*:refs/remotes/origin/lvl2/*
Как я могу сказать Git, чтобы он не читал lvl2 / lvl3 как ветку? Я думаю, что столкнусь с той же проблемой с lvl2, который не является веткой. Есть ли способ добавить исключения?
Я нашел решение, мы можем использовать подстановочные знаки (*) также для фильтрации имен каталогов. Вот .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/*
Например, чтобы убедиться, что мы получим только ветки первого уровня (те, которые начинаются с «lvl1»), а не
branches = test/branches/*:refs/remotes/origin/*
мы можем использовать
branches = test/branches/lvl1*:refs/remotes/origin/*