Как удалить локальные ветви отслеживания, которые больше не существуют на удаленном

770

С помощью git remote prune originя могу удалить локальные ветви, которые больше не находятся на удаленном.

Но я также хочу удалить локальные ветви, которые были созданы из этих удаленных ветвей (было бы неплохо проверить, не были ли они объединены).

Как я могу это сделать?

Alex
источник
1
Однолинейный, кросс-платформенный, не похож на спящего кота на клавиатуре: npx git-removed-branches(всухую) или npx git-removed-branches --prune(по-настоящему). У вас уже должен быть установлен node.js. Смотрите ответы ниже для деталей.
Кристиан Диаконеску

Ответы:

892

После сокращения вы можете получить список удаленных веток с помощью git branch -r. Список ветвей с их удаленной веткой отслеживания можно получить с помощью git branch -vv. Таким образом, используя эти два списка, вы можете найти удаленные ветви отслеживания, которых нет в списке удаленных.

Эта строка должна помочь (требуется bashили zshне будет работать со стандартной оболочкой Bourne):

git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d

Эта строка получает список удаленных ветвей и передает его egrepчерез стандартный ввод. И фильтрует ветви, которые имеют удаленную ветвь отслеживания (используя git branch -vvи фильтруя для тех, которые имеют origin), а затем получает первый столбец этого вывода, который будет именем ветви. Наконец, передав все имена ветвей в команду delete branch.

Поскольку он использует эту -dопцию, он не будет удалять ветви, которые не были объединены с той ветвью, в которой вы находитесь, когда выполняете эту команду.

Также помните, что git fetch --prune сначала вам нужно будет запустить , иначе git branch -rвсе равно будут видеть удаленные ветви.

Schleis
источник
12
Это сработало для меня отлично. Почему-то git fetch -pне всегда достаточно?
Стефан Хендрикс
16
К сожалению, это не работает в Git Bash на Windows. sh.exe": cannot make pipe for process substitution: Function not implemented sh.exe": egrep -v -f /dev/fd/0: No such file or directory fatal: branch name required Любые идеи?
Ludder
37
Чтобы добавить его в качестве псевдонима:alias git-remove-untracked='git fetch --prune && git branch -r | awk "{print \$1}" | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk "{print \$1}" | xargs git branch -d'
bryant1410
126
Есть ли какая-нибудь предложенная команда для будущего выпуска git, которая сделает это? Эта команда выглядит так, как будто моя кошка была на моем ноутбуке
Брон Дэвис
5
использование git branch -Dв конце команды работало лучше для нас, так как мы склонны подавлять коммиты при слиянии, что приводит к The branch x is not fully mergedошибкам при работе с -d.
Матеус Гондим
430

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

git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d

Более подробная информация .

jackocnr
источник
4
Работал отлично, я думаю! Кто-нибудь может объяснить, если этот ответ делает что-то иначе, чем принятый ответ?
Андрей
11
Незначительное улучшение: используйте, xargs -r git branch -dчтобы ничего не запускалось, если нет веток для удаления. Обратите внимание, что -rфлаг может быть доступен не везде
Джейкоб Ван
8
Поскольку grep может не совпадать из-за цветов git:git branch --merged master --no-color | grep -v '^* master$' | xargs -n1 -r git branch -d
Mike D
5
@NickRes, увидев, как вы хорошо спросили, git branch --merged masterперечисляет ветви, которые объединены в master, затем средняя часть grep исключает самого master (мы не хотим удалять master!), А последняя часть xargs выполняется git branch -d(delete branch) на каждом из результаты. Или вы можете просто прочитать ссылку Подробнее, приведенную в ответе;)
jackocnr
14
Улучшение: git branch --merged master | egrep -v '^\s*\*?\s*master$' | xargs git branch -d. Выход из git v2.10.1 будет отображать «* master», когда мастер извлечен. Я избавляюсь от мастера как со звездочкой, так и без нее.
Эстебан
162

Среди информации, представленной git help fetch, есть этот маленький пункт:

 -p, --prune
        After fetching, remove any remote-tracking branches which no longer exist on the remote.

Так что, возможно, git fetch -p это то что вы ищете?

