Я хочу удалить все ветки, которые перечислены в выходных данных...
$ git branch
... но сохраняя текущую ветку, за один шаг. Это возможно? Если так, то как?
Я хочу удалить все ветки, которые перечислены в выходных данных...
$ git branch
... но сохраняя текущую ветку, за один шаг. Это возможно? Если так, то как?
Основываясь на ответе @pankijs, я сделал два псевдонима git:
[alias]
# Delete all local branches but master and the current one, only if they are fully merged with master.
br-delete-useless = "!f(){\
git branch | grep -v "master" | grep -v ^* | xargs git branch -d;\
}; f"
# Delete all local branches but master and the current one.
br-delete-useless-force = "!f(){\
git branch | grep -v "master" | grep -v ^* | xargs git branch -D;\
}; f"
Будет добавлено в ~/.gitconfig
И, как указал @torek:
Обратите внимание, что строчная буква
-d
не удалит "не полностью объединенную" ветвь (см. Документацию). Использование-d
удалит такие ветки, даже если это сделает коммиты "потерянными"; используйте это с большой осторожностью, так как при этом удаляются также и ветки, и обычные вещи "восстановить после случайного удаления" также не работают.
По сути, никогда не используйте версию -force
если вы не уверены на 300%, что не потеряете ничего важного. Потому что это потеряно навсегда.
$ git branch | grep -v "master" | xargs git branch -D
удалит все ветки, кроме главной (замените главную ветвь, которую хотите сохранить, но затем удалите главную)
git branch -d
(или -D
) допускает несколько имен ветвей, но немного сложно использовать "все локальные ветки, кроме того, на котором я сейчас включен", не записывая хотя бы немного кода.
"Лучший" (формально правильный) метод заключается в использовании git for-each-ref
для получения имен ветвей:
git for-each-ref --format '%(refname:short)' refs/heads
но тогда еще сложнее определить, в какую ветвь вы находитесь (git symbolic-ref HEAD
- это "формально правильный" метод для этого, если вы хотите написать fancy script).
Более удобно использовать git branch
, который печатает имена локальных ветвей, которым предшествуют два пробела или (для текущей ветки) звездочкой *
. Итак, запустите это через что-то, чтобы удалить версию *
, и вы останетесь с именами ветвей, разделенных пробелами, которые затем можно передать в git branch -d
:
git branch -d $(git branch | grep -v '^*')
или
git branch | grep -v '^*' | xargs git branch -d
Обратите внимание, что строчный -D
не удаляет ветвь "не полностью объединенная" (см. документацию). Использование -D
приведет к удалению таких ветвей, даже если это приводит к тому, что коммит становится "потерянным"; используйте это с особой осторожностью, так как это также удаляет фальшивые ветки, так что обычное "восстановление после случайного удаления" тоже не работает.
Чтобы удалить все объединенные ветки (кроме текущей -v '*
):
git branch --merged | grep -v '*' | xargs git branch -D
Также я сделал такую команду для полной очистки репо:
alias git-clean="git branch | grep -v '*' | grep -v 'master' | xargs git branch -D && git reset --hard && git clean -d -x -f"
взяты отсюда
Удалить все ветки, кроме определенной:
git branch | grep -v "branch name" | xargs git branch -D
Удалите все локальные ветки, кроме как разработать и освоить
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Удалить все объединенные ветки локально:
git branch -D 'git branch --merged | grep -v \* | xargs'
Удалить все ветки, кроме определенной:
git branch | grep -v "branch name" | xargs git branch -D
Удалите все локальные ветки, кроме как разработать и освоить
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Однажды я создал эту конструкцию для своей среды Windows. Может быть, это поможет кому-то еще. Во время выполнения основная и текущая ветки не удаляются. Все остальные объединенные ветки будут удалены независимо.
@echo off
cd PATH_TO_YOUR_REPO
REM -- Variable declerations
set "textFile=tempBranchInfo.txt"
set "branchToKeep=master"
set "branchToReplaceWith="
git branch --merged > %textFile%
REM -- remove "master" from list to keep the branch
for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
set "line=%%i"
setlocal enabledelayedexpansion
>>"%textFile%" echo(!line:%branchToKeep%=%branchToReplaceWith%!
endlocal
)
REM -- execute branch delete commands
for /f "delims=" %%a in (%textFile%) do (
git branch -D %%a
)
REM -- remove temp-file with branch information inside
DEL %textFile%
REM -- show local branches after the cleaning
echo Local branches:
git branch
pause
exit
Для Windows в Powershell используйте:
git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ git branch -D $_ }
Предполагая, что git branch
показывает текущую ветвь с префиксом *
; Используя Powershell, следующий вкладыш удалит все ветки, которые не начинаются с *
.
git branch | ? { $_ -lt "*" } | % { git branch -D $_.Trim() }
?
= Где-Объект
%
= Foreach-Object
сначала (переключитесь на ветку, которую хотите сохранить> ex: master):
git checkout master
второй (убедитесь, что sure вы являетесь мастером)
git branch -D $(git branch)
ИМХО, самый безопасный способ удаления локальных веток это:
git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d
Кроме того, больше информации, связанной с этой темой, вы можете найти Удалить все локальные ветки Git