it-swarm.com.ru

Как я могу удалить все ветки Git, которые были объединены?

У меня много веток Git. Как удалить ветки, которые уже были объединены? Есть ли простой способ удалить их все вместо того, чтобы удалять их по одному?

1499
Nyambaa

Обновление:

Вы можете добавить другие ветви, чтобы исключить их как master и dev, если ваш рабочий процесс имеет их в качестве возможного предка. Обычно я разветвляюсь от тега «sprint-start» и master, dev и qa не являются предками.

Сначала перечислите все ветви, которые были объединены в удаленном.

git branch --merged

Вы можете увидеть несколько веток, которые не хотите удалять. мы можем добавить несколько аргументов, чтобы пропустить важные ветки, которые мы не хотим удалять, как master или development. Следующая команда пропустит основную ветвь и все, что содержит dev.

git branch --merged| egrep -v "(^\*|master|dev)"

Если вы хотите пропустить, вы можете добавить его в команду egrep, как показано ниже. Ветка skip_branch_name не будет удалена. 

git branch --merged| egrep -v "(^\*|master|dev|skip_branch_name)"

Чтобы удалить все локальные ветви, которые уже объединены в текущую извлеченную ветку:

git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d

Вы можете видеть, что master и dev исключены, если они являются предками.


Вы можете удалить объединенную локальную ветку с помощью:

git branch -d branchname

Если он не объединен, используйте:

git branch -D branchname

Чтобы удалить его с пульта в старых версиях Git, используйте:

git Push Origin :branchname

В более поздних версиях Git используют:

git Push --delete Origin branchname

Как только вы удалите ветку с удаленного компьютера, вы можете удалить Prune для удаленного отслеживания веток с помощью:

git remote Prune Origin

или обрезать отдельные ветви удаленного отслеживания, как предполагает другой ответ, с помощью:

git branch -dr branchname

Надеюсь это поможет.

2523
Adam Dymitruk

Чтобы удалить все удаленные ветви, которые уже объединены:

git branch -r --merged | grep -v master | sed 's/Origin\//:/' | xargs -n 1 git Push Origin

В более поздних версиях Git

git branch -r --merged | grep -v master | sed 's/Origin\///' | xargs -n 1 git Push --delete Origin
365
kuboon

Просто немного расширив ответ Адама:

Добавьте это в свою конфигурацию Git, запустив git config -e --global

[alias]
    cleanup = "!git branch --merged | grep  -v '\\*\\|master\\|develop' | xargs -n 1 git branch -d"

И тогда вы можете удалить все локальные объединенные ветви, выполнив простой git cleanup.

150
real_ate

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

git branch --merged | grep -v '^* master$' | grep -v '^  master$' | xargs git branch -d
74
Ismael Abreu

Вы захотите исключить ветви master & develop из этих команд.

Локальный мерзавец ясно: 

git branch --merged | grep -v '\*\|master\|develop' | xargs -n 1 git branch -d

Удаленный git clear: 

git branch -r --merged | grep -v '\*\|master\|develop' | sed 's/Origin\///' | xargs -n 1 git Push --delete Origin

Синхронизация локального реестра удаленных филиалов: 

git fetch -p
66
Guido Bouman

Для тех из вас, кто работает в Windows и предпочитает скрипты PowerShell, вот тот, который удаляет локальные объединенные ветви:

function Remove-MergedBranches
{
  git branch --merged |
    ForEach-Object { $_.Trim() } |
    Where-Object {$_ -NotMatch "^\*"} |
    Where-Object {-not ( $_ -Like "*master" )} |
    ForEach-Object { git branch -d $_ }
}
42
Klas Mellbourn

Git Sweep делает большую работу из этого.

20
paul

Использование Git версии 2.5.0:

git branch -d `git branch --merged`
14
drautb

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

  1. ветви, которые содержали слово "мастер" были проигнорированы, например, "notmaster" или "masterful", а не только основная ветвь
  2. ветви, которые содержали слово "dev" были проигнорированы, например, "dev-test", а не только ветка dev
  3. удаление веток, которые доступны из заголовка current branch (то есть не обязательно master)
  4. в отключенном состоянии HEAD, удаление каждой ветви, достижимой из текущего коммита

1 и 2 были просты для решения, просто изменив регулярное выражение. 3 зависит от контекста того, что вы хотите (т.е. удаляете только те ветки, которые не были объединены с master или с вашей текущей веткой) . 4 может привести к катастрофическим последствиям (хотя их можно восстановить с помощью git reflog), если Вы непреднамеренно запустили это в отсоединенном состоянии HEAD.

