Можете ли вы удалить несколько ветвей в одной команде с помощью Git?

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

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

git branch -D 3.2.*

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

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

Ответ 1

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

git branch -D 3.2 3.2.1 3.2.2

В принципе, ветвь git удалит несколько ветвей для вас с помощью одного вызова. К сожалению, это не завершение имени ветки. Хотя в bash вы можете:

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

Ответ 2

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\*`

Ответ 3

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

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

Ответ 4

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

Один пример лайнера:

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

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

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

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

Ответ 8

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

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

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

removeBranchesWithPrefix somePrefix

Примечание

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

Ответ 9

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

Ответ 10

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

git branch -d $(git branch)

Он удалит все ваши локальные объединенные ветки, кроме той, которую вы сейчас регистрируете.

Это хороший способ сделать ваш локальный чистый

Ответ 11

Если вы используете Windows, вы можете использовать Power Shell для удаления нескольких веток одновременно...

git branch -D ((git branch | Select-String -Pattern 'feature-*') | foreach{$_.ToString().Trim()})

эта команда удалит все ветки, содержащие слово "feature-" в качестве подстроки.

Вы также можете точно настроить, как должно работать сопоставление с шаблоном, используя команду Powershell Select-String. Посмотрите на документы PowerShell.

Ответ 12

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

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.

Ответ 13

Для чистых душ, которые используют PowerShell, здесь небольшая git branch -d $(git branch --list '3.2.*' | %{$_.Trim() }) скрипта git branch -d $(git branch --list '3.2.*' | %{$_.Trim() })

Ответ 14

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

git branch | cut -d '*' -f 1 | tr -d " \t\r" | xargs git branch -d

Изменить: Я использую Mac Os

Ответ 15

у меня работает правильно

git branch | xargs git branch -d

git branch | xargs git branch -D

удалить все локальные ветки

Ответ 16

Я нахожусь в окнах, вы можете использовать powershell для этого:

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

замените feature/* на любой шаблон, который вам нравится.

Ответ 17

Вы можете использовать эту команду: git branch -D $(printf "%s\n" $(git branch) | grep '3.2')

Ответ 18

Вы можете использовать git gui для удаления нескольких веток одновременно. Из командной строки /Bash → git gui → Удаленный → Удалить ветку... → выберите удаленные ветки, которые вы хотите удалить → Удалить.

Ответ 19

Я только что убрал большой набор устаревших локальных/удаленных веток сегодня.

Вот как я это сделал:

1. перечислите все имена ветвей в текстовый файл:

git branch -a >> BranchNames.txt

2. добавьте ветки, которые я хочу удалить, к команде "git branch -D -r":

git branch -D -r origin/dirA/branch01 origin/dirB/branch02 origin/dirC/branch03 (... добавлять любые имена ветвей)

3. выполнить cmd

И этот работает намного быстрее и надежнее, чем " git push origin - -D elete ".

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

Ответ 20

Если вы установили Git GUI, который является надстройкой по умолчанию для Windows, то он самый простой. Вы можете использовать Ctrl, чтобы выбрать несколько веток и удалить их одним щелчком мыши.

Ответ 21

Если вы используете оболочку Fish, вы можете использовать функции string:

git branch -d (git branch -l "<your pattern>" | string trim)

Это не сильно отличается от параметров Powershell в некоторых других ответах.

Ответ 22

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

Ответ 23

git branch -D <branchName>

Ответ 24

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

rm .git/refs/heads/3.2.*