ostrzeżenie: zdalne HEAD odnosi się do nieistniejącego ref, niezdolnego do pobrania

86

Wydaje się, że jest to popularny błąd z różnych przyczyn.

Mam proste repozytorium Git o nazwie „kiflea.git”, sklonowałem je w ten sposób:

git clone git://kipdola.be/kiflea.git

Następnie git mówi mi: warning: remote HEAD refers to nonexistent ref, unable to checkout.

I tak, w mapie nie ma plików wersjonowanych, z wyjątkiem katalogu .git. W każdym razie jedyne, co muszę zrobić, to:

cd kiflea
git checkout master

I działa, wszystkie pliki tam są. Ale pomyślałem, że sklonowanie repozytorium automatycznie sprawdza wzorzec, więc co dokładnie się dzieje i jak to naprawić?

Zauważyłem, że po wykonaniu git checkout mastertej czynności zostaje dodany do mojego lokalnego pliku konfiguracyjnego .git:

[branch "master"]
    remote = origin
    merge = refs/heads/master

Prawdopodobnie ciekawie jest wiedzieć, że to repozytorium git w odległej przeszłości było repozytorium svn.

Ps: podczas przeglądania czystego repozytorium za pomocą gitweb wyraźnie widać mastertam gałąź: http://kipdola.be/gitweb/?p=kiflea.git;a=summary

skerit
źródło
2
Co git ls-remote originci pokazuje?
CB Bailey,
Tak samo jest przed checkout masterbitem i po nim :25f600739343a7ce32d6311a1e6140870774810b refs/heads/master
skerit
1
Wygląda na to, że zdalne repozytorium utraciło (lub nigdy nie miało) pliku HEAD. Czy masz do niego bezpośredni dostęp? Jeśli tak, zobacz tutaj
CB Bailey,
1
Jeśli sklonujesz repozytorium i nie określisz gałęzi, spróbuje użyć zdalnej głowicy. Jak wyjaśniono poniżej w odpowiedziach, nie możesz bezpośrednio wpływać na którą gałąź. Jednak sprawdzając inną gałąź w czasie klonowania, unikasz tego sprawdzania. W twoim przypadku wydaje się, że mistrz istnieje, ale zdalne głowy wskazują gdzie indziej, więc użyj:git clone -b master <url> <dir>
eckes

Odpowiedzi:

125

Te warning: remote HEAD refers to nonexistent ref, unable to checkout.środki, które pilot (gołe) repozytorium zawiera odniesienie oddział w pliku o nazwie HEAD, która nie pasuje do żadnego opublikowanego oddział w tym samym repozytorium.

Zauważ, że ostrzeżenie oznacza tylko, że git nie wykonał checkout. Poza tym sklonowane repozytorium jest w porządku. Po prostu zrób, git branch -aaby zobaczyć możliwe gałęzie i git checkout the-branch-you-wantobejść problem.

Zwykle dzieje się tak, ponieważ domyślna zawartość tego pliku ( .git/HEADlub zwykła zawartość dla HEADczystych repozytoriów) ref: refs/heads/mastermówi, że jeśli ktoś idzie do clonetego repozytorium, powinien domyślnie sklonować gałąź refs/heads/master. Domyślnie Git utworzy gałąź lokalną bez refs/heads/prefiksu (czyli masterdomyślnie). Spróbuj git help symbolic-refuzyskać więcej informacji.

Problem z tą sytuacją polega na tym, że Git nie udostępnia metody modyfikowania zdalnych referencji symbolicznych, więc albo używasz czegoś, co zaimplementował dostawca hostingu Git (np. Ustawienia - Domyślna gałąź w GitHubie, jeśli masz uprawnienia administratora), albo musisz użyć nazwy oddziału masterjako gałąź domyślna (ponieważ jest to domyślna wartość dla tego symbolicznego odniesienia).

Jeśli masz dostęp do powłoki zdalnej git repo, można po prostu cd path/to/bare/git/repo; git symbolic-ref HEAD refs/heads/XYZgdzie XYZjest nazwą oddziału chcesz używać domyślnie.

