web-dev-qa-db-fra.com

GIT fatal: argument ambigu 'HEAD': révision inconnue ou chemin non présent dans l'arbre de travail

J'essaie d'initialiser un nouveau référentiel GIT à partir de Debian (en réalité un VM sur Virtualbox, installé et en cours d'exécution sous Mac OS X):

[david@server-VM-001:~ $] mkdir test
[david@server-VM-001:~ $] cd test
[david@server-VM-001: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
[david@server-VM-001:test  (master #) $] 

Quel est le problème?

52
David

Comme d'autres l'ont fait remarquer, ce message provient de votre invite Shell. Le problème est que dans un référentiel fraîchement créé, HEAD (.git/HEAD) pointe vers un ref qui n'existe pas encore.

% 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

Ça ressemble à rev-parse est utilisé sans vérification préalable suffisante. Après la création du premier commit .git/refs/heads est un peu différent et git rev-parse HEAD n'échouera plus.

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

Dans la fonction qui met à jour les informations Git pour le reste de mon invite de shell (version fortement modifiée du thème de l'invite wunjo pour ZSH), j'ai les éléments suivants pour contourner ce problème:

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 ...
}
29
Jacob Helwig

Je rencontrais ce problème lorsque mon terminal affichait un affichage personnalisé lors de la création d’un nouveau projet git (j’ai l’affichage de ma branche avant le chemin, par exemple:/current/path). Tout ce que je devais faire était de faire mon engagement initial auprès de ma branche principale pour que ce message disparaisse.

8
KenStipek

J'utilise habituellement git sur ma machine Linux, mais au travail, je dois utiliser Windows. J'ai eu le même problème en essayant de valider le premier commit dans un environnement Windows.

Pour ceux qui sont toujours confrontés à ce problème, j'ai pu le résoudre comme suit:

$ git commit --allow-empty -n -m "Initial commit".
7
J.Adler

Jacob Helwig mentionne dans sa réponse que:

Il semble que rev-parse soit utilisé sans vérification d'erreur préalable suffisante

Commit 62f162f de Jeff King (peff) devrait améliorer la robustesse de git rev-parse dans Git 1.9/2.0. (T1 2014) (en plus de commettre 1418567 ):

Dans les cas où nous ne correspondons pas (par exemple, "doesnotexist..HEAD"), Nous voudrions alors essayer de traiter l'argument comme un nom de fichier.
try_difference() obtient ce droit, et toujours immunise dans ce cas.
Cependant, try_parent_shorthand() ne supprime jamais, générant ainsi des messages d'erreur incorrects, voire des résultats incorrects:

$ 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>...]'
2
VonC

J'ai eu le même problème et je l'ai résolu par "installation de pod" après l'installation de cocoapods.

0
Jignesh Patel