Mam członka zespołu, który przypadkowo przesunął ponad 150 swoich lokalnych oddziałów do naszego centralnego repozytorium. Na szczęście wszystkie mają ten sam prefiks. Używając tego przedrostka, czy istnieje polecenie git lub fajny mały skrypt powłoki, którego mogę użyć, który usunie je wszystkie na raz?
128
$ git branch -r | awk -F/ '/\/APR/{print $2}' | xargs -I {} git push origin :{} error: unable to push to unqualified destination: APR-04-DPH The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to 'GIT_URL'
git branch -r | awk -F/ '/\/APR/{print $2}'
, można zobaczyć cały kwiecień przedrostkiem nazwy oddziałów na liście?APR-04-DPH
gałąź została już usunięta. Spójrz na te odpowiedzi na pytania: to i to, a także to . Odpowiedzi na te pytania dotyczą tego samego problemu, możesz chcieć samodzielnie przetestować rozwiązania.git branch -r | awk -F/ '/\/PREFIX/{print $2"/"$3}' | xargs -I % git push origin --delete %
Jeśli podoba Ci się prostsze podejście, na przykład usuń 3 lub 4 gałęzie:
Ważne: działa tylko na Git 1.7.0 i nowszych.
źródło
git branch -r | awk -F/ '/\/PATTERN/{print $2}' | xargs git push origin --delete
Podziękowania dla Neevek za świetne i eleganckie rozwiązanie!
Ale mam problemy z ukośnikami w nazwach gałęzi (używam Git Flow) z powodu
awk
separatora pól/
(-F
opcja)Więc moje rozwiązanie jest oparte na Neevek , ale poprawnie analizuje nazwy gałęzi z
/
. W tym przypadku przypuszczam, że zadzwonił twój pilotorigin
. Polecenie do usuwania zdalnych gałęzi o nazwach zaczynających się odPATTERN
:I nie zapomnij sprawdzić, co zamierzasz usunąć:
PRZYDATNA WSKAZÓWKA: Jeśli nazwy oddziałów (bez
origin/
przedrostków) są przechowywane w pliku tekstowym (jedna nazwa gałęzi w każdym wierszu), po prostu uruchom:źródło
xargs -a file -L
zamiastcat file | xargs
. Jeszcze prostszexargs -a file git push --delete origin
.To może być podwójna odpowiedź, ale poniżej przetestowane i działało idealnie dla mnie.
git branch -D backticks $ (git branch --list 'feature / *' backticks )
źródło
To samo z grep:
git branch -r | grep -Eo 'PREFIX/.*' | xargs -i git push origin :{}
.branch -r
pokazujeorigin/prefix/branchname
. Więc to zajmieprefix/branchname
.źródło
xargs -I {} git push origin :{}
, nie-i
.-i
ponieważ używa domyślnego zamiennika,{}
ale z-I
tobą możesz zadeklarować własny. ... właśnie znalazłem w instrukcji:-i ... the same as -I{}
Rozwiązanie Neevek jest eleganckie, ale może być lepsze: proponowane rozwiązanie wywołuje „git push” raz na oddział, co oznacza dodatkową sieć w obie strony na oddział do usunięcia. Ponieważ i tak używasz awk, dlaczego nie użyć go do przedrostka „:”, a wtedy xargs może wywołać „git push” dokładnie raz i usunąć wszystkie gałęzie naraz:
Uruchom na sucho, aby wyświetlić gałęzie, które zostaną usunięte:
Ostateczne rozwiązanie, aby faktycznie wypchnąć usunięte:
źródło
xargs: replstr may not be empty
rozwiązanie Neevek, może wersję git ..git version 1.9.5
Ale to zadziałało świetnie. Dzięki wam obojguzasób https://coderwall.com/p/eis0ba
źródło
Dzięki Steve'owi i Neevekowi znalazłem rozwiązanie, które działało całkiem nieźle i uznałem, że warto się nim podzielić:
Rozwiązanie Steve'a zadziałało dla mnie z jedną drobną korektą. Moje piloty zostały nazwane,
origin/feature/some-feature-name
więc przyciąłem twojeawk
:Teraz robi ładny mały przepływ usuwania:
Zastanawiałem się, czy ktoś miałby jakieś pomysły na bardziej eleganckie rozwiązanie, które mogłoby wypisać coś takiego (moje skrypty CLI są dość kiepskie, więc zajęłoby mi trochę czasu, zanim to zrozumiałem):
Dałoby to ładne pojedyncze wyjście z jednym żądaniem sieciowym:
źródło
Dzięki Neevek. To działało dobrze po ponownej konfiguracji dla moich celów:
Musiałem również wziąć pod uwagę strukturę folderów. Moje gałęzie funkcji są w strukturze folderów, takiej jak pochodzenie / funkcja / PREFIX-FEATURENUMBER. Musiałem więc zbudować swój wzór z 2 $ = folder + 3 $ = nazwa gałęzi.
źródło
Wszyscy używają
awk
, nie wiem dlaczego. Czuję, że to bardziej złożone. Oto, czego używam, aby usunąć wszystkie zdalne gałęzie na moimfork
pilocie:Dodaj
grep
międzyxargs
a,sed
jeśli chcesz przefiltrować listę tylko do podzbioru zdalnych gałęzi.źródło
origin/blaprefix_anotherbla
. Ale użyciesed
poradziło sobie z tym dobrze. Kolejną zaletą tego podejścia jest to, że używam Bitbucket i nie muszę ręcznie wprowadzać hasła uwierzytelniającego dla każdego usunięcia gałęzi. Ten usuwa wszystkie gałęzie w jednej partii.git branch -r | egrep 'origin/greenkeeper' | sed 's/origin\///' | xargs -I {} git push origin --delete {}
Zdaję sobie sprawę, że jest to dla polecenia git, ale jeśli szukasz alternatywnego rozwiązania, aby zrobić podobny lub taki sam wynik:
Możesz to zrobić tutaj (Git Remove Remote Branches):
Następnie wybierz żądane gałęzie:
Upewnij się, że masz uprawnienia do usuwania zdalnych gałęzi.
źródło
Github ma również fajny interfejs użytkownika i mechanizm szybkiego usuwania gałęzi, jeśli wolisz używać interfejsu użytkownika
źródło
Próbowałem usunąć wszystkie zdalne gałęzie pochodzenia / wydania / r1-1 *, dlatego następujący wiersz poleceń działał dobrze.
źródło
Nie mogłem użyć awk, ponieważ używamy struktury ukośnika dla nazw naszych gałęzi.
Spowoduje to pobranie wszystkich gałęzi zdalnych, pobranie tylko jednego dla jednego użytkownika, zdalne sterowanie ciągiem „origin /” i wykonanie usunięcia na każdym z nich.
źródło
Próba:
Usuń zdalne oddziały:
Usuń tylko w pełni połączone zdalne gałęzie:
Wyjaśnienie:
sed "s/origin\///"
usunieorigin/
z nazwy oddziału. Bez zdejmowania tego otrzymałem:remote ref does not exist
źródło
Poprzednie odpowiedzi pomogły mi usunąć wszystkie gałęzie wydań z 2018 r. Uruchomiłem to w wierszu polecenia systemu Windows 10. Zainstalowałem brzęk , więc polecenia podobne do Linuksa działają dla mnie.
Próba:
Jeśli próba pokazuje gałęzie, które nie są zdalne / pochodzenia. Uruchom poniżej polecenie git prune, aby naprawić i sprawdzić ponownie.
Usuń, jeśli jesteś zadowolony z powyższego wyniku:
Jeśli widzisz:
error: unable to delete 'release-...2018': remote ref does not exist
. Następnie uruchom poprzednie polecenie czyszczenia i spróbuj ponownie.źródło
Ostrzeżenie: spowoduje to usunięcie wszystkich zdalnych gałęzi. Używaj ostrożnie.
Myślę, że mój sposób usuwania zdalnych oddziałów jest najlepszy.
Ostrzeżenie: spowoduje to usunięcie wszystkich zdalnych gałęzi. Używaj ostrożnie.
źródło