Problem: Chcę sposobu na usunięcie wszystkich lokalnych oddziałów, które mam, a które nie mają pilota. Łatwo jest przelać nazwy gałęzi do a git branch -D {branch_name}
, ale jak w pierwszej kolejności uzyskać tę listę?
Na przykład:
Tworzę nowy oddział bez pilota:
$ git co -b no_upstream
Wymieniam wszystkie moje oddziały, a tylko jeden ma pilota
$ git branch -a
master
* no_upstream
remotes/origin/HEAD -> origin/master
remotes/origin/master
Jakie polecenie mogę uruchomić, aby otrzymać no_upstream
odpowiedź?
Mogę biec git rev-parse --abbrev-ref --symbolic-full-name @{u}
i to pokaże, że nie ma pilota:
$ git rev-parse --abbrev-ref --symbolic-full-name @{u}
error: No upstream configured for branch 'no_upstream'
error: No upstream configured for branch 'no_upstream'
fatal: ambiguous argument '@{u}': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
Ale ponieważ jest to błąd, nie pozwala mi go używać ani przesyłać do innych poleceń. Zamierzam użyć tego jako aliasu skryptu powłoki git-delete-unbranched
lub może stworzyć super prosty klejnotgit-branch-delete-orphans
git
git-remote
JC Denton
źródło
źródło
Odpowiedzi:
Niedawno odkryłem,
git branch -vv
która wersjagit branch
polecenia jest „bardzo szczegółowa” .Wyprowadza gałęzie wraz z gałęziami zdalnymi, jeśli istnieją, w następującym formacie:
Po uzyskaniu tego ładnie sformatowanego wyjścia jest tak proste, jak przepuszczenie go przez potok
cut
iawk
pobranie listy:Daje następujące wyniki:
cut
Część tylko normalizuje dane poprzez usunięcie dwóch pierwszych znaków (łącznie*
) z wyjściem przed przekazaniem go doawk
.awk
Część drukuje pierwszej kolumny, jeśli nie ma kwadratowy uchwyt w trzeciej kolumnie.Bonus: utwórz alias
Ułatw sobie uruchomienie, tworząc alias w
.gitconfig
pliku globalnym (lub gdziekolwiek):Ważne: odwrotny ukośnik musi zostać zmieniony w aliasie, w przeciwnym razie będziesz mieć nieprawidłowy plik gitconfig.
Bonus: zdalne filtrowanie
Jeśli z jakiegoś powodu masz wiele pilotów śledzących dla różnych oddziałów, łatwo jest określić, z którym pilotem chcesz sprawdzić. Wystarczy dołączyć zdalną nazwę do wzorca awk. W moim przypadku jest
origin
tak, że mogę to zrobić:źródło
WIP:
właściwie jest ..? czy to nie jest to, co tworzy polecenie skrytki ..?git branch -vv
, nawet jeśli zdalny oddział istnieje i pasuje do mojego lokalnego oddziału, nie zobaczyłbym[origin/branch-name]
obok wyniku. Musiałem miećdiff
dwie listy oddziałów, aby dowiedzieć się, co jest tylko lokalne.git branch -vv | grep -v origin/
wystarczy migone
?git branch
(bez żadnych opcji) wyświetla tylko lokalne oddziały, ale nie wiesz, czy śledzą zdalny oddział, czy nie.Zwykle te lokalne gałęzie powinny zostać usunięte po scaleniu
master
(jak widać w tym numerze git-sweep ):To nie jest tak kompletne, jak chcesz, ale to początek.
źródło
git branch -a --merged
.Mam podobny problem. Chcę usunąć wszystkie oddziały lokalne, które śledziły oddziały zdalne, które są teraz usuwane. Stwierdzam, że
git remote prune origin
to nie wystarczyło, aby usunąć gałęzie, które chcę usunąć. Po usunięciu pilota chcę, aby lokalny również zniknął. Oto, co zadziałało dla mnie:Z mojego
~/.gitconfig
:Oto
git config --global ...
polecenie umożliwiające łatwe dodanie tego jakogit prune-branches
:UWAGA : Zmieniłem
-d
się-D
w mojej aktualnej konfiguracji, bo nie chcą słyszeć Git narzekać oddziałów niescalonych. Państwo może chcieć tę funkcjonalność, jak również. Jeśli tak, po prostu użyj-D
zamiast-d
na końcu tego polecenia.Ponadto, FWIW, twój globalny plik konfiguracyjny prawie zawsze będzie
~/.gitconfig
.(Poprawka OS X)
Jak napisano, to nie działa na OS X ze względu na użycie
xargs -r
(dzięki, Korny ).Ma
-r
to zapobiecxargs
uruchomieniugit branch -d
bez nazwy gałęzi, co spowoduje wyświetlenie komunikatu o błędzie „fatal: branch name required
”. Jeśli nie przeszkadza Ci komunikat o błędzie, możesz po prostu usunąć-r
argument doxargs
i gotowe.Jeśli jednak nie chcesz widzieć komunikatu o błędzie (i naprawdę, kto może cię winić), będziesz potrzebować czegoś innego, co sprawdza, czy nie ma pustej potoki. Jeśli możesz użyć ifne z moreutils . Wstawiłbyś
ifne
wcześniejxargs
, co przestaniexargs
działać z pustymi danymi. UWAGA :ifne
uważa, że cokolwiek nie jest puste, obejmuje to puste wiersze, więc nadal możesz zobaczyć ten komunikat o błędzie. Nie testowałem tego na OS X.Oto ta
git config
linia zifne
:źródło
Późna edycja:
Lepiej jest
Na GNU / cokolwiek
Gdyby było więcej niż kilka gałęzi, byłyby lepsze sposoby, używając
comm -23
do wyjściagit branch|sed|sort
igit config -l|sed|sort
.źródło
To działa dla mnie:
git branch -vv | grep -v origin
(jeśli twój pilot nosi inną nazwę niż pochodzenie, zastąp ją).
Spowoduje to wyświetlenie wszystkich gałęzi, które nie śledzą pilota, co brzmi jak to, czego szukasz.
źródło
git fetch --prune
.Syntetyzuję własne polecenie Git, aby uzyskać
origin/***: gone
gałęzie:git remote prune origin && git branch -vv
wypisze gałęzie w trybie szczegółowym.cut -c 3-
usunie pierwsze znaki.grep ': gone]'
wydrukuje tylko utracone zdalne gałęzie.awk '{print $1}'
wypisze nazwę gałęzi.xargs -n1 -r echo git branch -d
wypiszegit branch -d
polecenie usunięcia gałęzi (-n1 będzie zarządzać jednym poleceniem na raz, -r, aby uniknąć wydania polecenia, jeśli nie ma żadnej gałęzi).WSKAZÓWKA: usuń polecenie "echo", aby uruchamiać polecenia zamiast tylko drukowania. Zostawiłem to w poleceniu, aby sprawdzić polecenia przed wydaniem polecenia git.
WSKAZÓWKA 2: wydawaj
git branch -D
wtedy i tylko wtedy, gdy jesteś pewien, że chcesz usunąć niepołączone gałęzieźródło
awk
, nie wiedziałem, że możesz to zrobić.Oto coś, czego użyłem w PowerShell z komentarzami, aby wyjaśnić, co robi. Aby wyjaśnić, co się dzieje, nie użyłem żadnych skróconych poleceń PowerShell (aliasów). Nie krępuj się skompresować go do pożądanego poziomu tajemniczości :)
źródło
Połączenie kilku istniejących odpowiedzi:
Na przykład:
źródło