С помощью git remote prune origin
я могу удалить локальные ветви, которые больше не находятся на удаленном.
Но я также хочу удалить локальные ветви, которые были созданы из этих удаленных ветвей (было бы неплохо проверить, не были ли они объединены).
Как я могу это сделать?
npx git-removed-branches
(всухую) илиnpx git-removed-branches --prune
(по-настоящему). У вас уже должен быть установлен node.js. Смотрите ответы ниже для деталей.Ответы:
После сокращения вы можете получить список удаленных веток с помощью
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
все равно будут видеть удаленные ветви.источник
git fetch -p
не всегда достаточно?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
Любые идеи?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'
git branch -D
в конце команды работало лучше для нас, так как мы склонны подавлять коммиты при слиянии, что приводит кThe branch x is not fully merged
ошибкам при работе с-d
.Если вы хотите удалить все локальные ветви, которые уже объединены в master, вы можете использовать следующую команду:
Более подробная информация .
источник
xargs -r git branch -d
чтобы ничего не запускалось, если нет веток для удаления. Обратите внимание, что-r
флаг может быть доступен не вездеgit branch --merged master --no-color | grep -v '^* master$' | xargs -n1 -r git branch -d
git branch --merged master
перечисляет ветви, которые объединены в master, затем средняя часть grep исключает самого master (мы не хотим удалять master!), А последняя часть xargs выполняетсяgit branch -d
(delete branch) на каждом из результаты. Или вы можете просто прочитать ссылку Подробнее, приведенную в ответе;)git branch --merged master | egrep -v '^\s*\*?\s*master$' | xargs git branch -d
. Выход из git v2.10.1 будет отображать «* master», когда мастер извлечен. Я избавляюсь от мастера как со звездочкой, так и без нее.Среди информации, представленной
git help fetch
, есть этот маленький пункт:Так что, возможно,
git fetch -p
это то что вы ищете?РЕДАКТИРОВАТЬ: Хорошо, для тех, кто все еще обсуждает этот ответ через 3 года после факта, вот немного больше информации о том, почему я представил этот ответ ...
Во-первых, OP говорит, что они хотят «удалить также те локальные ветви, которые были созданы из тех удаленных ветвей [которые больше не находятся на удаленных]». Это не однозначно возможно в
git
. Вот пример.Допустим, у меня есть репо на центральном сервере, и у него есть две ветви, называемые
A
иB
. Если я клонирую это репо в мою локальную систему, у моего клона будут вызываться локальные ссылки (пока не фактические ветки)origin/A
иorigin/B
. Теперь допустим, я делаю следующее:Уместные факты: я по какой-то причине решил создать ветку в моем локальном репо, имя которой отличается от его источника, и у меня также есть локальный филиал, которого (пока) не существует в исходном репо.
Теперь предположим, что я удаляю как
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
, и поэтому буквальная интерпретация вопроса ОП требует удаления всех трех. Однако это может быть нежелательно, если бы вы могли найти надежный способ сопоставить их ...источник
Это удалит локальные ветви, для которых удаленные ветви отслеживания были удалены. (Убедитесь, что вы находитесь на
master
ветке!)Подробности:
git branch -vv
отображает «ушел» для локальных веток, что удаленный был удален.-d
проверит, был ли он объединен (-D
удалит его независимо)источник
git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
git branch -d
сравнивает ветви сHEAD
.prunelocal = !sh -c \"git checkout -q master && git fetch -q --prune && git branch -vv | git grep ': gone]' | cut -d' ' -f3 | xargs git branch -d\"
Можно настроить Git для автоматического удаления ссылок на удаленные удаленные ветви при получении:
При вызове
git fetch
илиgit pull
после этого ссылки на удаленные удаленные ветви удаляются автоматически.источник
git branch -r
.Есть отличный пакет NPM, который делает это для вас (и он должен работать кроссплатформенно).
Установите его с помощью:
npm install -g git-removed-branches
А потом
git removed-branches
покажет вам все устаревшие локальные ветки иgit removed-branches --prune
действительно их удалит.Больше информации здесь.
источник
npx git-removed-branches
работает как сон.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 $_}
удаляет веткуисточник
git remote prune origin
также select-string, которая не соответствует последней версии git. Подумайте об использованииConvertFrom-String -TemplateContent
git checkout master; git pull; git remote prune origin; git branch --merged | select-string -notmatch "master" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}
В нем будут перечислены локальные ветви, удаленная ветвь отслеживания которых удалена
Если вы хотите отменить ссылку на эти локальные ветви из местных, которые не отслеживаются
источник
Как отмечает @tzacks ... для этого есть пакет npm. Просто делать:
(Я бы прокомментировал но репутацию не хватило)
источник
Если вы используете Windows и Powershell, вы можете использовать следующее для удаления всех локальных веток, которые были объединены с веткой, извлеченной в данный момент:
объяснение
git
выходных данных для каждого оставшегося имени ветвиgit branch --merged
Сначала стоит запустить сам по себе, просто чтобы убедиться, что он только удалит то, что вы ожидаете.(Портировано / автоматизировано с http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositories/ .)
источник
Еще короче и безопаснее однострочник:
Обязательно извлекайте ветку, которая еще не объединена, прежде чем запускать ее. Потому что вы не можете удалить ветку, в которой вы сейчас зарегистрированы.
источник
git branch -d $(git branch --merged | cut -c 3- | grep -v master)
Я хотел что-то, что очистило бы все локальные ветви, которые отслеживали удаленную ветвь, там
origin
, где удаленная ветвь была удалена (gone
). Я не хотел удалять локальные ветви, которые никогда не были настроены для отслеживания удаленной ветви (т.е. мои локальные ветви разработки). Кроме того, я хотел простой однострочник, который просто используетgit
, или другие простые инструменты CLI, вместо того, чтобы писать собственные сценарии. В итоге я использовал немногоgrep
и,awk
чтобы сделать эту простую команду, а затем добавил ее как псевдоним в моем~/.gitconfig
.Вот
git config --global ...
команда для простого добавления этого какgit prune-branches
:ПРИМЕЧАНИЕ: использование
-D
флагаgit branch
может быть очень опасным. Итак, в приведенной выше команде config я использую-d
параметрgit branch
вместо-D
; Я использую-D
в моей реальной конфигурации. Я использую,-D
потому что я не хочу, чтобы Гит жаловался на незакрепленные ветви, я просто хочу, чтобы они ушли. Вы можете также хотеть эту функциональность. Если это так, просто используйте-D
вместо-d
в конце этой команды конфигурации.источник
Чтобы удалить удаленные ветви:
Чтобы удалить локальные ветви, которые уже объединены:
источник
Кажется, что не существует безопасной однострочной строки, слишком много крайних случаев (например, ветвь с именем master в качестве имени и т. Д.). Безопаснее всего эти шаги:
git branch -vv | grep 'gone]' > stale_branches.txt
awk '{print $1}' stale_branches.txt | xargs git branch -d
источник
Основываясь на ответах выше, я использую этот более короткий вкладыш:
Кроме того, если у вас уже есть обрезанные ветки, и это приведет к их очистке:
источник
/
в нихне знаю, как это сделать сразу, но git
git branch -d <branchname>
удалит только локальную ветку, если она полностью объединена. Обратите внимание на строчную букву d.git branch -D <branchname>
(обратите внимание на заглавную D) удалит местное отделение независимо от его объединенного статуса.источник
Вы можете использовать эту команду:
Git Clean: удаление уже слитых веток, включая разделение команд
источник
Основываясь на ответах выше, я пришел с этим решением в одну строку:
источник
Используя вариант ответа @ wisbucky, я добавил в качестве псевдонима следующее
~/.gitconfig
:При этом простой
git pruneitgood
очистит как локальные, так и удаленные ветви, которые больше не нужны после слияний.источник
Версия 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
переключить.источник
Вариант Шлейса у меня не работает (Ubuntu 12.04), поэтому позвольте мне предложить мои (ясные и блестящие :) варианты:
Вариант 1 (я бы предпочел этот вариант):
Вариант 2:
а. Пробный прогон:
б. Удалить ветки:
источник
Ниже приводится адаптация ответа @ wisbucky для пользователей Windows:
for /f "tokens=1" %i in ('git branch -vv ^| findstr ": gone]"') DO git branch %i -d
Я использую Posh-Git и, к сожалению, PS не любит голых
for
, поэтому я создал простой командный скрипт с именем PruneOrphanBranches.cmd:Вызовите его без параметров, чтобы увидеть список, а затем вызовите его с помощью «-d» для фактического удаления или «-D» для любых ветвей, которые не полностью объединены, но которые вы все равно хотите удалить.
источник
:
или:
(с пробелом)findstr
заставляло его каждый раз совпадать - я почти удалил master. Тем не менее, использование регулярных выражений работало нормально:git branch -vv ^| findstr /R " \[origin/[0-9]+: gone\] "
Попробуйте это в git bash, чтобы получить и удалить ссылки на удаленные ветви, а затем удалить локальные ветви, которые отслеживали удаленные ветви:
Не забудьте сначала извлечь ветку, которая не будет удалена, чтобы не блокировать удаление ветви.
источник
Я превратил принятый ответ в надежный сценарий. Вы найдете это в моем репозитории git-extensions .
источник
Я зашел на эту страницу в поисках ответа на вопрос «как удалить локально извлеченные ветки, которые больше не имеют ветки верхнего уровня»
Мне также было все равно, была ли локальная ветвь объединена или нет, поскольку
git branch -d
передача по сети просто предупредит, а не удалит незакрытые локальные ветки.источник
В Powershell :
источник
Вот мое решение:
-p - удалить все ссылки на удаленное отслеживание, которые больше не существуют на пульте. Поэтому первый шаг удалит ссылки на удаленные ветки.
-vv предназначен для показа sha1 и фиксации строки темы для каждой головы, а также связи с вышестоящей веткой (если есть). На втором шаге вы получите все локальные ветки, а команда grep отфильтрует удаленные ветки.
источник
git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
Удалить любую ветку, которая не актуальна с мастером
источник
Я уверен, что
git remote prune origin
это то, что вы хотите.Вы можете запустить его так,
git remote prune origin --dry-run
чтобы увидеть, что он будет делать без каких-либо изменений.источник
Используя графический интерфейс? Ручная процедура, но быстрая и простая.
Выберите «Ветвь -> Удалить». Вы можете выбрать несколько ветвей с помощью Ctrl-клика (окна) и удалить все из них.
источник