Jednym ze sposobów rozwiązania tego problemu jest utworzenie nowego zdalnego czystego repozytorium bez zatwierdzeń, a następnie zrobienie tego, git push name-of-the-remote my-special-branch-nameco spowoduje, że repozytorium będzie zawierało pojedynczą gałąź, my-special-branch-nameale HEADsymboliczny odnośnik nadal będzie zawierał domyślną wartość wskazującą master. W rezultacie otrzymasz wspomniane ostrzeżenie.

Mikko Rantalainen
źródło
20
Zauważ, że ostrzeżenie oznacza tylko, że git nie zrobił checkout. Poza tym sklonowane repozytorium jest w porządku. Zrób, git branch -aaby zobaczyć możliwe gałęzie i git checkout the-branch-you-want„naprawić” problem.
Mikko Rantalainen
2
Przynajmniej można uniknąć używania zdalnej głowicy podczas używania git clone -b master(lub jakiejkolwiek nazwy istniejącej gałęzi).
eckes
Zrobiłem dokładnie to, co napisałeś w ostatnim akapicie; W gałęzi znajdują się pliki w gołym repozytorium (w gitlab), ale klon wydaje się być pusty. {git branch -a} nic nie pokazuje. {git clone -b my-special-branch-name <url>} też nie działa (zdalny koniec się zawiesił).
Ed Randall
„Naprawiłem” to, kopiując refs / remotes / my-special-branch-name do refs / heads i edytując HEAD tak, aby pasował (w czystym repozytorium gitlab). Mogłem wtedy pomyślnie sklonować przy użyciu -b nazwa-gałęzi-specjalnej. Ale jaki jest prawidłowy sposób skonfigurowania samego pustego repozytorium po cyklu "init" / "push", aby klon -b nie napotkał problemu, proszę?
Ed Randall
1
@EdRandall, cd path/to/bare/git/repo; git symbolic-ref HEAD refs/heads/XYZgdzie XYZjest domyślną nazwą gałęzi, której chcesz użyć, jeśli git clonezostała wykonana bez -bflagi. Jeśli masz inny problem, zadaj nowe pytanie zamiast dodawać pytania jako komentarze.
Mikko Rantalainen
10

Miałem ten sam problem, ponieważ nie korzystałem już z masteroddziału i zgubił się w moim lokalnym i zdalnym repozytorium.

Zdalne repozytorium nadal miało HEADustawione ustawienie master, zmieniłem je na jedną z gałęzi zdalnej, z której faktycznie korzystam i wszystko działa dobrze.

Jeśli możesz uzyskać dostęp do zdalnego repozytorium:

  • Idź do swojego remote_repo.git;
  • Edytuj HEADplik
  • Zmień ref: refs/heads/masternaref: refs/heads/your_branch
Marco Bonifazi
źródło
oba warunki są możliwe, master został usunięty, a HEAD nadal wskazuje na niego lub HEAD został zmieniony na gałąź, która została później usunięta. Chyba (od czasu sprawdzenia prac mistrzowskich) druga opcja to nasz przypadek. @MarcoBonifazi W takim przypadku „zmiana” byłaby zastąpiona broken_branchprzez refs/heads/master.
eckes
2
czy istnieje „właściwy” sposób ustawienia gałęzi HEAD w ten sposób bez uciekania się do edycji plików?
Ed Randall,
@EdRandall, cd path/to/bare/git/repo; git symbolic-ref HEAD refs/heads/XYZgdzie XYZjest domyślną nazwą gałęzi, której chcesz użyć, jeśli git clonezostanie wykonana bez -bflagi, jak powiedziałem w innym komentarzu.
Mikko Rantalainen
7

Tak, jest to związane z tym, że twój klon git próbuje pobrać gałąź inną niż master. Po prostu zrób to

git clone user@git-server:project_name.git -b branch_name /some/folder

Pomoże ci to sklonować dokładną gałąź poprzez jej nazwę.

pal4life
źródło
2

Mimo że ten błąd był wyświetlany - mój projekt był nadal podłączony do odpowiedniego repozytorium - uruchomiłem git branchpolecenie i zobaczyłem odpowiednie gałęzie - potem uruchomiłem git checkout *branchnamei BOOM - wszystko było w porządku.