Наконец, я хотел, чтобы все было в одной строке, для которой не требовался отдельный скрипт (Bash | Ruby | Python).

TL; DR

Создайте псевдоним git «sweep», который принимает необязательный флаг -f:

git config --global alias.sweep '!f(){ git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d; }; f'

и вызвать его с помощью:

git sweep

или же:

git sweep -f

Длинный, подробный ответ

Мне было проще создать пример git-репо с некоторыми ветками и коммитами для проверки правильности поведения:

Создать новый репозиторий Git с одним коммитом

mkdir sweep-test && cd sweep-test && git init
echo "hello" > hello
git add . && git commit -am "initial commit"

Создайте несколько новых веток

git branch foo && git branch bar && git branch develop && git branch notmaster && git branch masterful
git branch --list
  bar
  develop
  foo
* master
  masterful
  notmaster

Желаемое поведение: выберите все объединенные ветви, кроме: master, development или current

В оригинальном регулярном выражении пропущены ветки "masterful" и "notmaster":

git checkout foo
git branch --merged | egrep -v "(^\*|master|dev)"
  bar

С обновленным регулярным выражением (которое теперь исключает «развернуть», а не «dev»):

git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
bar
masterful
notmaster

Переключитесь на ветку foo, сделайте новый коммит, затем извлеките новую ветку foobar на основе foo:

echo "foo" > foo
git add . && git commit -am "foo"
git checkout -b foobar
echo "foobar" > foobar
git add . && git commit -am "foobar"

Моя текущая ветка - это foobar, и если я перезапущу приведенную выше команду для вывода списка веток, которые я хочу удалить, ветка "foo" будет включена, даже если она не была объединена с master:

git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  foo
  masterful
  notmaster

Однако, если я запускаю ту же команду на master, ветка "foo" не включается:

git checkout master && git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  masterful
  notmaster

И это просто потому, что git branch --merged по умолчанию равен HEAD текущей ветви, если не указано иное. По крайней мере, для моего рабочего процесса я не хочу удалять локальные ветви, если они не были объединены с master, поэтому я предпочитаю следующий вариант:

git checkout foobar
git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  masterful
  notmaster

Отделенное состояние HEAD

Использование стандартного поведения git branch --merged имеет еще более существенные последствия в отключенном состоянии HEAD:

git checkout foobar
git checkout HEAD~0
git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  foo
  foobar
  masterful
  notmaster

Это удалило бы ветку, на которой я только что находился, «foobar» вместе с «foo», что почти наверняка не является желаемым результатом…. Однако с нашей пересмотренной командой:

git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  masterful
  notmaster

Одна строка, включая фактическое удаление

git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" | xargs git branch -d

Все закутано в git псевдоним "sweep":

git config --global alias.sweep '!f(){ git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d; }; f'

Псевдоним принимает необязательный флаг -f. Поведение по умолчанию - удаление только тех веток, которые были объединены в master, но флаг -f удалит ветки, которые были объединены в текущую ветку.

git sweep
Deleted branch bar (was 9a56952).
Deleted branch masterful (was 9a56952).
Deleted branch notmaster (was 9a56952).
git sweep -f
Deleted branch foo (was 2cea1ab).
13
eddies

Вы можете добавить коммит в опцию --merged . Таким образом, вы можете быть уверены, что удаляете только ветки, которые объединены в то есть в Origin/master.

Следующая команда удалит объединенные ветви из вашего Происхождения.

git branch -r --merged Origin/master | grep -v "^.*master" | sed s:Origin/:: |xargs -n 1 git Push Origin --delete 

Вы можете проверить, какие ветви будут удалены, заменив git Push Origin --delete на echo

git branch -r --merged Origin/master | grep -v "^.*master" | sed s:Origin/:: |xargs -n 1 echo
13
Jörn Reimerdes

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

#!/usr/bin/env Ruby

current_branch = `git symbolic-ref --short HEAD`.chomp
if current_branch != "master"
  if $?.exitstatus == 0
    puts "WARNING: You are on branch #{current_branch}, NOT master."
  else
    puts "WARNING: You are not on a branch"
  end
  puts
end

