Jak usunąć niepoprawne odwołanie do oddziału z Git?

731

W moim bieżącym repozytorium mam następujące dane wyjściowe:

$ git branch -a
* master
  remotes/origin/master
  remotes/public/master

Chcę usunąć remotes/public/masterz listy oddziałów:

$ git branch -d remotes/public/master
error: branch 'remotes/public/master' not found.

Ponadto wynik działania git remotejest dziwny, ponieważ nie zawiera public:

$ git remote show 
origin

Jak mogę usunąć „piloty / public / master” z listy oddziałów?

Zaktualizuj, wypróbowałem git pushpolecenie:

$ git push public :master
fatal: 'public' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
cmcginty
źródło
31
Czy git remote prune [remote-name]lub git fetch -p [remote-name]nie działać w scenariuszu? Robienie tego przy użyciu git gcjest o wiele silniejsze niż zwykle potrzebne.
rjmunro
6
git remote prune [remote-name]nie będzie działać z git svn, chociaż żaden też git gc... git branch -rd origin/namenie działa. @Casey, prawdopodobnie powinieneś wybrać drugą odpowiedź - jest to nieco mniej niebezpieczne.
naught101
4
Uwielbiam to pytanie. Wraca prawie co miesiąc
oluckyman
Powiązany, jeśli nie cel dupe: Usuń gałąź Git zarówno lokalnie, jak i zdalnie .
2
Aby uniknąć błędu gitter n00b w przyszłości, zalecam użycie innej przykładowej gałęzi niż master... szczególnie podczas usuwania na pilocie.
absynce

Odpowiedzi:

743

Być może potrzebujesz czyszczenia:

git gc --prune=now

lub może potrzebujesz suszonych śliwek:

git remote prune public

suszona śliwka

Usuwa wszystkie przestarzałe gałęzie śledzenia w obszarze <nazwa>. Te nieaktualne 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 nie przycinaj ich.

Wydaje się jednak, że należy je wcześniej wyczyścić

git remote rm public 

rm

Usuń pilota o nazwie <nazwa>. Wszystkie gałęzie zdalnego śledzenia i ustawienia konfiguracji dla pilota są usuwane.

Może to oznaczać, że ręcznie zmodyfikowałeś plik konfiguracyjny i tak się nie stało lub masz problemy z uprawnieniami.

Może uruchom to jeszcze raz i zobacz, co się stanie.


Kontekst porady

Jeśli spojrzysz na dzienniki wersji , zauważysz, że zasugerowałem więcej „poprawnych” technik, które z jakiegokolwiek powodu nie chciałyby działać w ich repozytorium.

Podejrzewałem, że OP zrobił coś, co sprawiło, że ich drzewo pozostało w niespójnym stanie, co spowodowało, że zachowywał się nieco dziwnie, i musiałem git gcnaprawić pozostawione za nim cruft.

Zazwyczaj git branch -rd origin/badbranch wystarcza dla nuking lokalnego oddziału śledzenia, lub git push origin :badbranchza nuking zdalną gałąź, i zazwyczaj będzie nie trzeba zadzwonićgit gc

Kent Fredric
źródło
4
Nie chcę usuwać gałęzi po drugiej stronie. Myślę, że istnieje subtelna różnica.
cmcginty,
2
er, pytanie brzmi „jak usunąć zdalną gałąź”. Takie są te ścieżki.
Kent Fredric
1
Przeformułuję temat, jeśli to wyjaśni, o co pytam, ale polecenie pokazuje dokładnie, na czym polega mój problem.
cmcginty,
40
git gcnie jest tu potrzebne, ale git remote prunesprawia, że ​​czuję się bezpieczniejszy niż ręczne usuwanie rzeczy git branch -rd, ponieważ git sprawdza, które zdalne gałęzie są wykonywane.
Mike Seplowitz,
3
to nie działało dla mnie - jednak dział „git -rd” działał dobrze.
dsummersl
683

Wszystko, co musisz zrobić, to

git fetch -p

Spowoduje to usunięcie wszystkich lokalnych oddziałów, które są zdalnie usuwane.

Jeśli korzystasz z git 1.8.5+, możesz ustawić to automatycznie

git config fetch.prune true

lub

