Chciałbym, aby oczyścić moje lokalne repozytorium, które ma mnóstwo starych gałęzi, na przykład: 3.2
, 3.2.1
, 3.2.2
, itd
Miałem nadzieję na sprytny sposób na usunięcie wielu z nich na raz. Ponieważ w większości są zgodne z konwencją uwalniania kropek, pomyślałem, że może istnieć skrót do powiedzenia:
git branch -D 3.2.*
i zabij wszystkie gałęzie 3.2.x.
Wypróbowałem to polecenie i oczywiście nie zadziałało.
git branch -D $(git branch | grep 3.2*)
- to zadziałało dla mnie. Usuwa gałęzie, których nazwa zaczyna się od „3.2”.grep
- dopasowanie wzorca na wyjściu (git branch
w tym przypadku).$()
- oznacza wykonać i umieścić wynik.|
- łańcuchy.-D
to siła kasowania, należy użyć-d
w większości przypadków będzie bezpieczniej pierwszy.Odpowiedzi:
Nie z tą składnią. Ale możesz to zrobić w następujący sposób:
Zasadniczo, gałąź git usunie dla ciebie wiele gałęzi za pomocą jednego wywołania. Niestety nie wykonuje uzupełniania nazw gałęzi. Chociaż w bash możesz zrobić:
źródło
git branch -D/-d
działa dobrze dla mnie. Może chcesz zaktualizować swój (być może z najnowszego katalogu contit git.git).git branch | ...
ciebie możesz użyć$(git for-each-ref --format='%(refname:short)' refs/heads/3.*)
. Wiem, że jest dłuższy, ale z pewnością jest odpowiedni, alegit branch
ma całkiem niezłe wyjście z rzeczami takimi jak*
i->
(dla symrefs), które mogą zepsuć cię w skryptach / liniach.grep
aliasy zawsze zawierały flagę--color=always
-git branch -D
rzucałem,error: branch 'my_branch' not found.
dopóki nie uciekłem bez kolorowej flagi.git branch --merged ${1-$(current_branch)} | grep -v ${1-$(current_branch)} | xargs git branch -d
git branch -D 3.2{,.1,.2}
aby usunąć wszystkie trzy gałęzie gnu.org/software/bash/manual/html_node/Brace-Expansion.htmlW najgorszym przypadku możesz użyć:
źródło
| xargs git branch -d
części, aby sprawdzić, co faktycznie zostanie usunięte.grep
wyświetlaćgit branch
, ponieważ ma to na celu czytanie, a nie parsowanie. Można zmienić w dowolnym momencie. użyjfor-each-ref
razem z parametrami--format
, jak sugerowano w innych odpowiedziach, a następnie połącz z sugestiami w tej odpowiedzi.EDYTOWAĆ:
Bezpieczniejsza wersja (sugerowana przez Jakuba Narębskiego i Jefromiego), ponieważ wyjście gałęzi git nie jest przeznaczone do użycia w skryptach:
... lub xargs-free:
źródło
git branch
danych wyjściowych do tworzenia skryptów. Zastosowaniegit for-each-ref
.git for-each-ref --format="%(refname:short)" refs/tags/\*@\* | xargs git tag -d
If one or more patterns are given, only refs are shown that match against at least one pattern, either using fnmatch(3) or literally, in the latter case matching completely or from the beginning up to a slash
-D
to siła kasowania, należy użyć-d
w większości przypadków będzie bezpieczniej pierwszy.Możesz użyć git branch --list, aby wyświetlić listę kwalifikujących się gałęzi, a git branch -D / -d, aby usunąć kwalifikujące się gałęzie.
Przykład jednego liniowca:
źródło
error: branch 'package.json' not found.
. Wygląda na to, że * jest rozwijany zbyt wcześnie i próbuje usunąć gałąź odpowiadającą nazwie każdego pliku i katalogu.gitconfig
...git branch --list '3.2.*'
git branch -d (git branch --list '3.2.*').trim()
Ostatnio szukałem rozwiązania tego samego problemu, w końcu znalazłem jedną odpowiedź i działa ona bardzo dobrze:
To rozwiązanie jest niesamowite, a jeśli chcesz uzyskać pełne wyjaśnienie każdego polecenia i sposobu jego działania, podaj je tutaj .
źródło
Posługiwać się
źródło
alias grefs='git for-each-ref --format="%(refname:short)"'
dzięki czemu mogę zrobićgrefs | grep 'regexpattern' | xargs git branch -D
Może przyda ci się to:
Jeśli chcesz usunąć wszystkie gałęzie, które nie są na przykład „master”, „foo” i „bar”
grep -v 'coś' jest dopasowaniem z inwersją.
źródło
-D
opcja w porównaniu do innej odpowiedzi. Dzięki za odpowiedź tutaj @Adi. Rozwiązania dla mnie działają.Umieszczam moje inicjały i myślnik (at-) jako pierwsze trzy znaki nazwy oddziału z tego właśnie powodu:
źródło
Jeśli nie jesteś ograniczony do używania wiersza polecenia git, zawsze możesz uruchomić
git gui
i użyć pozycji menu Oddział-> Usuń. Wybierz wszystkie gałęzie, które chcesz usunąć i pozwól mu zgrać.źródło
Rozwiązanie PowerShell:
Jeśli korzystasz z systemu Windows, możesz użyć programu PowerShell, aby usunąć wiele gałęzi jednocześnie ...
Możesz także dostroić sposób, w jaki powinno działać dopasowywanie wzorców za pomocą polecenia Select-String programu Powershell. Spójrz na dokumenty PowerShell .
źródło
Kontynuuj „rozwijaj” i usuwaj wszystkie inne w lokalnym
źródło
Zrobiłem małą funkcję, która może być użyteczna na podstawie odpowiedzi udzielonej przez @gawi (powyżej).
Dodaj to do swojego
.bash_profile
i uruchom ponownie terminal. Następnie możesz zadzwonić z wiersza polecenia w następujący sposób:Uwaga
Mam go obecnie skonfigurowanego do miękkiego usuwania, co oznacza, że nie usunie gałęzi, chyba że zostały już scalone. Jeśli chcesz mieszkać na krawędzi, zmień
-d
na-D
i usunie wszystko z prefiksem niezależnie!źródło
Jeśli naprawdę potrzebujesz wyczyścić wszystkie swoje gałęzie, spróbuj
git branch -d $(git branch)
Spowoduje to usunięcie wszystkich lokalnych połączonych oddziałów z wyjątkiem tego, w którym aktualnie się logujesz.
To dobry sposób na utrzymanie lokalnych czystości
źródło
Może ci się spodobać ten mały element ... Pobiera listę i prosi o potwierdzenie każdego elementu przed ostatecznym usunięciem wszystkich zaznaczeń ...
Użyj -D, aby wymusić usunięcie (jak zwykle).
Dla czytelności, oto ten podzielony wiersz po wierszu ...
oto podejście xargs ...
wreszcie lubię mieć to w moim .bashrc
W ten sposób mogę po prostu powiedzieć
źródło
Dla czystych dusz, które używają PowerShell tutaj mały skrypt
git branch -d $(git branch --list '3.2.*' | %{$_.Trim() })
źródło
działa dla mnie poprawnie:
usuń wszystkie lokalne oddziały
źródło
Użyj następującego polecenia, aby usunąć wszystkie gałęzie (gałąź wyewidencjonowana nie zostanie usunięta).
Edycja: używam Mac OS
źródło
Jeśli korzystasz z systemu Windows, możesz to zrobić za pomocą programu PowerShell:
zastąp
feature/*
dowolny wzór.źródło
Możesz użyć tego polecenia:
git branch -D $(printf "%s\n" $(git branch) | grep '3.2')
źródło
Możesz użyć
git gui
do usunięcia wielu oddziałów jednocześnie. W wierszu polecenia / Bash ->git gui
-> Zdalny -> Usuń gałąź ... -> wybierz zdalne gałęzie, które chcesz usunąć -> Usuń.źródło
Właśnie dzisiaj wyczyściłem duży zestaw przestarzałych oddziałów lokalnych / zdalnych.
Oto jak to zrobiłem:
1. wypisz wszystkie nazwy gałęzi do pliku tekstowego:
git oddział -a >> BranchNames.txt
2. dołącz gałęzie, które chcę usunąć, do polecenia „git branch -D -r”:
git branch -D -r origin / dirA / branch01 origin / dirB / branch02 origin / dirC / branch03 (... dołącz dowolne nazwy gałęzi)
3. uruchom cmd
A ten działa o wiele szybciej i bardziej niezawodnie niż „ git push origin - usuń” ”.
To może nie być najmądrzejszy sposób wymieniony w innych odpowiedziach, ale ten jest dość prosty i łatwy w użyciu.
źródło
Jeśli masz zainstalowany Git GUI, który jest domyślnym dodatkiem do systemu Windows, to jest najprostszy. Możesz użyć ctrl, aby wybrać wiele gałęzi i usunąć je jednym kliknięciem.
źródło
Jeśli używasz powłoki rybnej, możesz wykorzystać
string
funkcje :To niewiele różni się od opcji PowerShell w niektórych innych odpowiedziach.
źródło
Jeśli miałeś wszystkie gałęzie do usunięcia w pliku tekstowym (oddziały do del.txt) (jedna gałąź na linię), możesz to zrobić, aby usunąć wszystkie takie gałęzie ze zdalnego (pochodzenie):
xargs -a branches-to-del.txt git push --delete origin
źródło
Ponieważ w Git wszystkie gałęzie są niczym przez odniesienia do repozytorium git, dlaczego po prostu nie usuniesz gałęzi, które je przechodzą,
.git/ref
a jeśli coś zostanie pominięte, co nie jest interesujące w repozytorium, zostanie automatycznie usunięte, więc nie trzeba zawracać sobie głowę.źródło
git branch -D <branchName>
źródło
Możesz usunąć wszystkie gałęzie, usuwając wszystkie niepotrzebne odwołania:
rm .git/refs/heads/3.2.*
źródło
git gc
). Nie rób tego