puts "Fetching merged branches..."
remote_branches= `git branch -r --merged`.
  split("\n").
  map(&:strip).
  reject {|b| b =~ /\/(#{current_branch}|master)/}

local_branches= `git branch --merged`.
  gsub(/^\* /, '').
  split("\n").
  map(&:strip).
  reject {|b| b =~ /(#{current_branch}|master)/}

if remote_branches.empty? && local_branches.empty?
  puts "No existing branches have been merged into #{current_branch}."
else
  puts "This will remove the following branches:"
  puts remote_branches.join("\n")
  puts local_branches.join("\n")
  puts "Proceed?"
  if gets =~ /^y/i
    remote_branches.each do |b|
      remote, branch = b.split(/\//)
      `git Push #{remote} :#{branch}`
    end

    # Remove local branches
    `git branch -d #{local_branches.join(' ')}`
  else
    puts "No branches removed."
  end
end
11
mmrobins

Как удалить объединенные ветви в консоли PowerShell

git branch --merged | %{git branch -d $_.Trim()}

Смотрите GitHub для Windows

8
Konstantin Tarkus

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

Если вам нужно знать, была ли ветка объединена с главной, следующая команда не выдаст выходных данных, если myTopicBranch был объединен (т.е. вы можете удалить ее)

$ git rev-list master | grep $(git rev-parse myTopicBranch)

Вы можете использовать команду ветки Git, проанализировать все ветви в Bash и выполнить цикл for по всем веткам. В этом цикле вы проверяете вышеуказанной командой, можете ли вы удалить ветку или нет.

8
ralphtheninja

в ответе kuboon пропущено удаление веток, в имени ветки которых есть мастер Word . В его ответе улучшено следующее:

git branch -r --merged | grep -v "Origin/master$" | sed 's/\s*Origin\///' | xargs -n 1 git Push --delete Origin

Конечно, это не удаляет саму "главную" ветку :)

8
Paras

git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d удалит все локальные ветви, кроме текущей отмеченной ветви и/или master.

Вот полезная статья для тех, кто хочет понять эти команды: Git Clean: Удалить уже объединенные ветви, автор Стивен Харман .

6
styger

Вы можете использовать git-del-brинструмент .

git-del-br -a

Вы можете установить его через pip, используя

pip install git-del-br

П.С .: Я автор инструмента. Любые предложения/отзывы приветствуются. 

5
tusharmakkar08

Псевдоним версия обновленный ответ Адама :

[alias]
    branch-cleanup = "!git branch --merged | egrep -v \"(^\\*|master|dev)\" | xargs git branch -d #"

Также см. этот ответ для получения полезных советов по выходу из сложных псевдонимов.

5
Eliot

Если вы хотите удалить все локальные ветви, которые уже объединены с той ветвью, в которой вы сейчас находитесь, я предложил безопасную команду, основанную на предыдущих ответах:

git branch --merged | grep -v \* | grep -v '^\s*master$' | xargs -t -n 1 git branch -d

Эта команда не повлияет на вашу текущую ветку или вашу основную ветку. Он также скажет вам, что он делает, прежде чем он это сделает, используя флаг -t xargs.

4
chrismendis

Попробуйте следующую команду:

git branch -d $(git branch --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))

Используя git rev-parse, мы получим имя текущей ветви , чтобы исключить его. Если вы получили ошибку, это означает, что нет локальных веток для удаления.

Чтобы сделать то же самое с удаленными ветвями (измените Origin на ваше удаленное имя), попробуйте:

git Push Origin -vd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD) | cut -d/ -f2)

Если у вас несколько пультов, добавьте grep Origin | перед cut, чтобы отфильтровать только Origin.

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

git branch -rd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))

Затем снова введите git fetch и снова используйте предыдущую команду git Push -vd.

Если вы часто используете его, рассмотрите возможность добавления псевдонимов в ваш файл ~/.gitconfig.

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

4
kenorb

У меня ниже работает запрос 

for branch in  `git branch -r --merged | grep -v '\*\|master\|develop'|awk 'NR > 0 {print$1}'|awk '{gsub(/Origin\//, "")}1'`;do git Push Origin --delete $branch; done

и это отфильтрует любую ветвь в трубе grep.

Хорошо работает с http-клоном, но не очень хорошо для ssh-соединения.

4
user1460965

Основываясь на некоторых из этих ответов, я сделал свой собственный скрипт Bash, чтобы сделать это тоже !

Он использует git branch --merged и git branch -d для удаления объединенных ветвей и запрашивает каждую ветку перед удалением.