РЕДАКТИРОВАТЬ: Хорошо, для тех, кто все еще обсуждает этот ответ через 3 года после факта, вот немного больше информации о том, почему я представил этот ответ ...

Во-первых, OP говорит, что они хотят «удалить также те локальные ветви, которые были созданы из тех удаленных ветвей [которые больше не находятся на удаленных]». Это не однозначно возможно в git. Вот пример.

Допустим, у меня есть репо на центральном сервере, и у него есть две ветви, называемые Aи B. Если я клонирую это репо в мою локальную систему, у моего клона будут вызываться локальные ссылки (пока не фактические ветки) origin/Aи origin/B. Теперь допустим, я делаю следующее:

git checkout -b A origin/A
git checkout -b Z origin/B
git checkout -b C <some hash>

Уместные факты: я по какой-то причине решил создать ветку в моем локальном репо, имя которой отличается от его источника, и у меня также есть локальный филиал, которого (пока) не существует в исходном репо.

Теперь предположим, что я удаляю как Aи Bветви на удаленный репозиторий и обновить свой локальный репозиторий ( git fetchв той или иной форме), что вызывает мои местные рефов origin/Aи origin/Bисчезнуть. Теперь, мой местный репо имеет три ветви еще, A, Z, и C. Ни у одного из них нет соответствующей ветки на удаленном репо. Два из них были «созданы из ... удаленных веток», но даже если я знаю, что когда-то была ветвь с именем Bисточника, у меня нет возможности узнать, что Zбыло создано изBпотому что он был переименован в процессе, вероятно, по уважительной причине. Таким образом, на самом деле, без какого-либо внешнего метаданных происхождения ветви записи процесса или человека, который знает историю, невозможно определить, какая из трех ветвей, если таковая имеется, предназначена для удаления ОП. Без какой-либо внешней информации, gitкоторая не поддерживается автоматически для вас,git fetch -p она настолько близка, насколько вы можете ее получить, и любой автоматический метод буквальной попытки запроса того, что запросил OP, рискует либо удалить слишком много веток, либо пропустить часть, которую OP иначе не получил бы. хочу удалить.

Существуют и другие сценарии, например, если я создаю три отдельные ветви origin/Aдля проверки трех разных подходов к чему-либо, а затем origin/Aухожу. Теперь у меня есть три ветви, которые, очевидно, не могут соответствовать всем по именам, но они были созданы из origin/A, и поэтому буквальная интерпретация вопроса ОП требует удаления всех трех. Однако это может быть нежелательно, если бы вы могли найти надежный способ сопоставить их ...

twalberg
источник
108
Это не удаляет локальные ветви, только удаленные указатели на ветви
Jaap
4
Он удаляет только эти локальные ветки, которых нет в удаленном И вы никогда не проверяли их.
Ярек Якубовский
15
Вы должны прочитать вопрос более внимательно, как отмечает Яап. Люди, голосующие за этот ответ, должны также прочитать, о чем действительно вопрос.
Сорен Бойсен
4
Да, это было именно то, что я хотел сделать! @ SørenBoisen Я надеюсь, что за последние два года у вас было время пересмотреть это ваше мнение ... Если контент, размещаемый на SO, всегда должен быть связан только с тем, что иногда задают действительно запутанные ОП, мы удалили бы много информации. Пожалуйста, не позволяйте учить людей, как они могут использовать этот сайт, кроме официальных руководств, и они явно не мешают ортогональным, но полезным ответам.
Феликс Ганьон-Гренье
6
@ FélixGagnon-Grenier Вот моя проблема с этим ответом: 1) Вопрос кристально ясен, ОП явно не перепутан. 2) В этом ответе не упоминается, что он не отвечает на вопрос! 3) В вопросе уже указан способ обрезки веток удаленного отслеживания, которые больше не существуют, поэтому он добавляет нулевое значение.
Сорен Бойсен
117

Это удалит локальные ветви, для которых удаленные ветви отслеживания были удалены. (Убедитесь, что вы находитесь на masterветке!)

git checkout master
git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -d

Подробности:

  • git branch -vv отображает «ушел» для локальных веток, что удаленный был удален.

    mybranch abc1234 [origin/mybranch: gone] commit comments
    
  • -dпроверит, был ли он объединен ( -Dудалит его независимо)

    error: The branch 'mybranch' is not fully merged.
    
