2010-09-08 6 views
190

Я хотел бы, чтобы очистить свой локальный репозиторий, который имеет кучу старых ветвей: например 3.2, 3.2.1, 3.2.2 и т.д.Можете ли вы удалить несколько ветвей одной командой с Git?

Я надеялся на подлый способ, чтобы удалить многие из них сразу , Так как они в основном следует конвенции релиза дота, я подумал, что там было ярлык сказать:

git branch -D 3.2.* 

и убить все ветви 3.2.x.

Я пробовал эту команду, и это, конечно, не сработало.

ответ

219

Не с этим синтаксисом. Но вы можете сделать это следующим образом:

git branch -D 3.2 3.2.1 3.2.2 

В основном, мерзавец филиал будет удалить несколько ветвь для вас с одним вызовом. К сожалению, это не завершение имени ветви. Хотя, в Баш, вы можете сделать:

git branch -D `git branch | grep -E '^3\.2\..*'` 
+1

Окончание на 'мерзавца ветви -D/-d' отлично работает для меня. Возможно, вы захотите обновить свою версию (возможно, из самой последней папки git.git contrib). – Cascabel

+13

Вместо 'git отрасли | ... 'вы можете использовать' $ (git for-each-ref -format = '% (refname: short)' refs/heads/3. *) '. Это длиннее, я знаю, но это гарантированно будет подходящим выходом, в то время как 'git branch' имеет довольно вывод с такими вещами, как' * 'и' -> '(для symrefs), которые могут испортить вам скрипты/однострочные. – Cascabel

+1

+1 намного проще, чем ответ выше – nischayn22

111
git branch | cut -c3- | egrep "^3.2" | xargs git branch -D 
^   ^   ^  ^
    |    |    |   |--- create arguments 
    |    |    |    from standard input 
    |    |    | 
    |    |    |---your regexp 
    |    | 
    |    |--- skip asterisk 
    |--- list all 
     local 
     branches 

EDIT:

Безопаснее версия (предложенный Якуб Narębski и Jefromi), а выход мерзавец филиал не предназначены для использования в сценариях:

git for-each-ref --format="%(refname:short)" refs/heads/3.2\* | xargs git branch -D 

... или xargs бесплатно:

git branch -D `git for-each-ref --format="%(refname:short)" refs/heads/3.2\*` 
+12

Не используйте вывод 'git branch' для скриптов. Используйте 'git for-each-ref'. –

+1

Чтобы удалить теги с символом @: 'git for-each-ref -format ="% (refname: short) "refs/tags/\ * @ \ * | xargs git tag -d' – thaddeusmt

+1

Спасибо за объяснение с помощью искусства ascii. –

22

Использование

git for-each-ref --format='%(refname:short)' 'refs/heads/3.2.*' | 
    xargs git branch -D 
+7

Небольшой совет: если вы удалите последнюю часть команды «| xargs git branch -D», тогда она просто выведет соответствующие ветви. Итак, вы можете просмотреть ветви, которые будут удалены. –

+1

Также я добавил псевдоним, чтобы упростить это: 'alias grefs = 'git for-each-ref -format ="% (refname: short) "", поэтому я могу сделать 'grefs | grep 'regexpattern' | xargs git branch -D' – angularsen

+0

Любимый. Ницца и просто! –

95

Ну, в самом худшем случае, вы можете использовать:

git branch | grep '3\.2' | xargs git branch -d 
+11

Это идеальный метод для тех, кто использует стандартизованную префиксную нотацию для имен филиалов (например, «fix/...» или «feature/...»). – Haz

0

Как и в Git все ветви являются не ссылками на мерзавца репо, почему бы вам не просто удалить ветви, идущие к .git/ref, а затем, если что-то осталось, что не интересно в репозитории, автоматически будет собран мусор, поэтому вам не нужно беспокоиться.

4

Я сделал небольшую функцию, которая может быть полезной, исходя из ответа, предоставленного @gawi (см. Выше).

removeBranchesWithPrefix() { 
    git for-each-ref --format="%(refname:short)" refs/heads/$1\* | xargs git branch -d 
} 

Добавьте это к вашему .bash_profile и перезапустите терминал. После этого вы можете вызвать из командной строки следующим образом:

removeBranchesWithPrefix somePrefix 

Примечания

У меня в настоящее время установки для удаления мягкого, что означает, что он не будет удалять ветки, если они не уже слиты. Если вы любите жить на краю, измените -d на -D и он обязательно удалит все с префиксом!

4

Если вы не ограничены использованием командной строки git, вы всегда можете запустить git gui и использовать пункт меню «Ветка-> Удалить». Выберите все ветви, которые вы хотите удалить, и позвольте ей разорвать.

+0

это только позволяет удалять локальные ветви, хотя –

3

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

git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "remove branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done` 

Используйте -D, чтобы заставить делеции (как обычно).

Для удобства чтения, вот что распались построчно ...

git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* | 
    while read -r line; do 
     read -p "remove branch: $line (y/N)?" answer </dev/tty; 
     case "$answer" in y|Y) echo "$line";; 
     esac; 
    done` 

вот xargs подход ...

git for-each-ref --format="%(refname:short)" refs/heads/\* | 
while read -r line; do 
    read -p "remove branch: $line (y/N)?" answer </dev/tty; 
    case "$answer" in 
     y|Y) echo "$line";; 
    esac; 
done | xargs git branch -D 

наконец, я хотел бы иметь это в моем. Bashrc

alias gitselect='git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "select branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done' 

Таким образом, я могу только сказать,

gitSelect | xargs git branch -D. 
0

Я вас на окнах, вы можете использовать PowerShell, чтобы сделать это:

git branch | grep 'feature/*' |% { git branch -D $_.trim() } 

заменить feature/* с любым рисунком вы любите.

+3

grep - это не признанный командлет для меня ... поэтому я изменил для этого git branch | где {$ _. Trim(). StartsWith ("bug")} | % {git branch -D $ _. Trim()} и работал! – Alex

20

Недавно я искал решение той же задачи, в конце концов я нашел один ответ, и он работает очень хорошо:

  1. Открыть терминал или эквивалент.
  2. Тип в джинсовой отрасли | grep "pattern" для предварительного просмотра ветвей , которые будут удалены.
  3. Тип в джинсовой отрасли | grep "pattern" | xargs git branch -D

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

-1

Вы можете удалить все ветви удаляя все ненужные реф:

rm .git/refs/heads/3.2.*

+1

Сокращенный по двум причинам: 1. он использует детальную реализацию (тот факт, что текущие версии Git хранят ветки как файлы в определенном каталоге). Это может измениться в будущих версиях, что делает ответ недействительным. 2. Он не работает, если репозиторий находится в [отдельном каталоге] (https://git-scm.com/docs/git-init#git-init---separate-git-dirltgitdirgt). – axiac

+0

Кроме того, это дает очень неожиданные результаты, если вы запустите это в упакованном репозитории ('git gc'). Не делай этого. –

7

Вы можете использовать Git филиал --list для просмотра списка подходящих ветвей

git branch --list '3.2.*' 

Использования GIT ветви -D/-d, чтобы удалить подходящие ветви. Один лайнер пример:

git branch -d `git branch --list '3.2.*'`