Chcę usunąć wszystkie gałęzie, które są wyświetlane w danych wyjściowych ...
$ git branch
... ale zachowując aktualną gałąź w jednym kroku . Czy to jest możliwe? Jeśli tak to jak?
Chcę usunąć wszystkie gałęzie, które są wyświetlane w danych wyjściowych ...
$ git branch
... ale zachowując aktualną gałąź w jednym kroku . Czy to jest możliwe? Jeśli tak to jak?
Odpowiedzi:
Na podstawie odpowiedzi @pankijs utworzyłem dwa aliasy 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"
Do dodania ~/.gitconfig
I jak zauważył @torek:
Zwróć uwagę, że małe litery
-dnie usuwają „nie w pełni scalonej” gałęzi (zobacz dokumentację). Użycie-Dusunie takie gałęzie , nawet jeśli spowoduje to "zgubienie" zatwierdzeń; używaj tego z wielką ostrożnością , ponieważ powoduje to również usunięcie reflogów gałęzi, tak że zwykłe "odzyskiwanie po przypadkowym usunięciu" również nie działa.
Zasadniczo nigdy nie używaj -forcewersji, jeśli nie masz 300% pewności, że nie stracisz nic ważnego. Ponieważ jest stracony na zawsze .
git branch branchname commitid
$ git branch | grep -v "master" | xargs git branch -D
usunie wszystkie gałęzie z wyjątkiem master (zamień master na gałąź, którą chcesz zachować, ale wtedy usunie master)
grep -v ^*.
master-copy, na przykład
grep -v "^ *master$"
grep -v "master\|my-other-branch".
najpierw (przełącz się na gałąź, którą chcesz zachować> ex : master ):
git checkout master
po drugie (upewnij się, że jesteś na master )
git branch -D $(git branch)
git branch -D $(git branch).Trim().
$(git branch)cytować? To nie działa: błąd: nie znaleziono gałęzi „$ (git”. Error: branch „branch)”.
git branch -d (lub -D ) zezwala na wiele nazw gałęzi, ale jest trochę trudne, aby automatycznie podawać „wszystkie lokalne gałęzie z wyjątkiem tego, na którym jestem teraz” bez pisania co najmniej odrobiny kodu.
„Najlepszą” (formalnie poprawną) metodą jest użycie git for-each-refdo uzyskania nazw gałęzi:
git for-each-ref --format '%(refname:short)' refs/heads
ale wtedy jeszcze trudniej jest ustalić, w której gałęzi się znajdujesz (git symbolic-ref HEAD znajdujesz jest to "formalnie poprawna" metoda do tego, jeśli chcesz napisać fantazyjny skrypt).
Wygodniej możesz użyć git branch, który wypisuje nazwy lokalnych oddziałów poprzedzone dwiema spacjami lub (w przypadku bieżącej gałęzi) gwiazdką *. Więc przeprowadź to przez coś, aby usunąć *wersję, a otrzymasz nazwy gałęzi oddzielone spacjami, które możesz następnie przekazać git branch -d:
git branch -d $(git branch | grep -v '^*')
lub:
git branch | grep -v '^*' | xargs git branch -d
Zwróć uwagę, że małe litery -dnie usuwają „nie w pełni scalonej” gałęzi (zobacz dokumentację). Użycie -Dusunie takie gałęzie, nawet jeśli spowoduje to "zgubienie" zatwierdzeń; używaj tego z wielką ostrożnością, ponieważ powoduje to również usunięcie reflogów gałęzi, tak że zwykłe "odzyskiwanie po przypadkowym usunięciu" również nie działa.
git branch -D $(git branch | grep -v '^*'), jeśli chcesz usunąć te gałęzie, które zostały połączone.
Aby usunąć wszystkie połączone gałęzie (z wyjątkiem bieżących -v ‘*’):
git branch --merged | grep -v '*' | xargs git branch -D
również zrobiłem takie polecenie do całkowitego wyczyszczenia repozytorium:
alias git-clean="git branch | grep -v '*' | grep -v 'master' | xargs git branch -D && git reset --hard && git clean -d -x -f"
zaczerpnięte stąd .
Usuń wszystkie oddziały z wyjątkiem konkretnego oddziału :
git branch | grep -v "branch name" | xargs git branch -D
Usuń wszystkie lokalne oddziały z wyjątkiem develop i master
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
W przypadku systemu Windows w programie PowerShell użyj:
git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ git branch -D $_ }
Kiedyś stworzyłem tę konstrukcję dla mojego środowiska Windows. Może to pomoże komuś innemu. Podczas wykonywania główna i bieżąca gałąź nie są usuwane . Wszystkie inne połączone gałęzie zostaną usunięte niezależnie.
@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
Usuń lokalnie wszystkie połączone gałęzie:
git branch -D `git branch --merged | grep -v \* | xargs`
Usuń wszystkie oddziały z wyjątkiem konkretnego oddziału :
git branch | grep -v "branch name" | xargs git branch -D
Usuń wszystkie lokalne oddziały z wyjątkiem develop i master
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Widzę tutaj wiele zakodowanych na stałe nazw gałęzi ... I myślę, że moja odpowiedź jest dokładniejsza do części pytania dotyczącej „bieżącej gałęzi”, zachowując jednocześnie jedną linię i czytelną dla początkujących użytkowników, takich jak ja. Aby przypisać kredyt tam, gdzie jest należny, odpowiedź jest raczej oparta na odpowiedzi @ pankijs.
git branch | grep -v $(git branch --show-current) | xargs git branch -d
i mam alias w jednej linii w moich .bash_aliases w debianie.
alias gitbclean='git branch | grep -v $(git branch --show-current) | xargs git branch -d'
(Chociaż myślę, że niektóre funkcje basha muszą być włączone, aby polecenie sub działało w niektórych wierszach poleceń)
Używam tego, ponieważ jestem bardziej selektywny w tym, czego nie chcę usuwać. Poniższe polecenie usuwa każdą gałąź z wyjątkiem master, develop i bieżącej gałęzi.
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
Więc umieściłem to w moim ~/.zshrc
delete_branches() {
BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
}
alias cleanup_branches=delete_branches
IMHO, najbezpieczniejszym sposobem usuwania lokalnych oddziałów jest:
git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d
Więcej informacji związanych z tym tematem można znaleźć w sekcji Usuń wszystkie lokalne gałęzie git
goneznacznik, którego powinieneś użyć -vv(dwukrotnie gadatliwy), ale ci -anie pomoże (wyświetla również zdalne gałęzie)