Git-svn: массовое удаление удаленных веток - PullRequest
13 голосов
/ 06 мая 2011

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

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

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

Ответы [ 3 ]

21 голосов
/ 26 августа 2011

Это быстрое решение, которое я принял за несколько минут. Он использует хорошие шаблоны регулярных выражений, которые доступны не везде.

Это захватывает чистый список ветвей. Я удаляю пробелы форматирования в начале каждой строки и пока игнорирую теги:

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

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

1 голос
/ 06 мая 2011

Чтобы получить более релевантный ответ, пожалуйста, укажите, как выглядит ваш список ветвей (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
0 голосов
/ 14 сентября 2015

Вот мое решение. Нужно заменить косые черты, используемые 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
...