wisbucky
источник
16
Вы даже можете сделать команду короче сgit branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
Чиборг
4
Просто указав, что вы должны быть на мастере, прежде чем делать это, потому что git branch -dсравнивает ветви с HEAD.
Стив Беннетт
Отлично! Я искал и искал это. Хотелось бы, чтобы я увидел твой ответ, прежде чем я сам понял его. Это спасло бы меня несколько минут. Вот мой другой ответ: stackoverflow.com/questions/15661853/…
Карл Уилбур
1
Я получил похожий псевдоним git, использовал cut, так как awk по какой-то причине не работал:prunelocal = !sh -c \"git checkout -q master && git fetch -q --prune && git branch -vv | git grep ': gone]' | cut -d' ' -f3 | xargs git branch -d\"
Zitrax
3
О, чувак ... ты не должен обновлять свой ответ, чтобы сказать людям, что они должны быть мастерами. Просто сделал это из другой ветки. @ stevebennet2 спасибо за содержательный комментарий
GrayedFox
54

Можно настроить Git для автоматического удаления ссылок на удаленные удаленные ветви при получении:

git config --global fetch.prune true

При вызове git fetchили git pullпосле этого ссылки на удаленные удаленные ветви удаляются автоматически.

wedesoft
источник
5
это не удаляет локальные ветки, просто ссылки на них, верно?
Клинт Иствуд
@ClintEastwood Удаляет только ссылки на удаленные ветви. Вы можете перечислить ссылки на удаленные ветки, используя git branch -r.
wedesoft
52

Есть отличный пакет NPM, который делает это для вас (и он должен работать кроссплатформенно).

Установите его с помощью: npm install -g git-removed-branches

А потом git removed-branchesпокажет вам все устаревшие локальные ветки и git removed-branches --pruneдействительно их удалит.

Больше информации здесь.

tzachs
источник
1
Это должно действительно иметь больше голосов. Спасибо за облегчение жизни, независимо от платформы.
Шифрование
Удобное маленькое расширение. Устанавливается и отлично работает в Windows 10. Небольшое примечание: он считает не слитые ветви доступными для удаления (ошибка при запуске --prune, хотя вызывался branch -d) .. однако, они не обозначены как таковые в исходной список показан.
user2864740
1
Это мой любимый ответ. npx git-removed-branchesработает как сон.
Дразисил
да! Это должно иметь больше голосов! такое простое и интуитивно понятное решение для новичка
Cli
Было бы полезно дать обзор того, что делает инструмент с точки зрения git.
ryanwebjackson
41

Windows Solution

Для Microsoft Windows Powershell:

git checkout master; git remote update origin --prune; git branch -vv | Select-String -Pattern ": gone]" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}

Explaination

git checkout master переключается на главную ветку

git remote update origin --prune чернослив удаленные ветви

git branch -vvполучает подробный вывод всех ветвей ( ссылка на git )

Select-String -Pattern ": gone]" получает только записи, где они были удалены из удаленного.

% { $_.toString().Split(" ")[0]} получить название филиала

% {git branch -d $_} удаляет ветку

chris31389
источник
Хороший пример. В качестве альтернативы используйте git remote prune originтакже select-string, которая не соответствует последней версии git. Подумайте об использованииConvertFrom-String -TemplateContent
Берни Уайт
3
Похоже, что последняя версия git добавляет некоторые пробелы, поэтому Split не работает, чтобы получить имя ветви. Сделайте .toString (). Trim (). Split (""), и это будет
Крис Хайнс
Вот мое:git checkout master; git pull; git remote prune origin; git branch --merged | select-string -notmatch "master" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}
Омциг
@Omzig Что это делает по-другому? Можете ли вы дать объяснение>
chris31389
@ chris31389, у меня есть тяга, чтобы получить все, что мне не хватает, от мастера, и я изменил ветку на --merged, а не master, я хочу убедиться, что я только удаляю --merged ветви. Это просто заставляет меня чувствовать себя лучше;)
Omzig
27

В нем будут перечислены локальные ветви, удаленная ветвь отслеживания которых удалена

$ git remote prune origin --dry-run

