115 votes

warning : remote HEAD se réfère à une référence inexistante, impossible d'effectuer le checkout

Cette erreur semble très répandue pour différentes raisons.

J'ai un simple repo git nu appelé "kiflea.git", je le clone comme ceci :

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

Puis git me dit : warning: remote HEAD refers to nonexistent ref, unable to checkout.

Et oui, il n'y a pas de fichiers versionnés dans la carte, à l'exception du répertoire .git. Bref, la seule chose que j'ai besoin de faire est :

cd kiflea
git checkout master

Et ça marche, tous les fichiers sont là. Mais je pensais que le clonage d'un repo vérifiait automatiquement le master, alors que se passe-t-il exactement, et comment puis-je le réparer ?

J'ai remarqué que, après avoir fait le git checkout master ce qui est ajouté à mon fichier de configuration .git local :

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

Il est probablement intéressant de savoir que ce dépôt git était un dépôt svn dans un passé lointain.

Ps : lorsque l'on parcourt le dépôt nu à l'aide de gitweb, il y a clairement une master succursale là-bas : http://kipdola.be/gitweb/?p=kiflea.git;a=sommaire

2 votes

Qu'est-ce que git ls-remote origin vous montrer ?

0 votes

C'est la même chose avant ou après le checkout master bit : 25f600739343a7ce32d6311a1e6140870774810b refs/heads/master

1 votes

Il semble que le référentiel distant ait perdu (ou n'ait jamais eu) son HEAD . Avez-vous un accès direct à celui-ci ? Si oui, voir aquí

177voto

Mikko Rantalainen Points 2322

En warning: remote HEAD refers to nonexistent ref, unable to checkout. signifie que le référentiel distant (nu) contient référence de la branche dans le fichier appelé HEAD avec une valeur qui ne correspond à aucune branche publiée dans le même référentiel.

Notez que l'avertissement signifie seulement que git n'a pas fait le checkout. Le dépôt cloné est par ailleurs tout à fait correct. Il suffit de le faire git branch -a pour voir les branches possibles et git checkout the-branch-you-want pour résoudre le problème.

Cela se produit généralement parce que l'option par défaut contenu pour ce fichier ( .git/HEAD ou simple HEAD pour les dépôts nus) est ref: refs/heads/master qui dit que si quelqu'un va clone ce dépôt, ils doivent par défaut cloner la branche refs/heads/master . Par défaut, Git crée une branche locale sans l'option refs/heads/ préfixe (c'est-à-dire, master par défaut). Essayer git help symbolic-ref pour plus d'informations.

Le problème de cette situation est que Git ne fournit pas de méthode pour modifier les données de l'application à distance soit vous utilisez quelque chose que l'hébergeur Git a mis en place (par exemple Settings - Default branch dans GitHub si vous avez des droits d'administrateur), soit vous devez utiliser le nom de la branche. master comme branche par défaut (parce que c'est le contenu par défaut du fichier HEAD et si vous ne pouvez pas modifier ce fichier, vous serez bloqué avec master pour toujours).

Si vous avez un accès shell à votre dépôt git distant, vous pouvez simplement cd path/to/git/repo; git symbolic-ref HEAD refs/heads/XYZXYZ est le nom de la branche que vous souhaitez utiliser par défaut.

Une façon de résoudre ce problème est de créer un nouveau repo distant nu sans commits et de faire ensuite git push name-of-the-remote my-special-branch-name ce qui se traduira par un référentiel nu contenant une seule branche my-special-branch-name mais le HEAD contient toujours la valeur par défaut qui pointe vers master . En conséquence, vous recevrez l'avertissement susmentionné. Si vous ne pouvez pas modifier le fichier HEAD vous pouvez publier votre branche en utilisant la syntaxe git push name-of-the-remote my-special-branch-name:master ce qui signifie que votre branche locale appelée my-special-branch-name devrait être publié en tant que branche master sur la télécommande.

24 votes

Notez que l'avertissement signifie seulement que git n'a pas fait checkout . Le dépôt cloné est par ailleurs en parfait état. Faire git branch -a pour voir les branches possibles et git checkout the-branch-you-want pour "régler" le problème.

3 votes

Au moins, il est possible d'éviter d'utiliser la tête de lecture à distance lorsque l'on utilise git clone -b master (ou quel que soit le nom de la branche existante).

0 votes

J'ai fait exactement ce que vous avez écrit dans le dernier paragraphe ; Il y a des fichiers dans la branche dans le repo nu (dans gitlab) mais le clone semble être vide. {git branch -a} ne montre rien. {git clone -b mon-nom-de-branche-spécialisé <url>} ne semble pas fonctionner non plus (la partie distante est bloquée).

14voto

Marco Bonifazi Points 113

J'ai eu le même problème parce que je n'utilisais plus les master et elle s'est perdue dans mon dépôt local et dans mon dépôt distant.

Le référentiel distant avait toujours le HEAD fixé à master J'ai changé le nom de la branche à distance que j'utilise actuellement et tout fonctionne bien.

Si vous pouvez accéder à votre référentiel distant :

  • Accédez à votre remote_repo.git ;
  • Editar HEAD fichier
  • Changer ref: refs/heads/master a ref: refs/heads/your_branch

0 votes

Les deux conditions sont possibles, master a été supprimé et le HEAD pointe toujours vers lui ou HEAD a été changé en une branche qui a été supprimée par la suite. Je suppose (puisque le checkout de master fonctionne) que la deuxième option est notre cas. @MarcoBonifazi Dans ce cas, le "changement" consisterait à remplacer broken_branch con refs/heads/master .

2 votes

Y a-t-il une façon "correcte" de définir la branche HEAD de cette façon sans avoir recours à l'édition des fichiers ?

0 votes

@EdRandall cd path/to/bare/git/repo; git symbolic-ref HEAD refs/heads/XYZ donde XYZ est le nom par défaut de la branche que vous souhaitez utiliser si git clone se fait sans l'aide de l -b comme je l'ai dit dans un autre commentaire.

10voto

pal4life Points 693

Oui, c'est lié au fait que votre clone git essaie d'extraire une branche différente de master. Faites simplement ceci

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

Cela vous aidera à cloner la branche exacte par le biais de son nom.

4voto

Muhammad Shahzad Points 4519

C'est une réponse tardive (2021) mais elle aidera d'autres personnes.

Lorsque vous créez un repo nu en utilisant git init --bare il fixe ref: refs/heads/master en HEAD mais lorsque vous clonez ce repo nu, sa branche par défaut est main c'est le problème, il faut donc le modifier HEAD et mettre main' instead of masater`, c'est-à-dire

ref: refs/heads/main

0 votes

Ou encore, faites la même chose avec un git mando: git symbolic-ref HEAD refs/heads/main .

3voto

adswebwork Points 487

Même si cette erreur était affichée - mon projet était toujours connecté au référentiel correspondant - j'ai exécuté la commande git branch et j'ai vu les branches appropriées - puis j'ai exécuté la commande git checkout *branchname et BOOM - tout est rentré dans l'ordre.

0 votes

Oui, @Mikko en a expliqué la raison. Si vous voulez sauter le checkout, vous pouvez utiliser l'option -b. (Mais il est préférable de corriger votre repo distant à long terme !)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X