adswebwork
źródło
Tak, @Mikko wyjaśnił, jaki jest powód. Jeśli chcesz pominąć kasę, możesz użyć opcji -b. (Ale lepiej jest naprawić zdalne repozytorium na dłuższą metę!)
eckes
1

Zdecydowanie coś jest nie tak ze zdalnym repozytorium. Możesz to naprawić, tworząc nowy klon repozytorium. Również wypchnięcie nowego zatwierdzenia do gałęzi master może działać.

Jason Axelson
źródło
Chyba miałeś na myśli: "git push -u origin GŁOWA: GŁOWA" To nic dla mnie nie rozwiązało ...
RzR
1

Domyślam się, że jest to *początek dziennika zatwierdzeń, który w jakiś sposób oszukuje zdalny serwer.

Mogę przeglądać interfejs sieciowy repozytorium, używając niektórych linków menu, ale innym nie udaje się z 404 - Unknown commit objectlub podobnym, szczególnie na stronie podsumowania.

Sprawdź, czy możesz zmienić ten ostatni komunikat dotyczący zatwierdzenia, a następnie wymuś wypchnięcie aktualizacji, aby sprawdzić, czy to naprawi. W demonie serwera może być błąd. Jeśli to naprawi, warto zgłosić się na liście git [email protected] (tylko zwykłe wiadomości tekstowe)

Philip Oakley
źródło
1

Miałem ten sam problem podczas tworzenia samego repozytorium.

Rozwiązałem to po prostu klonując repozytorium, tworząc lokalną gałąź główną, a następnie wypychając master do zdalnego repozytorium.

1) sklonuj repozytorium

$ git.exe clone --progress -v "the remote path" "my local path"

2) utwórz lokalną gałąź główną.

   $ git checkout -b master

3) popełnić coś w lokalnym oddziale

$ git add readme.md 
$ git commit –m “Added readme”

4) Wciśnij lokalny master na pilocie

   $ git push origin master
Corrado
źródło
0

Jeśli faktycznie nie ma dostępnej gałęzi głównej, sprawdź następujące kwestie; Jeśli w folderze „.git” znajduje się plik o nazwie „spakowane-refs”, otwórz go i możesz znaleźć wszystkie wymienione odniesienia.

Coś jak poniżej;

# pack-refs with: peeled fully-peeled 
e7cc58650190bd28599d81917f1706445d3c6d8b refs/tags/afw-test-harness-1.5
^cfae4f034e82591afdf4e5ed72279297d0eee618
6afe1bcfa4bd74de8e0c8f64d024e1cc289206df refs/tags/afw-test-harness-2.1
^c32f7fa495d4b44652f46c065fcd19c3acd237a6
72f2e4284dfbf27c82967da096c6664646bbdd19 refs/tags/android-1.6_r1
^50992e805e758e2231f28ec2127b57a1a9fd0ddc
0cbd528cad1cee9556098b62add993fc3b5dcc33 refs/tags/android-1.6_r1.1

Następnie użyj;

git checkout refs/tags/xxxx

Lub

git checkout 'HASH value'

aby pobrać wymaganą wersję. Dziękuję Ci.

Samantha
źródło
0

Wydawało się, że naprawiłem to:

git checkout -b  master
git push

Stworzyło to domyślny wzorzec, a następnie mogłem pobrać moje inne gałęzie

brendan
źródło
0

W moim przypadku repozytorium było puste.

git checkout --orphan master

git add some_file
git commit -m 'init'
git push origin master 
László Tóth
źródło
0

W przypadku Gitlab, nawet jeśli pokazuje, że jesteś na domyślnej gałęzi (np. master), Możesz w niej nie być, ustawiając go ponownie, napraw to, na przykład:

  1. Może stwórz nowy oddział asd
  2. ustawienia> repozytorium> Default Branch, który pokazuje domyślną gałąź master
  3. Ustaw to asd
  4. Ustaw z powrotem na master
  5. Usuń asdoddział

Gotowe, teraz twoja domyślna gałąź to master

Ng Sek Long
źródło