Подтвердить что ты не робот

Git -svn: Массовое удаление сиротских удаленных ветвей

Проект в SVN, над которым я работаю (через git -svn), имеет часто созданные ветки, которые затем - реинтегрируются с помощью соединительной линии, а затем удаляются.

Сейчас проект имеет около 10 ветвей, которые не были удалены, но в git, git branch -r показывает около 50.

Я могу удалить их по одному, проверяя, все ли они существуют в репозитории svn, но это медленный и утомительный. Есть ли способ синхронизировать мой список git удаленных ветвей с svn repo?

4b9b3361

Ответ 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, удаляет форматирование diff, избавляется от ветки "trunk" (что является удобством 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

Вероятно, лучшие способы сделать это, но это работает. Кто-то еще может принять это и улучшить его.

Ответ 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