Я хочу удалить все ветки, перечисленные в выводе ...
$ 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 branchname commitid
$ git branch | grep -v "master" | xargs git branch -D
удалит все ветки, кроме master (замените master веткой, которую вы хотите сохранить, но затем она удалит мастер)
grep -v ^*
.
master-copy
, например, не
grep -v "^ *master$"
grep -v "master\|my-other-branch"
.
сначала (переключитесь на ветку, которую вы хотите сохранить> ex : master ):
git checkout master
второй (убедитесь, что вы на главном )
git branch -D $(git branch)
git branch -D $(git branch).Trim()
.
$(git branch)
в кавычки? Это не работает: ошибка: ветка «$ (git» не найдена. Ошибка: ветка «ветка)» не найдена.
git branch -d
(или -D
) позволяет использовать несколько имен веток, но немного сложно автоматически предоставить «все локальные ветки, за исключением той, в которой я сейчас работаю», не написав хотя бы немного кода.
"Лучший" (формально правильный) метод - git for-each-ref
получить имена веток:
git for-each-ref --format '%(refname:short)' refs/heads
но тогда еще труднее определить, в какой ветке вы находитесь ( git symbolic-ref HEAD
это «формально правильный» метод для этого, если вы хотите написать необычный сценарий).
Более удобно, вы можете использовать git branch
, который печатает имена ваших локальных веток, которым предшествуют два пробела или (для текущей ветки) звездочка *
. Итак, пропустите это через что-нибудь, чтобы удалить *
версию, и у вас останутся имена веток, разделенных пробелами, которые вы затем можете передать git branch -d
:
git branch -d $(git branch | grep -v '^*')
или:
git branch | grep -v '^*' | xargs git branch -d
Обратите внимание, что строчные буквы -d
не удаляют «не полностью объединенную» ветку (см. Документацию). Использование -D
приведет к удалению таких ветвей, даже если это приведет к потере фиксации; используйте это с большой осторожностью, так как при этом удаляются также и рефлоги веток, так что обычные вещи «восстановление после случайного удаления» тоже не работают.
git branch -D $(git branch | grep -v '^*')
, если вы хотите удалить те ветки, которые слились.
Чтобы удалить все объединенные ветки (кроме текущей -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
Для Windows в Powershell используйте:
git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ 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
Удалить всю объединенную ветку локально:
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
Итак, я вижу здесь много жестко закодированных имен веток ... И я думаю, что мой ответ здесь более точен для части вопроса о «текущей ветке», при этом он остается одной строкой и удобочитаем для таких новичков, как я. Просто чтобы отдать должное, ответ, скорее всего, также основан на ответе @pankijs.
git branch | grep -v $(git branch --show-current) | xargs git branch -d
и у меня есть псевдоним в одной строке в моих .bash_aliases в debian.
alias gitbclean='git branch | grep -v $(git branch --show-current) | xargs git branch -d'
(Хотя я думаю, что некоторые функции bash должны быть включены для запуска подкоманды в некоторых командных строках)
Я использую это, потому что могу более избирательно подходить к тому, что не хочу удалять. Эта команда ниже удаляет все ветки, кроме главной, разработки и текущей ветки.
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
Я положил это в свой ~/.zshrc
delete_branches() {
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
}
alias cleanup_branches=delete_branches
ИМХО, самый безопасный способ удаления локальных веток:
git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d
Кроме того, дополнительную информацию по этой теме вы можете найти в разделе Удаление всех локальных веток git.
gone
маркер, который вы должны использовать -vv
(подробно дважды), -a
это не поможет вам (в нем перечислены также удаленные ветки)