Git-svn: массовое удаление потерянных удаленных ветвей

#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