2012-09-04 8 views
40

Próbuję zainicjować nowe repozytorium GIT z Debiana (w rzeczywistości wirtualna maszyna wirtualna zainstalowana i uruchomiona na Mac OS X):GIT fatal: niejednoznaczny argument "HEAD": nieznana wersja lub ścieżka nie znajduje się w drzewie roboczym

[[email protected]:~ $] mkdir test 
[[email protected]:~ $] cd test 
[[email protected]:test $] git init 
Initialized empty Git repository in /home/david/test/.git/ 
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree. 
Use '--' to separate paths from revisions 
[[email protected]:test (master #) $] 

Na czym polega problem?

+0

To nie powinno się zdarzyć ... Jaka jest wersja git? Jak został zainstalowany? – CharlesB

+2

Git został zainstalowany przez apt-get, a wersja 1.7.2.5. – David

+4

Wydaje mi się, że używasz niektórych poleceń git w linii poleceń - myślę, że stąd pochodzi komunikat o błędzie. – ebneter

Odpowiedz

20

Jak inni zwrócili uwagę, ta wiadomość pochodzi z podpowiedzi powłoki. Problem polega na tym, że w świeżo utworzonym repozytorium HEAD (.git/HEAD) wskazuje na ref, który jeszcze nie istnieje.

% git init test 
Initialized empty shared Git repository in /Users/jhelwig/tmp/test/.git/ 
% cd test 
% cat .git/HEAD 
ref: refs/heads/master 
% ls -l .git/refs/heads 
total 0 
% git rev-parse HEAD 
HEAD 
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree. 
Use '--' to separate paths from revisions 

Wygląda na to, że rev-parse jest używany bez wystarczającego sprawdzania błędów z pierwszej ręki. Po utworzeniu pierwszego zatwierdzenia, .git/refs/heads wygląda nieco inaczej i git rev-parse HEAD nie zawiedzie.

% ls -l .git/refs/heads 
total 4 
-rw------- 1 jhelwig staff 41 Oct 14 16:07 master 
% git rev-parse HEAD 
af0f70f8962f8b88eef679a1854991cb0f337f89 

W funkcji, która aktualizuje informacje Git dla reszty mojej zachęty powłoki (wersja mocno zmodyfikowany od wunjo wiersza tematu zsh) Mam następujący aby obejść ten problem:

zgit_info_update() { 
    zgit_info=() 

    local gitdir=$(git rev-parse --git-dir 2>/dev/null) 
    if [ $? -ne 0 ] || [ -z "$gitdir" ]; then 
     return 
    fi 

    # More code ... 
} 
+1

Starsze wersje git (przynajmniej wiem, że tak jest w 1.6.4.4) nie używaj 'head' jako synonimu' HEAD'. W moim przypadku utknąłem z tą starszą wersją gita i udało mi się ominąć problem, odwołując się do 'HEAD' w moich próbach, a nie' head'. –

2

Jacob Helwig wspomina in his answer że:

wygląda rEV-parse jest używany bez sprawdzania wystarczająca błąd przed strony

Commit 62f162f z Jeff King (peff) powinna poprawić odporność git rev-parse w Git 1.9/2.0 (Q1 2014) (w dodatku commit 1418567):

W przypadkach, gdzie nie pasują (na przykład "doesnotexist..HEAD") , chcielibyśmy wtedy spróbować potraktować argument jako nazwę pliku.
try_difference() ma to prawo, i zawsze nie ma znaczenia w tym przypadku.
Jednak try_parent_shorthand() nigdy unmunges, co prowadzi do błędnych komunikatów o błędach, lub nawet błędnych wyników:

$ git rev-parse foobar^@ 
foobar 
fatal: ambiguous argument 'foobar': unknown revision or path not in the working tree. 
Use '--' to separate paths from revisions, like this: 
'git <command> [<revision>...] -- [<file>...]' 
5

miałem ten problem, gdy ma wyświetlacz niestandardowe w moim terminalu podczas tworzenia nowego projektu git (Mam wyświetlanie gałęzi przed ścieżką np.:/current/path). Wszystko, co musiałem zrobić, to zrobić moje pierwsze zobowiązanie do mojego głównego oddziału, aby ta wiadomość zniknęła.

Powiązane problemy