Если вы хотите отменить ссылку на эти локальные ветви из местных, которые не отслеживаются

$ git remote prune origin
027
источник
19
Это не отвечает на вопрос, это то, что ОП уже знал.
Кен Уильямс
2
Я также согласен, но при поиске «Как удалить локальные ветви отслеживания, которые больше не существуют на удаленном компьютере», это верхняя ссылка, и этот ответ совпадает с заголовком (не если вы прочитали полное описание в вопросе), что является причиной для голосования :)
027
Это не удаляет местные филиалы. Все еще там после запуска этого
Xin
@Xin попробуйте запустить команду без аргумента --dry-run, так как она фактически не выполнит команду, но покажет вам, что она изменит.
Торстен Оджаперв
19

Как отмечает @tzacks ... для этого есть пакет npm. Просто делать:

npx git-removed-branches --prune

(Я бы прокомментировал но репутацию не хватило)

johnshew
источник
1
Великолепный. Никаких хлопот. Рад, что это был полный ответ!
Дэн Рэйсон
1
Это должно быть наверху. Работает в Windows тоже.
Tomtastico
14

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

git branch --merged | ? {$_[0] -ne '*'} | % {$_.trim()} | % {git branch -d $_}

объяснение

  • Перечисляет текущую ветку и ветви, которые были объединены в нее
  • Отфильтровывает текущую ветку
  • Очищает все начальные или конечные пробелы из gitвыходных данных для каждого оставшегося имени ветви
  • Удаляет объединенные локальные филиалы

git branch --mergedСначала стоит запустить сам по себе, просто чтобы убедиться, что он только удалит то, что вы ожидаете.

(Портировано / автоматизировано с http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositories/ .)

комар
источник
10

Еще короче и безопаснее однострочник:

git branch -d $(git branch --merged | cut -c 3- | grep -v master)

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

FelikZ
источник
3
это также удалит вашего «хозяина»?
dcsan
2
Если вы в настоящее время зарегистрировались в мастер, то нет, в противном случае да
FelikZ
1
Чтобы пропустить мастер, вы можете просто git branch -d $(git branch --merged | cut -c 3- | grep -v master)
направить
Это небезопасно, и кто-то в будущем неосознанно удалит свою основную ветку
jasonseminara
1
@jasonseminara #dcsan Я обновил фрагмент кода, поэтому он пропускает основную ветку. #mozillalives спасибо
FelikZ
9

Я хотел что-то, что очистило бы все локальные ветви, которые отслеживали удаленную ветвь, там origin, где удаленная ветвь была удалена ( gone). Я не хотел удалять локальные ветви, которые никогда не были настроены для отслеживания удаленной ветви (т.е. мои локальные ветви разработки). Кроме того, я хотел простой однострочник, который просто использует git, или другие простые инструменты CLI, вместо того, чтобы писать собственные сценарии. В итоге я использовал немного grepи, awkчтобы сделать эту простую команду, а затем добавил ее как псевдоним в моем ~/.gitconfig.

[alias]
  prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -D

Вот git config --global ...команда для простого добавления этого как git prune-branches:

git config --global alias.prune-branches '!git remote prune origin && git branch -vv | grep '"'"': gone]'"'"' | awk '"'"'{print $1}'"'"' | xargs -r git branch -d'

ПРИМЕЧАНИЕ: использование -Dфлага git branchможет быть очень опасным. Итак, в приведенной выше команде config я использую -dпараметр git branchвместо -D; Я использую -Dв моей реальной конфигурации. Я использую, -Dпотому что я не хочу, чтобы Гит жаловался на незакрепленные ветви, я просто хочу, чтобы они ушли. Вы можете также хотеть эту функциональность. Если это так, просто используйте -Dвместо -dв конце этой команды конфигурации.

Карл Уилбур
источник
8

Чтобы удалить удаленные ветви:

$git remote prune origin

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

$git branch -D $(git branch --merged)
Aniket
источник
Работает для меня. Спасибо.
AndroidRuntimeException
2
(git branch --merged) также возвращает 'master' для меня. И другие ветви, которые не были удалены на удаленном компьютере.
Том Г
8
Это удалило мою главную ветку.
Грег
@ Грег Только на местном уровне, правда?
GC_
5

