Pracuję na dwóch różnych komputerach (A i B) i przechowuję wspólnego git zdalnego w katalogu dropbox.
Powiedzmy, że mam dwie gałęzie, master i devel. Oba śledzą swoje zdalne odpowiedniki origin / master i origin / devel.
Teraz na komputerze A usuwam rozwijanie gałęzi, lokalnie i zdalnie.
git push origin :heads/devel
git branch -d devel
Uruchomiony git branch -a
na komputerze, pojawia się następujący wykaz oddziałów.
- mistrz
- pochodzenie / HEAD
- pochodzenie / mistrz
Działając git fetch
na komputerze B, mogę usunąć lokalną gałąź rozwoju git branch -d devel
, ale nie mogę usunąć zdalnej gałęzi rozwoju.
git push origin :heads/devel
zwraca następujące komunikaty o błędach.
błąd: nie można przekazać do niekwalifikowanego miejsca docelowego: heads / proxy3d Refspec
docelowy nie pasuje do istniejącego ref na pilocie ani nie zaczyna się od ref /, i nie możemy zgadnąć prefiksu na podstawie referencji źródłowej.
fatal: Odległy koniec odłożył słuchawkę nieoczekiwanie
git branch -a
wciąż wyświetla pochodzenie / rozwój w zdalnych gałęziach.
Jak mogę wyczyścić zdalne oddziały z komputera B?
źródło
Odpowiedzi:
Po pierwsze, jaki jest wynik
git branch -a
na maszynie B?Po drugie, już usunięte
heads/devel
naorigin
, więc dlatego nie można go usunąć z urządzenia B.Próbować
lub
lub
i możesz dodać
--dry-run
na końcu swojegogit
oświadczenia, aby zobaczyć wynik jego uruchomienia bez faktycznego uruchomienia.Dokumenty dla
git remote prune
igit branch
.źródło
git remote prune origin
pracował dla mnie =>* [pruned] origin/my-old-branch
git remote prune origin --dry-run
pokazuje, co zostanie usunięte bez robienia tego.git fetch origin --prune
był idealny do usuwania usuniętych gałęzigit branch -vv
następuje,git branch -D branchname
a na koniec śliwka jest najlepszym sposobem.git config remote.origin.prune true
Rozważ uruchomienie:
Regularnie w każdym repozytorium, aby usunąć lokalne oddziały, które śledziły zdalną gałąź, która jest usuwana (już nie istnieje w zdalnej repozytorium GIT).
Można to dodatkowo uprościć
jest to
per-repo
ustawienie, dzięki któremu każda przyszłośćgit fetch or git pull
będzie automatycznie przycinana .Aby skonfigurować to dla użytkownika, możesz również edytować globalny plik .gitconfig i dodać
Zaleca się jednak wykonanie tej czynności za pomocą następującego polecenia:
lub zastosować go w całym systemie (nie tylko dla użytkownika)
źródło
Oto skrypt bash, który może to dla Ciebie zrobić. Jest to zmodyfikowana wersja skryptu http://snippets.freerobby.com/post/491644841/remove-merged-branches-in-git . Moja modyfikacja umożliwia obsługę różnych zdalnych lokalizacji.
źródło
sed
stronach. Zastąpićsed 's/\(.*\)\/\(.*\)/\1/g'
przezsed 's/\([^/]*\)\/\(.*\)/\1/g'
Polecenie to „na sucho” usunie wszystkie zdalne (
origin
) połączone gałęzie opróczmaster
. Możesz to zmienić lub dodać dodatkowe gałęzie po master:grep -v for-example-your-branch-here |
Jeśli wygląda dobrze, usuń
--dry-run
. Dodatkowo możesz najpierw przetestować to na widelcu.źródło
Jeśli
git branch -r
pokazuje wiele oddziałów zdalnego śledzenia, które nie są zainteresowane i chcesz je usunąć tylko z lokalnego, użyj następującego polecenia:Bezpieczniejszą wersją byłoby usunięcie tylko scalonych:
Może to być przydatne w dużych projektach, w których nie potrzebujesz gałęzi funkcji innych członków drużyny, ale istnieje wiele gałęzi zdalnego śledzenia pobranych przy pierwszym klonie.
Jednak sam ten krok nie jest wystarczający, ponieważ te usunięte gałęzie zdalnego śledzenia wrócą później
git fetch
.Aby zatrzymać pobieranie tych gałęzi zdalnego śledzenia, musisz jawnie określić odnośniki do pobrania w .git / config :
W powyższym przykładzie mamy tylko sprowadzić
master
,develop
i zwolnić oddziały, nie krępuj się dostosować, jak trzeba.źródło
git fetch origin branchname
lub utworzyć alias,ft = "!f() { git fetch origin $(git rev-parse --abbrev-ref HEAD);}; f"
aby pobrać tylko bieżącą gałąź (mój osobisty ulubiony). Twoje zdrowie.-r
flaga? Widzę, żexargs
ma-R
kłótnię, ale nic nie znalazłem-r
. Teoretycznie, jeśli dobrze pamiętam, jak toxargs
działa, nawet bez-r
niego powinno działać.| xargs git branch -d
. Ponadto, usuwając-r
opcję (--remotes
) z , usuwamygit branch -d
tylko lokalne gałęzie (co może być wystarczające, biorąc pod uwagę, że domyślnie igit branch
tak nie pokazują zdalnych gałęzi).xargs -r
a mianowicie--no-run-if-empty
, oznacza to rozszerzenie GNU, oto miłe wytłumaczenie .Usuwanie jest zawsze trudnym zadaniem i może być niebezpieczne !!! Dlatego najpierw wykonaj następujące polecenie, aby zobaczyć, co się stanie:
Postępując w ten sposób jak wyżej,
git
dostarczy ci listę tego, co by się stało, gdyby poniższe polecenie zostało wykonane.Następnie uruchom następujące polecenie, aby usunąć wszystkie gałęzie ze zdalnego repozytorium, które nie znajdują się w lokalnym repozytorium:
źródło
-n
(polecenie „na sucho”) do tego polecenia, aby wyświetlić podgląd zmian, a następnie, jeśli wszystko jest w porządku, wywołaj je ponownie bez-n
.Oto jak to zrobić za pomocą SourceTree (v2.3.1):
1. Kliknij Pobierz
2. Zaznacz „Przycinaj gałęzie śledzenia ...”
3. Naciśnij OK
4. 😀
źródło
Muszę tu dodać odpowiedź, ponieważ inne odpowiedzi albo nie obejmują mojej sprawy, albo są niepotrzebnie skomplikowane. Używam github z innymi programistami i chcę tylko, aby wszystkie lokalne oddziały, których piloty zostały (prawdopodobnie połączone i) usunięte z PR github, zostały usunięte za jednym razem z mojej maszyny. Nie, rzeczy takie jak
git branch -r --merged
nie obejmują gałęzi, które nie zostały scalone lokalnie, lub tych, które w ogóle nie zostały scalone (porzucone) itp., Więc potrzebne jest inne rozwiązanie.W każdym razie, pierwszy krok uzyskałem z innych odpowiedzi:
git remote prune origin
Wydawało mi się, że próba na sucho zrobiłaby to samo w moim przypadku, więc wybrałem najkrótszą wersję, aby było to proste.Teraz
git branch -v
należy oznaczyć gałęzie, których piloty są usuwane jako[gone]
. Dlatego wszystko, co muszę zrobić, to:Tak proste, że usuwa wszystko, czego chcę dla powyższego scenariusza.
Mniej powszechna
xargs
składnia polega na tym, że oprócz Linuksa działa również na komputerach Mac i BSD. Ostrożnie, to polecenie nie jest suchym przebiegiem, więc wymusi usunięcie wszystkich gałęzi oznaczonych jako[gone]
. Oczywiście, że to git nic nie przepadnie na zawsze, jeśli zobaczysz, że gałęzie usunięte, o których pamiętasz, że chcesz je zachować, zawsze możesz je cofnąć (powyższe polecenie wyświetli ich skrót podczas usuwania, więc to prostegit checkout -b <branch> <hash>
.źródło
Przycinaj te same gałęzie z lokalnych i zdalnych odnośników (w moim przykładzie z
origin
).źródło