Usuń stare zdalne gałęzie z Gita


80

Kiedy używam autouzupełniania basha w Gicie, ciągle pokazuje mi gałęzie starych pilotów, których już nie mam. Kiedy robię git branch -la, pokazuje te stare piloty i gałęzie, a git branch -lnie chce. A ls .git/refs/remotes/także je pokazuje. Jednak nie są one obecne w moim .git / config i nie są też wyświetlane, gdy uruchamiam git remote show.

Jak więc się ich pozbyć, ponieważ moja lista autouzupełniania jest teraz zbyt długa.

Próbowałem już:

git reflog expire --expire=now --all
git gc --prune=now
rm .git/refs/remotes/theoldremote
git remote prune theoldremote

Mam również świadomość, że mogę po prostu ponownie sklonować repozytorium, ale to tylko oszustwo ;-)


Uwaga: a git remote rmteraz (git 2.0.1, czerwiec 2014) usuń najpierw gałęzie zdalnego śledzenia. Powinno to pomóc w uniknięciu sprzątania starych gałęzi. Zobacz moją odpowiedź poniżej
— VonC


Oto moja kolejna odpowiedź: stackoverflow.com/a/44129766/3835843
— Arif

Odpowiedzi:


142

Git nie usuwa (lokalnych) gałęzi zdalnego śledzenia automatycznie, jeśli gałąź została usunięta ze zdalnego repozytorium. Dodatkowo, przed wersją 2.0.1 gałęzie zdalnego śledzenia w niektórych przypadkach nie były usuwane po usunięciu pilota z konfiguracji git (zobacz odpowiedź VonC).

Aby usunąć przestarzałe gałęzie zdalnego śledzenia (gałęzie, które zostały usunięte w zdalnym repozytorium) dla jednego z twoich zdalnych repozytoriów, uruchom

git remote prune <remote>

Aby zacytować stronę podręcznika lub git remote:

suszona śliwka

Usuwa wszystkie przestarzałe gałęzie śledzenia w <nazwa>. Te przestarzałe gałęzie zostały już usunięte ze zdalnego repozytorium, do którego odwołuje się <nazwa>, ale nadal są lokalnie dostępne w "zdalnych / <nazwa>".

Z opcją --dry-run, zgłoś, które gałęzie zostaną przycięte, ale w rzeczywistości ich nie przycinaj.

Jednak z twojego pytania wygląda na to, że usunąłeś go ręcznie .git/refs/remotes/theoldremote, więc Git nie wie już o zdalnym repozytorium, do którego należały gałęzie zdalnego śledzenia. Nie tak powinieneś to robić.

Normalnym sposobem usunięcia zdalnego repozytorium jest uruchomienie

git remote rm <remote>

Spowoduje to usunięcie pilota z twojego .git/configi usunie gałęzie zdalnego śledzenia.

Jeśli po prostu usuniesz katalog poniżej .git/refs/remotes/, gałęzie pozostaną. Następnie będziesz musiał usunąć je ręcznie:

git branch -rd <remote>/<branchname>

Potrzebujesz opcji, -raby usunąć zdalną gałąź.


2
Nie, to nie to. Mówi fatal: 'kolichikov' does not appear to be a git repository.
— Alex

2
Informacje na temat automatycznego przycinania zdalnych gałęzi podczas pobierania / ściągania można znaleźć na stronie: stackoverflow.com/a/18718936/968201
— Patrick James McDougle

Jeśli uważasz, że to powolne, uaktualnij do nowszego Gita (2.0.1+ IIRC), gdzie zostało to naprawione (ponad 100x szybciej).
— odinho

Uwaga dla użytkowników prune: Dokumentacja Git mówi: „ W większości przypadków użytkownicy powinni uruchomić git gc, co wywołuje git prune. ”. Należy jednak pamiętać, że git gcnie jest to zgodne z --dry-run.
— JYL,

git branch -rd <remote>/<branchname>było tym, czego szukałem. Dziękuję Ci!
— Antoine Colson

16

używam

git push origin :remote_branch

aby usunąć oddział z serwera.

git remote prune origin

aby usunąć zdalne odniesienia, które już nie istnieją na serwerze


Nie, to nie to. Mówifatal: 'kolichikov' does not appear to be a git repository
— Alex

1
Alex, musisz uruchomić polecenie w folderze repozytorium, a nie w folderze domowym ...
— SparK

6

Uwaga: chociaż odpowiedzią jest git remote prune, wiedz, że począwszy od git 2.0.1 (25 czerwca 2014 r.), A git remote rm zaczyna się od usunięcia gałęzi zdalnego śledzenia .
Miejmy więc nadzieję, że nie powinno się czyścić starych gałęzi po pliku git remote rm.

Zobacz commit b07bdd3 autorstwa Jens Lindström ( jensl)

remote rm: usuń zdalną konfigurację jako ostatnią

Podczas usuwania zdalnego, usuń gałęzie zdalnego śledzenia przed usunięciem zdalnej konfiguracji.
W ten sposób, jeśli operacja nie powiedzie się lub zostanie przerwana podczas usuwania gałęzi zdalnego śledzenia, polecenie może zostać ponownie uruchomione, aby zakończyć operację .


Ale jeśli musisz, proste git fetchmoże wystarczyć, pod warunkiem, że ustawiłeś najpierw:

git config --global fetch.prune true
cd /path/to/repo
git config remote.origin.prune true


4

Nie wysyłaj niczego do gałęzi, aby ją usunąć:

git push remote :remote_branch

Jest gdzieś w dokumentacji, ale nie jest to tak naprawdę oczywiste.

A może źle zrozumiałem twoje pytanie?


2
„Jest gdzieś w dokumentacji, ale nie jest to tak naprawdę oczywiste”. takie jestgit
— mnagel

Przez „zdalne” rozumiałem nazwę twojego zdalnego repozytorium. Takie jak „pochodzenie” lub cokolwiek innego. Ale zaczynam myśleć, że miałeś na myśli coś innego niż zwykłe usunięcie zdalnej gałęzi.
— aragaer,

Coś innego, takiego jak to: stackoverflow.com/questions/1072171/ ...
— aragaer

4

Ok, rozumiem. Problem polegał na tym, że piloty już nie istnieją, ale istnieją gdzieś w bazie danych git. Ponownie dodałem piloty, a potem zrobiłem

git remote prune theremote
git remote rm theremote
git gc --prune=now

Potem znikają z listy. Jakoś nie usunąłem ich poprawnie, zanim zgaduję.


Wypróbowałem wszystko z wielu źródeł i jedyną rzeczą, która działała, było ponowne dodanie problemu zdalnego, a następnie usunięcie go. Dzięki!
— jc00ke

0

Byłem zdezorientowany, gdy zdalne gałęzie, które zostały usunięte po stronie serwera, nadal pojawiały się, gdy uruchomiłem:

$ git branch --all

Następujące polecenie naprawiło to dla mnie (w wersji git 2.25.0):

$ git remote update --prune
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.