Кажется, что не существует безопасной однострочной строки, слишком много крайних случаев (например, ветвь с именем master в качестве имени и т. Д.). Безопаснее всего эти шаги:

  1. git branch -vv | grep 'gone]' > stale_branches.txt
  2. просмотреть файл и удалить строки для веток, которые вы хотите сохранить (например, ветку master!); вам не нужно редактировать содержимое любой строки
  3. awk '{print $1}' stale_branches.txt | xargs git branch -d
Оливер
источник
5

Основываясь на ответах выше, я использую этот более короткий вкладыш:

git remote prune origin | awk 'BEGIN{FS="origin/"};/pruned/{print $2}' | xargs -r git branch -d

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

git branch -vv | awk '/^ .*gone/{print $1}' | xargs -r git branch -d
hidralisk
источник
1
Не работает , если ваши имена ветви имеют /в них
theicfire
4

не знаю, как это сделать сразу, но git git branch -d <branchname>удалит только локальную ветку, если она полностью объединена. Обратите внимание на строчную букву d.

git branch -D <branchname> (обратите внимание на заглавную D) удалит местное отделение независимо от его объединенного статуса.

NHDaly
источник
В Windows другие ответы у меня не работали. Использовать этот ответ с простым ключом -D (хотя ветка уже была «удалена»).
Можем ли мы сделать это для всех филиалов одновременно?
Теоман Шипахи
3

Вы можете использовать эту команду:

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

Git Clean: удаление уже слитых веток, включая разделение команд

sendon1982
источник
Вам не нужно отфильтровывать какие-либо ветви (бывший мастер). Если он «объединен», то это просто означает, что он удалит вашу локальную копию, но «git checkout dev» создаст локальную ветку с удаленного компьютера, если она еще не существует
csga5000
Но локальный список филиалов все еще там, даже если они объединены. Эта команда должна удалить эти ветви, которые были удалены с удаленного.
sendon1982
Звездочка в начале означает текущую ветку, когда вы запускаете эту команду в другой ветке, она не будет работать хорошо
OzzyCzech
2

Основываясь на ответах выше, я пришел с этим решением в одну строку:

git remote prune origin; git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d
gagarwal
источник
2

Используя вариант ответа @ wisbucky, я добавил в качестве псевдонима следующее ~/.gitconfig:

pruneitgood = "!f() { \
    git remote prune origin; \
    git branch -vv | perl -nae 'system(qw(git branch -d), $F[0]) if $F[3] eq q{gone]}'; \
}; f"

При этом простой git pruneitgoodочистит как локальные, так и удаленные ветви, которые больше не нужны после слияний.

Кен Уильямс
источник
2

Версия Powershell git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d

git branch --merged master | %{ if($_ -notmatch '\*.*master'){ git branch -d "$($_.Trim())" }}

Это удалит все локальные ветви, которые были объединены в master, пока вы находитесь в master ветке .

git checkout master переключить.

Кевин Джордж
источник
1

Вариант Шлейса у меня не работает (Ubuntu 12.04), поэтому позвольте мне предложить мои (ясные и блестящие :) варианты:

Вариант 1 (я бы предпочел этот вариант):

git for-each-ref --format='%(refname:short) %(upstream)' refs/heads/ | awk '$2 !~/^refs\/remotes/' | xargs git branch -D 

Вариант 2:

а. Пробный прогон:

comm -23 <( git branch | grep -v "/" | grep -v "*" | sort ) <( git br -r | awk -F '/' '{print $2}' | sort ) | awk '{print "git branch -D " $1}'

б. Удалить ветки:

comm -23 <( git branch | grep -v "/" | grep -v "*" | sort ) <( git br -r | awk -F '/' '{print $2}' | sort ) | xargs git branch -D
daniilyar
источник
1

Ниже приводится адаптация ответа @ wisbucky для пользователей Windows:

for /f "tokens=1" %i in ('git branch -vv ^| findstr ": gone]"') DO git branch %i -d

Я использую Posh-Git и, к сожалению, PS не любит голых for, поэтому я создал простой командный скрипт с именем PruneOrphanBranches.cmd:

@ECHO OFF
for /f "tokens=1" %%i in ('git branch -vv ^| findstr ": gone]"') DO CALL :ProcessBranch %%i %1

