#git #git-svn
#git #git-svn
Вопрос:
Проект в SVN, над которым я работаю (через git-svn), имеет часто создаваемые ветви, которые затем реинтегрируются с помощью trunk, а затем удаляются.
Прямо сейчас в проекте около 10 ветвей, которые не были удалены, но в git, git branch -r показывает около 50.
Я могу удалять их по одному, проверяя, существуют ли они все еще в репозитории svn, но это медленно и утомительно. Есть ли способ синхронизировать мой список удаленных ветвей git с репозиторием svn?
Ответ №1:
Это быстрое решение, которое я сделал за несколько минут. В нем используются хорошие шаблоны регулярных выражений, которые доступны не везде.
Это позволяет получить чистый список ветвей. Я удаляю пробелы форматирования в начале каждой строки и пока игнорирую теги:
git branch -r | sed 's|^[[:space:]]*||' | grep -v '^tags/' > git-branch-list
Я беру аналогичный список ветвей из svn, снова удаляя форматирование и завершающие косые черты:
svn ls svn://path/to/branch/dir/ | sed 's|^[[:space:]]*||' | sed 's|/$||' > svn-branch-list
Я изменяю списки, нахожу строки, которые больше не существуют в списке svn, удаляю форматирование различий, избавляюсь от «магистральной» ветви (что удобно для git-svn) и сохраняю результаты в новом списке:
diff -u git-branch-list svn-branch-list | grep '^-' | sed 's|^-||' | grep -v '^trunk$' | grep -v '^--' > old-branch-list
Теперь я просто выполняю стандартные процедуры удаления ветвей для git-svn:
for i in `cat old-branch-list`; do git branch -d -r "$i"; rm -rf .git/svn/refs/remotes/"$i"; done
Вероятно, есть способы сделать это получше, но это работает. Кто-нибудь другой может воспользоваться этим и улучшить его.
Комментарии:
1. Хотел бы я больше поддержать этот ответ. Это работает безупречно.
2. И да, это снова спасло мне день.
3. Спасибо, я использовал ваш код для создания этого скрипта git-svn-prune. sh gist.github.com/mattalexx/580fabd9f7e18e81a0570043022b02e9
Ответ №2:
Чтобы получить более релевантный ответ, пожалуйста, укажите, как выглядит ваш список ветвей ( git branch -a
) и какие ссылки вы хотите удалить.
В отсутствие этого я просто что-нибудь придумаю, чтобы вы могли адаптироваться:
Удалите устаревшие ссылки (предположительно, после удаления удаленного вручную?):
git for-each-ref --format="%(refname)" refs/obsoleteremote/ |
xargs -n 1 git update-ref -d
Сбор мусора для всех объектов без ссылок с
git gc --prune=now
или, если ваш git-gc недостаточно новый, чтобы поддерживать аргументы в —prune, используйте
git repack -ad; git prune
Ответ №3:
Вот мое решение. Необходимо заменить косые черты, используемые Subversion в названиях ветвей, и начальные пробелы в списке ветвей Git. IFS должен обрабатывать пробелы внутри самих названий ветвей.
cd $git_repo
IFS="$(printf 'n')"; diff <(for i in `git branch -r`; do echo "$i" | sed 's/^ //g'; done | sort) <(for i in `svn ls http://host/my/svn/dir/branches`; do echo "$i" | sed 's//$//g'; done | sort) | grep '<' | cut -d' ' -f2 | xargs /usr/bin/git branch -r -d