2011-11-22 18 views
26

W pracy używamy gałęzi tematycznych, które są zintegrowane w kilku (3) gałęziach master w pewnym momencie. Teraz chciałbym usunąć wszystkie gałęzie tematów z mojego repozytorium zdalny, które zostały w pełni zintegrowane z gałęzi master. Jeśli to nie jest możliwe, pobranie listy lokalnych oddziałów, które zostały zintegrowane, również byłoby w porządku.Jak usunąć wszystkie zdalne gałęzie git, które zostały już zintegrowane?

Odpowiedz

35

Edit:

Najlepsza odpowiedź z komentarzem skalee za:

git branch -a --merged remotes/origin/master | grep -v master | grep "remotes/origin/" | cut -d "/" -f 3- | xargs -n 1 git push --delete origin 

Old odpowiedź:

git push --delete remote topicbranch 

lub

git push remote :topicbranch 

Podając listę oddziałów, byłoby coś z git branch --merged master

+1

Dzięki, 'git branch --merged' wygląda ładnie. Niestety nie będzie działać poprawnie z gałęziami, które zostały ponownie utworzone podczas integracji .. ale dobrze, przynajmniej * niektóre * mojego shitload (160) oddziałów są wymienione jako super bezpieczne do usunięcia. – ThiefMaster

+0

Założone gałęzie są trudniejsze ... To może być możliwe, ale wymagałoby to co najmniej skorupy, która pobierze listę poprawek po punkcie rozgałęzienia, a następnie szuka sygnatur sygnatur wzdłuż głównej gałęzi ... nie zdaje sobie sprawy z żadnego wstępnie gotowanego rozwiązania. –

+0

To jest fantastyczne, chociaż trafiłem na mały szkopuł. Nazwy moje gałęzie z '/', np. jedną z moich nazw gałęzi może być 'sf/correct-liter-7'. Ze względu na parametr '-f 3' na ** cut **, nazwa tej gałęzi byłaby obcięta do' sf'. Zmiana parametru na '-f 3-', koryguje ten problem i obsługuje gałęzie z dowolną liczbą ukośników. –

14

Można to zrobić za jednym zamachem z

git branch --merged master | grep -v master | xargs -n 1 git push --delete origin 

Dump że w skrypcie zwany „czysty”, jeśli okaże się to robisz często.

+12

Jeśli chcesz usunąć wszystkie odległe gałęzie, nie tylko te, które mają lokalne odpowiedniki: 'gałąź git -a - połączone piloty/origin/master | grep -v master | grep "piloty/pochodzenie /" | cut -d "/" -f 3 | xargs -n 1 git push --delete origin'. Polecam również użycie 'remote/origin/master' zamiast zwykłego' master', aby wykluczyć rzeczy, które połączyłeś lokalnie, ale jeszcze nie zostały wypchnięte, na wypadek, gdybyś w końcu zapomniał lub zdecydował się nie pchać. – skalee

+2

@skalee thanks! to działało dla mnie, chyba że gałęzie są w folderach - zamiast tego użyj 'cut -d"/"-f 3-'. Musiałem też dodać 'grep -v develop', aby przestać próbować usunąć moją gałąź dev. – antonyh

+0

'xargs -n 1' jest zbyt wolny, jeśli masz wiele gałęzi użyj zamiast tego' xargs -n 20'. – mozillazg

9

Jeśli chcesz usunąć zdalnych oddziałów z repozytorium pochodzenia:

git branch -r --merged develop | egrep -iv '(master|develop)' | sed 's/origin\///g' | xargs -n 1 git push --delete origin 
+0

Jest to również pomocne przy usuwaniu wszystkich rozgałęzień po rozwidleniu – ianstarz

+0

to jest prawdziwa prawidłowa odpowiedź :), ponieważ pozostałe nie mogą usunąć gałęzi, w tym ukośników, których używamy (mieszane) funkcja/moja-funkcja, bugfix/my-feature –

+0

To wygląda całkiem nieźle, z wyjątkiem tego, że bardzo ważne jest użycie origin/master lub origin/develop jako standard, przez który coś może zostać usunięte. Usunięcie czegoś ze zdalnego nie jest w porządku, tylko dlatego, że połączyłeś go z lokalną wersją głównej gałęzi, jest szansa, że ​​zapomniałeś wypchnąć tę gałąź do pilota, co może oznaczać usunięcie niezamkniętych gałęzi od początku. –

1

Są to polecenia Używam usunąć wszystko scalić origin/master. Zasadniczo usuwam wszystkie gałęzie połączone w master z GitHub.

git remote update -p && 
git branch -r --merged origin/master | 
grep origin | 
grep -v master | 
cut -d"/" -f2- | 
xargs git push origin --delete 
0

Tylko dla użytkowników Powershell i okien.

git branch -r --merged | findstr /v "origin/master" | %{git push origin --delete $_.Trim().Substring(7)} 
Powiązane problemy