Я следую процессу разработки, где я создаю новую локальную ветвь для каждой новой функции или истории. По окончании я объединяю ветку с мастером и затем нажимаю.
Что происходит со временем из-за сочетания лени или забывчивости, так это то, что я получаю большой список локальных ветвей, некоторые из которых (например, шипы), возможно, не были объединены.
Я знаю, как составить список всех моих локальных веток, и я знаю, как удалить одну ветку, но мне было интересно, есть ли команда git, которая позволяет мне удалять все мои локальные ветви?
Ниже приведен вывод git branch --merged
команды.
user@machine:~/projects/application[master]$ git branch --merged
STORY-123-Short-Description
STORY-456-Another-Description
STORY-789-Blah-Blah
* master
Все попытки удалить ветки, перечисленные с grep -v \*
(согласно ответам ниже), приводят к ошибкам:
error: branch 'STORY-123-Short-Description' not found.
error: branch 'STORY-456-Another-Description' not found.
error: branch 'STORY-789-Blah-Blah' not found.
Я использую:
git 1.7.4.1
ubuntu 10.04
GNU bash, версия 4.1.5 (1) -релиз
GNU grep 2.5.4
Ответы:
Подкоманда git branch -d может удалить более одной ветви. Итак, упростим ответ @ sblom, но добавим критический xargs:
или, дополнительно упрощенный до:
Важно отметить, что, как отмечает @AndrewC, использование
git branch
сценариев не рекомендуется. Чтобы избежать этого, используйте что-то вроде:Осторожно при удалении!
источник
error:branch 'STORY-123-Short-Description' not found.
для каждой из перечисленных веток.error:branch 'STORY-123-Short-Description' not found.
об ошибке, возможно, это связано с настройками цвета git. Это сработало для меня (обратите внимание на--no-color
вариант):git branch --no-color --merged | grep -v \* | xargs git branch -D
Я нашел более хороший способ в комментарии по этому вопросу на GitHub :
git branch --merged master --no-color | grep -v master | grep -v stable | xargs git branch -d
редактировать: добавлена опция без цвета и исключение стабильной ветви (добавьте другие ветви по мере необходимости в вашем случае)
источник
error: branch 'my-branch-name' not found.
для каждой ветви. Использование git версии 1.8.3.4 (Apple Git-47). Есть идеи почему?git for-each-ref --format '%(refname:short)' refs/heads/ | grep -v master | xargs git branch -d
Анализ выходных данных
git branch
не рекомендуется и не является хорошим ответом для будущих читателей о переполнении стека.git branch
это то, что известно как команда фарфора. Команды фарфора не предназначены для синтаксического анализа, и выходные данные могут меняться в разных версиях Git.git branch
таким образом, который затрудняет анализ (например, цветность). Если пользователь установил,color.branch
вы получите управляющие коды в выводе, это приведет к тому,error: branch 'foo' not found.
что вы попытаетесь передать его в другую команду. Вы можете обойти это с--no-color
флагомgit branch
, но кто знает, какие другие пользовательские конфигурации могут сломать вещи.git branch
может делать другие вещи, которые надоедают анализировать, например ставить звездочку рядом с проверенной веткойСопровождающим мерзавец это сказать о сценарии вокруг
git branch
выходаОтветы, которые предполагают ручное редактирование файлов в
.git
каталоге (например, .git / refs /head), также проблематичны (вместо этого ссылки могут быть в .git / pack-refs, или Git может изменить свою внутреннюю разметку в будущем).Git предоставляет
for-each-ref
команду для получения списка ветвей.Git 2.7.X представит эту
--merged
опцию, чтобы вы могли сделать что-то вроде ниже, чтобы найти и удалить все ветви, объединенные вHEAD
Git 2.6.X и старше, вам нужно будет перечислить все локальные ветви и затем проверить их по отдельности, чтобы увидеть, были ли они объединены (что будет значительно медленнее и немного сложнее).
источник
git branch --no-color 2>/dev/null
?git branch
заключается в команде фарфора, и нет никакой гарантии, что вывод не изменится в какой-то будущей версии git.Более простой способ удалить все ветви, но оставить другие, такие как «разработка» и «мастер», заключается в следующем:
очень полезно !
источник
Чтобы удалить все ветви, кроме той, которую вы в данный момент извлекли:
Я бы рекомендовал изменения
git branch -D $b
кecho $b
первым несколько раз , чтобы убедиться , что она удаляет ветвь , которые вы собираетесь.источник
error:branch 'a_branch_name' not found.
что вы пытаетесь сделать, и я играл с этой командой, но по какой-то причине git, похоже, не нравятся предоставленные имена веток ...git branch --merged
STORY-123-Short-Description
git branch --merged
, вы получаете список с одним из них на каждой строке?error:branch 'a_branch_name' not found.
? Или он жалуется на одно из названий веток из вашегоgit branch
вывода выше?Приведенная ниже команда удалит все локальные ветви, кроме главной ветви.
Вышеуказанная команда
источник
git branch | grep -v "master" | xargs git branch -d
сначала, чтобы я не удалял неразбитые ветви, просто чтобы быть в безопасности. Но хороший ответ!,@(git branch | Select-String -Pattern "[^(*?)\s? master]") | ForEach-Object{$_.Line.Trim()} | %{git branch -D $_}
Просто замечание, я бы обновился до git 1.7.10. Вы можете получить ответы здесь, которые не будут работать на вашей версии. Я предполагаю, что вы должны префикс имени ветви с
refs/heads/
.ВНИМАНИЕ, переходите к следующему, только если вы сделали копию своей рабочей папки и каталога .git.
Иногда я просто удаляю ветки, которые мне не нужны
.git/refs/heads
. Все эти ветви представляют собой текстовые файлы, содержащие 40 символов ша-1 коммита, на который они указывают. У вас будет посторонняя информация,.git/config
если для какого-либо из них было настроено специальное отслеживание. Вы также можете удалить эти записи вручную.источник
Попробуйте следующую команду оболочки:
Объяснение:
git branch | grep -v "master"
командыxargs
командыxargs git branch -D
источник
Чтобы удалить все локальные ветки в Linux, кроме той, на которой вы находитесь
источник
Мне было проще использовать текстовый редактор и оболочку.
git checkout <TAB>
в оболочке. Покажут все местные филиалы.git branch -D <PASTE THE BRANCHES NAMES HERE>
.Вот и все.
источник
У меня была похожая ситуация, и недавно я нашел следующую команду полезной.
Если вы хотите сохранить несколько веток, то
надеюсь, это поможет кому-то.
источник
git branch -D `git branch | awk '{ if ($0 !~ /master/) printf "%s", $0 }'`
самом деле, я думаю, что они у вас были изначально, но они потерялись в SO форматировании.Из командной строки Windows удалите все, кроме текущей извлеченной ветви, используя:
источник
Если вам не нужен сам Git, вы также можете удалить заголовки в .git / refs /head вручную или программно. Следующее должно работать с минимальной настройкой под Bash:
Это удалит все локальные ветви, кроме вашей основной ветви. Так как ваши ветки upstream хранятся в .git / refs / remotes , они останутся нетронутыми.
Если вы не используете Bash или хотите использовать сразу несколько Git-репозиториев, вы можете сделать что-то похожее с GNU find:
Решение find, вероятно, более переносимо, но обрезка путей и имен файлов сложна и потенциально более подвержена ошибкам.
источник
Ни один из ответов полностью не удовлетворил мои потребности, так что здесь мы идем:
Это удалит все локальные ветви, которые объединены и начинаются с
feature/
,bugfix/
илиhotfix/
. После этого пульт дистанционного управленияorigin
(возможно, вам придется ввести пароль).Работает на Git 1.9.5.
источник
Основываясь на комбинации нескольких ответов здесь - если вы хотите сохранить все ветки, которые существуют на удаленном компьютере, но удалить остальные , следующий oneliner сделает свое дело:
источник
Хотя это не решение для командной строки, я удивлен, что Git GUI еще не предлагался.
Я использую командную строку в 99% случаев, но в этом случае это либо слишком медленно (отсюда исходный вопрос), либо вы не знаете, что собираетесь удалить, прибегая к длительным, но умным манипуляциям с оболочкой.
Пользовательский интерфейс решает эту проблему, поскольку вы можете быстро отметить ветви, которые хотите удалить, и получать напоминания о тех, которые хотите сохранить, без необходимости вводить команду для каждой ветви.
В пользовательском интерфейсе перейдите в « Ветвь» -> «Удалить» и нажмите Ctrl + клик по веткам, которые вы хотите удалить, чтобы они были выделены. Если вы хотите убедиться, что они объединены в ветвь (например,
dev
), в разделе « Только удаление», если «Объединить в» установите « Локальная ветвь» вdev
. В противном случае установите значение Всегда, чтобы игнорировать эту проверку.источник
Для powershell это будет работать:
источник
Следующий скрипт удаляет ветки. Используйте его и модифицируйте на свой страх и риск и т. Д.
Основываясь на других ответах в этом вопросе, я написал для себя быстрый скрипт bash. Я назвал его «gitbd» (git branch -D), но если вы используете его, вы можете переименовать его так, как вам хочется.
Он предложит удалить любые ветви, которые соответствуют аргументу шаблона, если они передаются, или все локальные ветви при вызове без аргументов. Это также даст вам шаг подтверждения, так как, вы знаете, мы удаляем вещи, так что это хорошо.
Это немного глупо - если нет веток, соответствующих шаблону, он не осознает этого.
Пример выходного прогона:
источник
Я написал сценарий оболочки, чтобы удалить все локальные ветви, кроме
develop
источник
Над ответами работает отлично. Вот другой подход, когда у нас много веток в локальном репо, и нам нужно удалить много веток, кроме тех, которые лежат на локальной машине.
Сначала
git branch
перечислим все местные филиалы.Чтобы преобразовать столбец с именами ветвей в одну строку в файле, запустите команду unix.
git branch > sample.txt
Это сохранит его в файле sample.txt . И беги
awk 'BEGIN { ORS = " " } { print }' sample.txt
команду в оболочке. Это преобразует столбец в строку и копирует список названий ветвей в одну строку.
А потом беги
git branch -D branch_name(s)
.Это удалит все перечисленные ветви, присутствующие в локальном
источник
Самый прагматичный способ: убедитесь, что у вас нет незафиксированной работы
master
, выполните коммит / push, если необходимо, клонируйте свежую копию хранилища и удалите старую.источник
Для этого вы можете использовать git-extras
источник
У меня нет grep или другого unix на моем компьютере, но это работает с терминала VSCode:
git branch -d $(git branch).trim()
Я использую строчную букву d, чтобы она не удаляла неразделенные ветви.
Я также был на мастере, когда сделал это, поэтому
* master
не существует, поэтому он не пытался удалить мастер.источник
master
эта команда не включена, эта команда БУДЕТ удаленаmaster
.Убедитесь, что вы делаете это первым
Получив информацию обо всех удаленных ветвях, используйте следующую команду, чтобы удалить все ветви, кроме главной
источник