merged_branches(){
  local current_branch=$(git rev-parse --abbrev-ref HEAD)
  for branch in $(git branch --merged | cut -c3-)
    do
      echo "Branch $branch is already merged into $current_branch."
      echo "Would you like to delete it? [Y]es/[N]o "
      read REPLY
      if [[ $REPLY =~ ^[Yy] ]]; then
        git branch -d $branch
      fi
  done
}
4
earlonrails

Я использую схему именования git-flow esque, поэтому она работает для меня очень безопасно:

git branch --merged | grep -e "^\s\+\(fix\|feature\)/" | xargs git branch -d

Он в основном ищет объединенные коммиты, которые начинаются со строки fix/ или feature/.

4
Chad M

Напишите скрипт, в котором Git проверяет все ветви, которые были объединены с master.

Затем выполните git checkout master.

Наконец, удалите объединенные ветви.

for k in $(git branch -ra --merged | egrep -v "(^\*|master)"); do
  branchnew=$(echo $k | sed -e "s/Origin\///" | sed -e "s/remotes\///")
  echo branch-name: $branchnew
  git checkout $branchnew
done

git checkout master

for k in $(git branch -ra --merged | egrep -v "(^\*|master)"); do
  branchnew=$(echo $k | sed -e "s/Origin\///" | sed -e "s/remotes\///")
  echo branch-name: $branchnew
  git Push Origin --delete $branchnew
done
3
Komu

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

Если вы посмотрите на вывод, вы увидите что-то вроде 

$ git branch --merged master -v
  api_doc                  3a05427 [gone] Start of describing the Java API
  bla                      52e080a Update wording.
  branch-1.0               32f1a72 [maven-release-plugin] prepare release 1.0.1
  initial_proposal         6e59fb0 [gone] Original proposal, converted to AsciiDoc.
  issue_248                be2ba3c Skip unit-for-type checking. This needs more work. (#254)
  master                   be2ba3c Skip unit-for-type checking. This needs more work. (#254)

Ветви bla и issue_248 являются локальными ветвями, которые будут удалены без вывода сообщений.

Но вы также можете увидеть слово [gone], которое указывает ветви, которые были перенесены на удаленный (который теперь исчез) и, следовательно, обозначает, что ветви могут быть удалены.

Исходный ответ, таким образом, можно изменить на (разделить на многострочный для более короткой длины строки)

git branch --merged master -v | \
     grep  "\\[gone\\]" | \
     sed -e 's/^..//' -e 's/\S* .*//' | \
      xargs git branch -d

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

2
Heiko Rupp

Для Windows вы можете установить Cygwin и удалить все удаленные ветки, используя следующую команду:

git branch -r --merged | "C:\cygwin64\bin\grep.exe" -v master | "C:\cygwin64\bin\sed.exe" 's/Origin\///' | "C:\cygwin64\bin\xargs.exe" -n 1 git Push --delete Origin
1
Seyed Morteza Mousavi

В Windows с git bash установленным egrep -v не будет работать

git branch --merged | grep -E -v "(master|test|dev)" | xargs git branch -d

где grep -E -v эквивалентен egrep -v

Используйте -d, чтобы удалить уже объединенные ветки, или -D, чтобы удалить не объединенные ветки

1
DevWL

Чтобы избежать случайного запуска команды из любой другой ветки, кроме master, я использую следующий скрипт bash. В противном случае запуск git branch --merged | grep -v "\*" | xargs -n 1 git branch -d из ветви, которая была объединена с главной веткой, может удалить главную ветку.

#!/bin/bash

branch_name="$(git symbolic-ref HEAD 2>/dev/null)" ||
branch_name="(unnamed branch)"     # detached HEAD
branch_name=${branch_name##refs/heads/}

if [[ $branch_name == 'master' ]]; then
   read -r -p "Are you sure? [y/N] " response
   if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]; then
       git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
   fi
else
   echo "Refusing to delete branches that are not merged into '$branch_name'. Checkout master first."
fi
1
Robert Kajic

По состоянию на 2018.07

Добавьте это в раздел [alias] вашего ~/.gitconfig:

sweep = !"f() { git branch --merged | egrep -v \"(^\\*|master|dev)\" || true | xargs git branch -d; }; f"

Теперь вы можете просто вызвать git sweep, чтобы выполнить необходимую очистку.

1
sorin

Чтобы удалить локальные ветви, которые были объединены с главной веткой, я использую следующий псевдоним (git config -e --global):

cleanup = "!git branch --merged master | grep -v '^*\\|master' | xargs -n 1 git branch -D"

Я использую git branch -D, чтобы избежать сообщений error: The branch 'some-branch' is not fully merged., в то время как моя текущая проверка отличается от основной ветви.

0
dgt

Скрипт Python, дружественный к Windoze (потому что git-sweep захлебнулся в репозитории Wesnoth):

#!/usr/bin/env python
# Remove merged git branches. Cross-platform way to execute:
#
#   git branch --merged | grep -v master | xargs git branch -d
#
# Requires gitapi - https://bitbucket.org/haard/gitapi
# License: Public Domain

import gitapi

repo = gitapi.Repo('.')
output = repo.git_command('branch', '--merged').strip()
for branch in output.split('\n'):
  branch = branch.strip()
  if branch.strip(' *') != 'master':
    print(repo.git_command('branch', '-d', branch).strip())

https://Gist.github.com/techtonik/b3f0d4b9a56dbacb3afc ​​

0
anatoly techtonik

Если вы используете модель ветвления, такую ​​как HubFlow или GitFlow, вы можете использовать эту команду для удаления объединенных ветвей объектов:

git branch --merged | grep feature.* | grep -v "\*" | xargs -n 1 git branch -d

0
bedrin

Вот способ удалить ветку git

git branch -D BranchName
0
Hasib Kamal

Мой вклад в сценарий Bash свободно основан на ответ mmrobin .

Требуются некоторые полезные параметры, определяющие включения и исключения, или для проверки/удаления только локальных или удаленных ветвей вместо обоих.

#!/bin/bash

# exclude branches regex, configure as "(branch1|branch2|etc)$"
excludes_default="(master|next|ag/doc-updates)$"
excludes="__NOTHING__"
includes=
merged="--merged"
local=1
remote=1

while [ $# -gt 0 ]; do
  case "$1" in
  -i) shift; includes="$includes $1" ;;
  -e) shift; excludes="$1" ;;
  --no-local) local=0 ;;
  --no-remote) remote=0 ;;
  --all) merged= ;;
  *) echo "Unknown argument $1"; exit 1 ;;
  esac
  shift   # next option
