Git -svn: Массовое удаление сиротских удаленных ветвей
Проект в SVN, над которым я работаю (через git -svn), имеет часто созданные ветки, которые затем - реинтегрируются с помощью соединительной линии, а затем удаляются.
Сейчас проект имеет около 10 ветвей, которые не были удалены, но в git, git branch -r показывает около 50.
Я могу удалить их по одному, проверяя, все ли они существуют в репозитории svn, но это медленный и утомительный. Есть ли способ синхронизировать мой список git удаленных ветвей с svn repo?
Ответы
Ответ 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