git config --global fetch.prune true
Pawan Maheshwari
źródło
7
Tego też szukałem - pytanie opisuje scenariusz bardziej skomplikowany niż zwykły.
rjmunro
22
Szukam sposobu na usunięcie lokalnych oddziałów, w których odpowiedni pilot został usunięty, ale to nie działa dla mnie. Masz pomysł, dlaczego?
jackocnr
11
To usuwa gałęzie wymienione w zdalnym / źródłowym, ale nie usuwa lokalnych gałęzi śledzących, co jest równie ważne.
BlueRaja - Danny Pflughoeft
@Ciastko Ponieważ nie cofnąłeś mojej pierwszej edycji (która naprawiała nieprawidłowe informacje o Git 1.8.5+), teraz zrobiłeś to niepoprawną. Moją drugą edycją było naprawienie tego, co wstawiłem, co było niepoprawne, co jest teraz ponownie (wraz z wycofaniem). Proszę przejść i cofnąć jeszcze jedną edycję, aby mieć oryginał. Dzięki.
ferventcoder
@ferventcoder Dwukrotnie sprawdziłem twoją ostatnią edycję i przywróciłem ją. OP może ponownie wycofać, jeśli mu się to nie spodoba. Dzięki.
319
git push public :master

Spowodowałoby to usunięcie zdalnej gałęzi o nazwie wskazanej przez masterKent Fredrica.

Aby wyświetlić listę oddziałów zdalnego śledzenia:

git branch -r

Aby usunąć gałąź zdalnego śledzenia:

git branch -rd public/master
Alan Haggai Alavi
źródło
6
Pomogło mi to usunąć zdalną gałąź duchów git-svn.
Nick
9
git branch -rd removed_remote/branchpracował dla mnie, podczas gdy git gc --prune=nowbył bezwartościowy.
rchampourlier
2
Byłem w stanie korzystać git prunebez żadnych problemów, ale mój współpracownik, który rozwidlił nasze główne repozytorium ** TYLKO MOŻE ** użył git branch -rd public/masterrozwiązania w stylu, aby oczyścić swoje środowisko.
Abel
3
git branch -rd public/masterbyło to, czego mi brakowało. Miałem heroku/masteri herkou/master... lol woops
Aaron
@rchampourlier Nie w 100% bezwartościowy - jeśli twoje repozytorium git jest duże, usunięcie nieużywanych gałęzi może zwolnić dużo miejsca na dysku w niektórych sytuacjach.
peterh - Przywróć Monikę
159

Wszystko, co musisz zrobić, to

$ git branch -rd origin/whatever 

To takie proste. Nie ma powodu, aby dzwonić do gc tutaj.

jpswain
źródło
1
jak „wypychasz” to usunięcie do github?
Thufir,
14
@Thufir Nie o to chodziło w tym pytaniu. To pytanie dotyczyło szczególnie sytuacji, gdy w lokalnym repozytorium występuje nieprawidłowe odwołanie zdalne, ale gałąź ta już nie istnieje na zdalnym serwerze. Odpowiedź na twoje pytanie brzmi: $ git push origin: cokolwiek
jpswain
Tak, jeśli coś zdarzy się na zdalnym repozytorium, w którym gałąź jest usuwana, ale nadal masz odniesienie do tej zdalnej gałęzi na komputerze lokalnym, musisz zrobić to, co podałem w mojej pierwotnej odpowiedzi, aby to wyczyścić.
jpswain,
6
Jeśli masz duże zadanie czyszczenia (wiele zwisających pilotów), możesz po prostu usunąć wszystkie zdalne gałęzie za pomocą czegoś takiego, git branch -rd $(git branch -r)a następnie przywrócić prawidłowe, wykonując pobieranie.
nobar
Moja sytuacja była taka, że ​​zwykłem git config -ezmieniać nazwę mojego pilota. Zmieniłem nazwę pilota minena origin. To było najlepsze rozwiązanie dla mnie:git branch -rd $(git branch -r | grep 'mine/')
Steven Lu
70

git gc --prune=now nie jest tym, czego chcesz.

git remote prune public

lub git remote prune origin# jeśli to jest zdalne źródło

jest tym, czego chcesz

tongueroo
źródło
6
@Casey $ git gc # lubi defragmentację plików git w celu przyspieszenia repozytorium $ git remote prune origin # wyczyści skasowane stare zdalne gałęzie, które wyświetlają się z "git branch -r | grep origin". Takie jest pytanie, w które wierzę. Tak więc polecenia są zupełnie inne.
tongueroo
29

Przyjęta odpowiedź nie działała dla mnie, gdy referencja była zapakowana. Robi to jednak:

