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 ;-)

Alex
źródło
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łąź.

sleske
źródło
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

Mert
źródło
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
VonC
źródło
Zobacz także github.com/git/git/commit/…
VonC,
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?

aragaer
źródło
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ę.

Alex
źródło
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
htaccess
źródło