GOTO :EOF

:ProcessBranch
IF /I "%2%"=="-d" (
    git branch %1 %2
) ELSE (
    CALL :OutputMessage %1
)
GOTO :EOF

:OutputMessage
ECHO Will delete branch [%1] 
GOTO :EOF

:EOF

Вызовите его без параметров, чтобы увидеть список, а затем вызовите его с помощью «-d» для фактического удаления или «-D» для любых ветвей, которые не полностью объединены, но которые вы все равно хотите удалить.

Сэм С
источник
Это не сработало для меня, почему-то :или : (с пробелом) findstrзаставляло его каждый раз совпадать - я почти удалил master. Тем не менее, использование регулярных выражений работало нормально:git branch -vv ^| findstr /R " \[origin/[0-9]+: gone\] "
Джош
1

Попробуйте это в git bash, чтобы получить и удалить ссылки на удаленные ветви, а затем удалить локальные ветви, которые отслеживали удаленные ветви:

git fetch -p && git branch -d `git branch -vv | grep ': gone]' | awk '{print $1}' | xargs`

Не забудьте сначала извлечь ветку, которая не будет удалена, чтобы не блокировать удаление ветви.

Гильермо Гутьеррес
источник
0

Я превратил принятый ответ в надежный сценарий. Вы найдете это в моем репозитории git-extensions .

$ git-prune --help
Remove old local branches that do not exist in <remote> any more.
With --test, only print which local branches would be deleted.
Usage: git-prune [-t|--test|-f|--force] <remote>
Инго Каркат
источник
0

Я зашел на эту страницу в поисках ответа на вопрос «как удалить локально извлеченные ветки, которые больше не имеют ветки верхнего уровня»

Мне также было все равно, была ли локальная ветвь объединена или нет, поскольку git branch -dпередача по сети просто предупредит, а не удалит незакрытые локальные ветки.

git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3 | egrep -v -f /dev/fd/0 <(git branch -a | grep -v origin) | grep branch_prefix_that_I_care_about | xargs git branch -d

# translation
# git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3
## this finds all remote branch names minus the "remote/origin/" part
#
# <(git branch -a | grep -v origin)
## this finds all local branch names and redirects it into the previous command
#
# egrep -v -f /dev/fd/0 STUFF
## this is doing some weird magic that I'm grokking as "take the set difference from whatever was piped in"
#
#
# overall translation: (STUFF TO CONSIDER) | egrep magic <(STUFF TO REMOVE FROM CONSIDERATION) | do cool things with resulting stuff
Мередит
источник
0

В Powershell :

git branch -D (git branch --merged |% { $_.trim() } )
Рауль Салинас-Монтеагудо
источник
0

Вот мое решение:

git fetch -p
git branch -vv | grep ": gone" | awk '{print $1}' | xargs git branch -d
  • -p - удалить все ссылки на удаленное отслеживание, которые больше не существуют на пульте. Поэтому первый шаг удалит ссылки на удаленные ветки.

  • -vv предназначен для показа sha1 и фиксации строки темы для каждой головы, а также связи с вышестоящей веткой (если есть). На втором шаге вы получите все локальные ветки, а команда grep отфильтрует удаленные ветки.

Neeraj Bansal
источник
Еще меньше (как описано в другом комментарии)git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
mrroboaat
-2

Удалить любую ветку, которая не актуальна с мастером

git co master && git branch | sed s/\*/\ / | xargs git branch -d 2> /dev/null
Джейсон Уолдрип
источник
-3

Я уверен, что git remote prune originэто то, что вы хотите.

Вы можете запустить его так, git remote prune origin --dry-runчтобы увидеть, что он будет делать без каких-либо изменений.

Джейсон Антман
источник
12
Это на самом деле не удаляет саму локальную ветвь.
Тайтай
-16

Используя графический интерфейс? Ручная процедура, но быстрая и простая.

$ git gui

Выберите «Ветвь -> Удалить». Вы можете выбрать несколько ветвей с помощью Ctrl-клика (окна) и удалить все из них.

Педро Баллестерос
источник
Забавно, насколько негативно воспринимается этот ответ. Абсолютно правильный подход IMO, если вам нравится GUI.
serraosays