done

if [ "$includes" == "" ]; then
  includes=".*"
else
  includes="($(echo $includes | sed -e 's/ /|/g'))"
fi

current_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
if [ "$current_branch" != "master" ]; then
  echo "WARNING: You are on branch $current_branch, NOT master."
fi
echo -e "Fetching branches...\n"

git remote update --Prune
remote_branches=$(git branch -r $merged | grep -v "/$current_branch$" | grep -v -E "$excludes" | grep -v -E "$excludes_default" | grep -E "$includes")
local_branches=$(git branch $merged | grep -v "$current_branch$" | grep -v -E "$excludes" | grep -v -E "$excludes_default" | grep -E "$includes")
if [ -z "$remote_branches" ] && [ -z "$local_branches" ]; then
  echo "No existing branches have been merged into $current_branch."
else
  echo "This will remove the following branches:"
  if [ "$remote" == 1 -a -n "$remote_branches" ]; then
    echo "$remote_branches"
  fi
  if [ "$local" == 1 -a -n "$local_branches" ]; then
    echo "$local_branches"
  fi
  read -p "Continue? (y/n): " -n 1 choice
  echo
  if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then
    if [ "$remote" == 1 ]; then
      remotes=$(git remote)
      # Remove remote branches
      for remote in $remotes
      do
        branches=$(echo "$remote_branches" | grep "$remote/" | sed "s/$remote\/\(.*\)/:\1 /g" | tr -d '\n')
        git Push $remote $branches
      done
    fi

    if [ "$local" == 1 ]; then
      # Remove local branches
      locals=$(echo "$local_branches" | sed 's/Origin\///g' | tr -d '\n')
      if [ -z "$locals" ]; then
        echo "No branches removed."
      else
        git branch -d $(echo "$locals" | tr -d '\n')
      fi
    fi
  fi
fi
0
Raman

Если вы работаете в Windows, вы можете использовать Windows Powershell с Out-GridView (к сожалению, в Powershell Core пока нет), чтобы получить список ветвей Nice и выбрать с помощью мыши ту ветку, которую вы хотите удалить:

git branch --merged | Out-GridView -PassThru | % { git branch -d $_.Trim() }

 enter image description here после нажатия OK Powershell передаст имена этих веток команде git branch -d и удалит их  enter image description here

0
Mariusz Pawelski
for b in $(git branch -a | grep -v "\(master\|remotes\)"); do \ 
git branch -D $b; done && git fetch -p
0
030
0
holys

