Я хочу удалить все ветки, которые перечислены в выходных данных...
$ 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