Можете ли вы удалить несколько веток в одной команде с помощью Git? - PullRequest
288 голосов
/ 08 сентября 2010

Я бы хотел очистить свой локальный репозиторий, в котором есть тонна старых веток: например, 3.2, 3.2.1, 3.2.2 и т. Д.

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

git branch -D 3.2.*

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

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

Ответы [ 22 ]

309 голосов
/ 08 сентября 2010

Не с этим синтаксисом. Но вы можете сделать это так:

git branch -D 3.2 3.2.1 3.2.2

По сути, git branch удалит несколько веток за вас одним вызовом. К сожалению, это не делает завершение имени ветви. Хотя в bash вы можете сделать:

git branch -D `git branch | grep -E '^3\.2\..*'`
131 голосов
/ 08 сентября 2010
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:

Более безопасная версия (предложенная Jakub Narębski и Jefromi), поскольку вывод ветки git не предназначен для использования в скриптах:

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\*`
122 голосов
/ 23 мая 2013

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

git branch | grep '3\.2' | xargs git branch -d
76 голосов
/ 15 ноября 2017

Вы можете использовать git branch --list, чтобы вывести список подходящих веток, и использовать git branch -D / -d, чтобы удалить подходящие ветки.

Пример одного лайнера:

git branch -d `git branch --list '3.2.*'`
36 голосов
/ 23 марта 2017

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

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

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

25 голосов
/ 09 сентября 2010

Используйте

git for-each-ref --format='%(refname:short)' 'refs/heads/3.2.*' |
   xargs git branch -D
8 голосов
/ 13 июля 2018

Может быть, вы найдете это полезным:

Если вы хотите удалить все ветви, которые не являются, например, 'master', 'foo' и 'bar'

git branch -D `git branch | grep -vE 'master|foo|bar'`

grep -v 'что-то' - совпадение с инверсией.

5 голосов
/ 19 февраля 2015

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

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

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

removeBranchesWithPrefix somePrefix

Примечание

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

5 голосов
/ 18 декабря 2015

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

3 голосов
/ 14 сентября 2018

Если вам действительно нужно почистить все свои ветви, попробуйте

git branch -d $(git branch)

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

Это хороший способ сделать вашу местную чистую

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...