$ git remote add public http://anything.com/bogus.git
$ git remote rm public
Chris
źródło
Pracował dla mnie. Zwykła gałąź git -d nie działała, zwrócił błąd, że gałąź nie istnieje, ponieważ usunąłem początek o nazwie „oryginalny”, który został utworzony przez pomyłkę, bezpośrednio w pliku .git / config.
micrub
Jest to metoda, której musiałem użyć do usunięcia gałęzi, które zostały przypadkowo pominięte w moim .git / config (które musiały zostać przebudowane z powodu niezwiązanego z tym uszkodzenia). Szkoda, że ​​ta odpowiedź była tak daleko w tyle, że nie zauważyłem jej, aż w końcu znalazłem rozwiązanie i poszedłem dodać je do zaakceptowanej odpowiedzi!
taranaki,
Właśnie tego potrzebowałem po użyciu svn2git. Było wiele oddziałów pilotów / svn / *. Najpierw musiał stworzyć fałszywy pilot svn.
Sam
7

W moim przypadku próbowałem usunąć wpisy, które zostały zapisane .git/packed-refs. Możesz edytować ten zwykły plik tekstowy i usuwać z niego wpisy, które git br -Dnie umieją dotykać (przynajmniej w wersji 1.7.9.5).

Znalazłem to rozwiązanie tutaj: https://stackoverflow.com/a/11050880/1695680

ThorSummoner
źródło
wow, to mi pomogło. Mój kolega próbował, uruchom ponownie VS, Uruchom ponownie komputer, nic nie działało, usunął lokalne repozytorium i wyciągnął wszystko, aby się tego pozbyć :)
Esen
1
Dzisiaj pochyliłem się, że ten plik spakowanych odnośników jest tworzony jako część git gc, kiedy spakuje twoje commity do wysoce skompresowanego archiwum, przeniósł również odwołania do jednego zwykłego pliku tekstowego, być może w celach optymalizacji; Mam nadzieję, że przyszłe wersje git mogą zawierać git br -D ...spakowane referencje.
ThorSummoner,
3

Nie wiedziałem o tym git branch -rd, więc sposobem, w jaki rozwiązałem takie problemy dla siebie, jest traktowanie mojego repozytorium jako zdalnego repozytorium i zdalne usuwanie. git push . :refs/remotes/public/master. Jeśli inne sposoby nie działają i masz jakieś dziwne odniesienia, których chcesz się pozbyć, ten surowy sposób jest pewny. Daje dokładną precyzję do usuwania (lub tworzenia!) Dowolnego rodzaju referencji.

clacke
źródło
2

Tylko nieznacznie powiązane, ale nadal mogą być pomocne w tej samej sytuacji, co my - korzystamy z sieciowego udziału plików w naszym zdalnym repozytorium. W zeszłym tygodniu wszystko działało, w tym tygodniu pojawił się błąd „Zdalne pochodzenie nie reklamowało Ref dla referencji oddziałów / szefów / mistrza. Ten Ref może nie istnieć w pilocie lub może być ukryty przez ustawienia uprawnień”

Ale wierzyliśmy, że nic nie zrobiono, by zepsuć rzeczy. NFS robi migawki, więc przejrzałem każdą „poprzednią wersję” i zobaczyłem, że trzy dni temu rozmiar repozytorium w MB zmniejszył się z 282 MB do 33 MB, a teraz istniało około 1403 nowych plików i 300 folderów. Zapytałem moich współpracowników, a jeden próbował tego dnia naciskać, a potem go anulowałem.

Użyłem funkcji „Przywróć” NFS, aby przywrócić ją tuż przed tą datą, a teraz wszystko działa poprawnie. Próbowałem wcześniej suszonych śliwek, chyba nie pomogłem. Może trudniejsze porządki by zadziałały.

Mam nadzieję, że to może kiedyś pomóc komuś innemu!

Sójka

JGlass
źródło
2

Miałem podobny problem. Żadna z odpowiedzi nie pomogła. W moim przypadku miałem dwa usunięte zdalne repozytoria pokazujące się na stałe.

Moim ostatnim pomysłem było ręczne usunięcie wszystkich odniesień do niego.

Powiedzmy, że repozytorium nosi nazwę „Repo”. Zrobiłem:

find .git -name Repo 

Tak więc usunąłem odpowiednie pliki i katalogi z folderu .git ( ten folder można znaleźć w aplikacji Rails lub na komputerze https://stackoverflow.com/a/19538763/6638513 ).

Potem zrobiłem:

grep Repo -r .git

Znaleziono niektóre pliki tekstowe, w których usunąłem odpowiednie wiersze. Teraz wszystko wydaje się w porządku.

Zwykle powinieneś zostawić tę pracę do zrobienia.

Keinstein
źródło