Допустим, у меня есть пульт с именем upstream и Origin (стиль GitHub, мой форк - Origin, upstream - upstream).

Я не хочу удалять ЛЮБЫХ мастеров, HEAD или что-либо из вышестоящего. Я также не хочу удалять ветку разработки, так как это наша общая ветка, из которой мы создаем PR.

Список всех удаленных веток, отфильтрованных по тем, которые были объединены

git branch -r

Удалите строки из этого списка, содержащие слова, которые я знаю, в названиях ветвей, которые я не хочу удалять:

sed '/develop\|master\|HEAD\|upstream/d'

Удалите удаленное имя из ссылочного имени (Origin/somebranch становится somebranch):

sed 's/.*\///'

Используйте xargs для вызова однострочника:

xargs git Push --delete Origin

Труба все это вместе, вы получите:

git branch -r --merged | sed '/develop\|master\|HEAD\|upstream/d' |  sed 's/.*\///' | xargs git Push --delete Origin

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

Найдите ветки, которые вам больше не нужны:

git branch -ar

Скажем, вы найдете branch1, branch2 и branch3, которые хотите удалить:

git Push --delete Origin branch1 branch2 branch3
0
miigotu
$ git config --global alias.cleanup
'!git branch --merged Origin/master | egrep -v "(^\*|master|staging|dev)" | xargs git branch -d'

(разделить на несколько строк для удобства чтения)

Вызов «git cleanup» удалит локальные ветви, которые уже были объединены в Origin/master. Он пропускает master, staging и dev, потому что мы не хотим удалять их в обычных условиях.

Разбивая это, вот что он делает:

  1. git config --global alias.cleanup
    • Это создает глобальный псевдоним под названием «очистка» (для всех ваших репозиториев)
  2. ! в начале команды говорит, что мы будем использовать некоторые не-git команды как часть этого псевдонима, поэтому нам нужно на самом деле запускать команды bash здесь
  3. git branch --merged Origin/master
    • Эта команда возвращает список имен филиалов, которые уже были объединены в Origin/master
  4. egrep -v "(^\*|master|staging|dev)"
    • Это удаляет ветку master, staging и dev из списка веток, которые уже были объединены. Мы не хотим удалять эти ветви, так как они не являются функциями.
  5. xargs git branch -d
    • Это запустит команду git branch -d xxxxx для каждой из неразделенных ветвей. Это удаляет локальные ветви по одному.
0
Joe Phillips

Я использовал следующий метод для удаления объединенных локальных и удаленных веток в одном cmd. 

В моем файле bashrc есть следующее:

function rmb {
  current_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
  if [ "$current_branch" != "master" ]; then
    echo "WARNING: You are on branch $current_branch, NOT master."
  fi
  echo "Fetching merged branches..."
  git remote Prune Origin
  remote_branches=$(git branch -r --merged | grep -v '/master$' | grep -v "/$current_branch$")
  local_branches=$(git branch --merged | grep -v 'master$' | grep -v "$current_branch$")
  if [ -z "$remote_branches" ] && [ -z "$local_branches" ]; then
    echo "No existing branches have been merged into $current_branch."
  else
    echo "This will remove the following branches:"
    if [ -n "$remote_branches" ]; then
      echo "$remote_branches"
    fi
    if [ -n "$local_branches" ]; then
      echo "$local_branches"
    fi
    read -p "Continue? (y/n): " -n 1 choice
    echo
    if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then
      # Remove remote branches
      git Push Origin `git branch -r --merged | grep -v '/master$' | grep -v "/$current_branch$" | sed 's/Origin\//:/g' | tr -d '\n'`
      # Remove local branches
      git branch -d `git branch --merged | grep -v 'master$' | grep -v "$current_branch$" | sed 's/Origin\///g' | tr -d '\n'`
    else
      echo "No branches removed."
    fi
  fi
}

оригинал источник

Это не удаляет основную ветку, но удаляет объединенные локальные и удаленные ветви. Как только вы получите это в своем rc-файле, просто запустите rmb, вы увидите потерянные объединенные ветви, которые будут очищены и запросят подтверждение действия. Вы можете изменить код так, чтобы он не запрашивал подтверждения, но, вероятно, его стоит сохранить.

0
Prashant

Если вы хотите удалить локальные ветви, которые были объединены, а также удалить их пульты, вот одна строка, которую я предпочитаю:

git branch --merged | xargs -I_br -- sh -c 'git branch -d _br; git Push Origin --delete _br'
0
Ikar Pohorský