Śledzę proces rozwoju, w którym tworzę nowy oddział lokalny dla każdej nowej funkcji lub karty opowieści. Po zakończeniu łączę gałąź w master, a następnie pcham.
To, co dzieje się z czasem z powodu połączenia lenistwa lub zapomnienia, polega na tym, że kończę z dużą listą lokalnych oddziałów, z których niektóre (takie jak kolce) mogły nie zostać połączone.
Wiem, jak wyświetlić listę wszystkich moich lokalnych oddziałów i wiem, jak usunąć pojedynczy oddział, ale zastanawiałem się, czy istnieje polecenie git, które pozwala mi usunąć wszystkie moje lokalne oddziały?
Poniżej znajduje się wynik git branch --merged
polecenia.
user@machine:~/projects/application[master]$ git branch --merged
STORY-123-Short-Description
STORY-456-Another-Description
STORY-789-Blah-Blah
* master
Wszystkie próby usunięcia oddziałów wymienionych grep -v \*
(zgodnie z odpowiedziami poniżej) powodują błędy:
error: branch 'STORY-123-Short-Description' not found.
error: branch 'STORY-456-Another-Description' not found.
error: branch 'STORY-789-Blah-Blah' not found.
Używam:
git 1.7.4.1
Ubuntu 10.04
GNU bash, wersja 4.1.5 (1) - wydanie
GNU grep 2.5.4
Odpowiedzi:
Podkomenda „git branch -d” może usunąć więcej niż jedną gałąź. Upraszczając odpowiedź @ sblom, ale dodając krytyczne xargs:
lub dodatkowo uproszczone do:
Co ważne, jak zauważył @AndrewC, odradza się korzystanie
git branch
ze skryptów. Aby tego uniknąć, użyj czegoś takiego:Należy zachować ostrożność podczas usuwania!
źródło
error:branch 'STORY-123-Short-Description' not found.
dla każdej z wymienionych gałęzi.error:branch 'STORY-123-Short-Description' not found.
błąd, prawdopodobnie wynika to z ustawień kolorów git. To zadziałało dla mnie (zwróć uwagę na--no-color
opcję):git branch --no-color --merged | grep -v \* | xargs git branch -D
Znalazłem lepszy sposób w komentarzu na ten temat na github :
git branch --merged master --no-color | grep -v master | grep -v stable | xargs git branch -d
edycja: dodana opcja bezbarwna i wykluczająca stabilną gałąź (dodaj inne gałęzie w razie potrzeby)
źródło
error: branch 'my-branch-name' not found.
dla każdej gałęzi. Korzystanie z gita w wersji 1.8.3.4 (Apple Git-47). Masz pomysł, dlaczego?git for-each-ref --format '%(refname:short)' refs/heads/ | grep -v master | xargs git branch -d
Analiza wyników
git branch
nie jest zalecana i nie jest dobrą odpowiedzią dla przyszłych czytelników na temat przepełnienia stosu.git branch
to tak zwane polecenie porcelany. Polecenia porcelany nie są przeznaczone do parsowania maszynowego, a dane wyjściowe mogą się zmieniać między różnymi wersjami Git.git branch
w sposób, który utrudnia ich analizę (na przykład kolorowanie). Jeśli użytkownik ustawiłcolor.branch
, otrzymasz kody sterujące na wyjściu, to doprowadzi do tego,error: branch 'foo' not found.
jeśli spróbujesz potokować go do innego polecenia. Możesz to obejść za pomocą--no-color
flagigit branch
, ale kto wie, do czego mogą doprowadzić inne konfiguracje użytkowników.git branch
może robić inne rzeczy, które irytujące podczas analizowania, takie jak umieszczenie gwiazdki obok aktualnie wyewidencjonowanego oddziałuOpiekunem git ma do powiedzenia na temat skryptów wokół
git branch
wyjściaOdpowiedzi sugerujące ręczne edytowanie plików w
.git
katalogu (takie jak .git / refs / heads) są podobnie problematyczne (referencje mogą być w .git / pack-refs, lub Git może zmienić ich wewnętrzny układ w przyszłości).Git zapewnia
for-each-ref
polecenie pobrania listy gałęzi.Git 2.7.X wprowadzi tę
--merged
opcję, abyś mógł zrobić coś takiego jak poniżej, aby znaleźć i usunąć wszystkie połączone gałęzieHEAD
W wersji Git 2.6.X i starszych musisz wyświetlić listę wszystkich lokalnych oddziałów, a następnie przetestować je indywidualnie, aby sprawdzić, czy zostały scalone (co będzie znacznie wolniejsze i nieco bardziej skomplikowane).
źródło
git branch --no-color 2>/dev/null
?git branch
jest jednak polecenie porcelany i nie ma gwarancji, że dane wyjściowe nie zmienią się w niektórych przyszłych wersjach git.Prostszy sposób na usunięcie wszystkich gałęzi z zachowaniem innych, takich jak „rozwijaj” i „master”, jest następujący:
bardzo przydatne !
źródło
Aby usunąć każdą gałąź oprócz tej, którą obecnie wypisałeś:
Polecam zmianę
git branch -D $b
doecho $b
pierwszych kilka razy, aby upewnić się, że usuwa gałęzie, które zamierzają.źródło
error:branch 'a_branch_name' not found.
widzę, co próbujesz zrobić, i bawiłem się tym poleceniem, ale z jakiegoś powodu git nie lubi podanych nazw gałęzi ...git branch --merged
STORY-123-Short-Description
git branch --merged
, masz listę z jednym z nich w każdej linii?error:branch 'a_branch_name' not found.
? Czy może narzeka na jedną z nazw gałęzi z twojegogit branch
wyjścia powyżej?Poniższe polecenie usunie wszystkie gałęzie lokalne oprócz gałęzi master.
Powyższe polecenie
źródło
git branch | grep -v "master" | xargs git branch -d
najpierw, aby nie usuwać nie połączonych gałęzi, tylko dla bezpieczeństwa. Ale miła odpowiedź!,@(git branch | Select-String -Pattern "[^(*?)\s? master]") | ForEach-Object{$_.Line.Trim()} | %{git branch -D $_}
Tylko uwaga, zaktualizowałbym do wersji git 1.7.10. Być może otrzymujesz odpowiedzi, które nie będą działać w twojej wersji. Domyślam się, że musiałbyś poprzedzić nazwę gałęzi
refs/heads/
.OSTROŻNIE, wykonaj następujące czynności tylko, jeśli wykonałeś kopię folderu roboczego i katalogu .git.
Czasami po prostu idę do przodu i usuwam gałęzie, których nie chcę od razu
.git/refs/heads
. Wszystkie te gałęzie są plikami tekstowymi zawierającymi 40 znaków sha-1 zatwierdzenia, na który wskazują. Będziesz mieć dodatkowe informacje,.git/config
jeśli skonfigurowałeś określone śledzenie dla któregokolwiek z nich. Możesz również usunąć te wpisy ręcznie.źródło
Spróbuj wykonać następujące polecenie powłoki:
Wyjaśnienie:
git branch | grep -v "master"
poleceniaxargs
poleceniaxargs git branch -D
źródło
Aby usunąć wszystkie lokalne oddziały w systemie Linux oprócz tego, w którym jesteś
źródło
Łatwiej było mi użyć edytora tekstu i powłoki.
git checkout <TAB>
w powłoce. Pokaże wszystkie lokalne oddziały.git branch -D <PASTE THE BRANCHES NAMES HERE>
.Otóż to.
źródło
Miałem podobną sytuację i ostatnio uznałem następującą komendę za przydatną.
Jeśli chcesz zachować wiele oddziałów, to
mam nadzieję, że to komuś pomoże.
źródło
git branch -D `git branch | awk '{ if ($0 !~ /master/) printf "%s", $0 }'`
Właściwie myślę, że pierwotnie je miałeś, ale zgubiły się w formatowaniu SO.Z wiersza poleceń systemu Windows usuń wszystkie oprócz bieżącej wypisanej gałęzi, używając:
źródło
Jeśli nie musisz przechodzić przez sam Git, możesz także usunąć głowice w .git / refs / heads ręcznie lub programowo. Poniższe elementy powinny działać przy minimalnym ulepszeniu w Bash:
Spowoduje to usunięcie każdej gałęzi lokalnej z wyjątkiem gałęzi głównej. Ponieważ twoje odgałęzienia są przechowywane w .git / refs / piloty , pozostaną nietknięte.
Jeśli nie używasz Basha lub chcesz ponownie uruchomić wiele repozytoriów Git na raz, możesz zrobić coś podobnego z GNU find:
Rozwiązanie wyszukiwania jest prawdopodobnie bardziej przenośne, ale przycinanie ścieżek i nazw plików jest trudne i potencjalnie bardziej podatne na błędy.
źródło
Żadna z odpowiedzi nie spełniła w pełni moich potrzeb, więc zaczynamy:
Spowoduje to usunięcie wszystkich lokalnych oddziałów, które są scalone i zaczynają się od
feature/
,bugfix/
lubhotfix/
. Następnie pilot nadrzędnyorigin
jest przycinany (może być konieczne podanie hasła).Działa na Git 1.9.5.
źródło
W oparciu o kombinację wielu odpowiedzi tutaj - jeśli chcesz zachować wszystkie gałęzie, które istnieją zdalnie, ale usunąć resztę , następujący oneliner załatwi sprawę:
źródło
Chociaż nie jest to rozwiązanie z linii poleceń, jestem zaskoczony graficznym interfejsem Git nie został jeszcze zasugerowany.
Korzystam z wiersza polecenia 99% czasu, ale w tym przypadku jest on albo zbyt wolny, by spowolnić (stąd pierwotne pytanie), albo nie wiesz, co zamierzasz usunąć, korzystając z długiej, ale sprytnej manipulacji powłoką.
Interfejs użytkownika rozwiązuje ten problem, ponieważ możesz szybko sprawdzić gałęzie, które chcesz usunąć, i otrzymać przypomnienie o tych, które chcesz zachować, bez konieczności wpisywania polecenia dla każdej gałęzi.
Z interfejsu użytkownika przejdź do Oddziału -> Usuń i Ctrl + Kliknij gałęzie, które chcesz usunąć, aby zostały podświetlone. Jeśli chcesz mieć pewność, że zostaną scalone w oddział (np.
dev
), W obszarze Usuń tylko, jeśli Scalono w Aby ustawić Oddział lokalny nadev
. W przeciwnym razie ustaw opcję Zawsze, aby zignorować tę kontrolę.źródło
W przypadku PowerShell będzie to działać:
źródło
Poniższy skrypt usuwa gałęzie. Użyj go i zmodyfikuj na własne ryzyko itp. Itp.
Opierając się na innych odpowiedziach w tym pytaniu, napisałem dla siebie szybki skrypt bash. Nazwałem go „gitbd” (gałąź git -D), ale jeśli go użyjesz, możesz zmienić nazwę na dowolną.
Będzie oferował usunięcie wszelkich gałęzi, które pasują do argumentu wzorca, jeśli zostaną przekazane, lub wszystkich gałęzi lokalnych, gdy zostaną wywołane bez argumentów. To również da ci krok potwierdzający, ponieważ, wiesz, usuwamy rzeczy, więc to miłe.
To trochę głupie - jeśli nie ma gałęzi pasujących do wzoru, nie zdaje sobie z tego sprawy.
Przykładowy przebieg wyjściowy:
źródło
Napisałem skrypt powłoki, aby usunąć wszystkie lokalne gałęzie oprócz
develop
źródło
Powyższe odpowiedzi działają dobrze. Oto inne podejście, gdy mamy wiele gałęzi w lokalnym repozytorium i musimy usunąć wiele gałęzi z wyjątkiem kilku, które leżą na lokalnej maszynie.
Pierwszy
git branch
wyświetli listę wszystkich lokalnych oddziałów.Aby przetransponować kolumnę z nazwami gałęzi do pojedynczego wiersza w pliku, uruchamiając polecenie unix.
git branch > sample.txt
Zostanie to zapisane w pliku sample.txt . I biegnij
awk 'BEGIN { ORS = " " } { print }' sample.txt
polecenie w powłoce. Spowoduje to przekształcenie kolumny w wiersz i skopiowanie listy nazw gałęzi w jednym wierszu.
A potem biegnij
git branch -D branch_name(s)
.Spowoduje to usunięcie wszystkich wymienionych oddziałów obecnych w lokalnym
źródło
Najbardziej pragmatyczny sposób: upewnij się, że nie masz nieproszonej pracy
master
, zatwierdzaj / wypychaj w razie potrzeby, klonuj nową kopię repozytorium i usuń starą.źródło
W tym celu możesz użyć dodatków git
źródło
Nie mam grep ani innego Uniksa na moim urządzeniu, ale działało to z terminalu VSCode:
git branch -d $(git branch).trim()
Używam małych liter d, aby nie usuwać nie połączonych gałęzi.
Byłem też na masterie, kiedy to zrobiłem, więc
* master
nie istnieje, więc nie próbował usunąć master.źródło
master
, to polecenie BĘDZIE usuniętemaster
.Najpierw upewnij się, że to robisz
Po uzyskaniu wszystkich informacji o zdalnych gałęziach użyj następującego polecenia, aby usunąć każdą gałąź oprócz master
źródło