cClaude.rocks ☕ Le blog

[Nouvelles technologies, sciences et coups de gueule…]

Menu
Ce billet a été édité le : 2021-11-05
  • Précision

    Précision, je rencontre ce problème périodiquement ces derniers temps, et je pense qu’il est lié à une version de git ou de git-cola qu’il m’arrive d’utiliser. Peut-être est-ce lié à l’utilisation simultanée de ces outils. Je précise donc les versions au cas où ce soit bien ce qui se passe.

    La version de git standard.

    git --version
    
    git version 2.33.1
    

    Un outil graphique pour git.

    git-cola --version
    
    cola version 3.6
    


Symptômes

Lors d’un checkout banal : (ou presque…)

git checkout armv7l_disabled_and_add_restore

on se retrouve avec une erreur du type :

hint: If you meant to check out a remote tracking branch on, e.g. 'origin',
hint: you can do so by fully qualifying the name with the --track option:
hint:
hint:     git checkout --track origin/<name>
hint:
hint: If you'd like to always have checkouts of an ambiguous <name> prefer
hint: one remote, e.g. the 'origin' remote, consider setting
hint: checkout.defaultRemote=origin in your config.
fatal: 'armv7l_disabled_and_add_restore' matched multiple (2) remote tracking branches


La bricole

En gros, ce message me conseille de faire cela :

git config --local checkout.defaultRemote origin

Donc je relance la commande :

git checkout armv7l_disabled_and_add_restore

Et pas mieux :

fatal: Not tracking: ambiguous information for ref refs/remotes/origin/armv7l_disabled_and_add_restore

Donc on dégage cette configuration, puisqu’elle ne sert à rien :

git config --local --unset checkout.defaultRemote

J’ai également exécuté un nettoyage du dépôt local à l’aide de :

git gc --prune

Mais rien n’a fonctionné…



Diagnostique

Les outils pour diagnostiquer cela existe, il s’agit de git ls-remote et git show-ref.

git ls-remote

qui donne (extrait) quelque chose comme :

From https://git.domain.tld/path/repo-name.git
6cdd9e1da490e96822bdf52f7d3f1f75b82149c7    HEAD
8fd6eea1236952e0bb9983720443fcbc461926a6    refs/heads/armv7l_disabled_and_add_restore
6cdd9e1da490e96822bdf52f7d3f1f75b82149c7    refs/heads/master
2cf666899a5bb2023e2ddb3193bfb7c343abd856    refs/heads/obsolete_armv7l_disabled
bae96d35a87f128ba71769d0f377976a224acdb6    refs/heads/php7.3_and_armv7l
b2fd3d7b19651af9b9bffa45aa983a8ebc307a90    refs/merge-requests/1/head
…
2d748703563598c1ff7ee1f87da70ca7b61bda20    refs/merge-requests/219/head
98c5cf60125a826fe84c017ffef720c3ad7cdfbd    refs/merge-requests/219/merge
…
1e14d21cf2e2454765588ee8f88a3c36fa29f2b6    refs/tags/last-version-before-improving-install
b1b237cb1eb9f5165f380854c0a01e9c09c35901    refs/tags/last-version-before-improving-install^{}
fc42aaadefce0938ef8f1f39c0e3bbcd89cc8cfc    refs/tags/last-version-before-reinstall
77d391881e57bf7fcd9e4b29713185cb55e3b2c7    refs/tags/last-version-before-reinstall^{}
…
c1c19b9e515ef0cb051e20a93a01614ac6ea5faa    refs/tags/strxsh-to-bxstxr
7dd8d5681461ea2949ea3372848106c9a1cb5f03    refs/tags/strxsh-to-bxstxr^{}

Quoi qu’il en soit cela n’importe pas grand-chose, et heureusement, cela indiquerait un problème sur le serveur git. La commande git ls-remote traitant des commits présent côté serveur.

La seconde commande est plus intéressante pour ce cas :

git show-ref

Là encore on obtient une liste de hash suivi du nom complet de la référence.

8fd6eea1236952e0bb9983720443fcbc461926a6 refs/heads/armv7l_disabled_and_add_restore
6cdd9e1da490e96822bdf52f7d3f1f75b82149c7 refs/heads/master
6cdd9e1da490e96822bdf52f7d3f1f75b82149c7 refs/remotes/origin/HEAD
8fd6eea1236952e0bb9983720443fcbc461926a6 refs/remotes/origin/armv7l_disabled_and_add_restore
6cdd9e1da490e96822bdf52f7d3f1f75b82149c7 refs/remotes/origin/master
2cf666899a5bb2023e2ddb3193bfb7c343abd856 refs/remotes/origin/obsolete_armv7l_disabled
bae96d35a87f128ba71769d0f377976a224acdb6 refs/remotes/origin/php7.3_and_armv7l
c1612c9417396d16967e783f22e39daa9b095334 refs/stash
5dbff12b367eac2d18a2fe2b055329632b967266 refs/tags/killed-production-09-2019
217666aa2c36f1a54b4d7796fb3b7420443ab32b refs/tags/last-from-framboise03-resintall1
1e14d21cf2e2454765588ee8f88a3c36fa29f2b6 refs/tags/last-version-before-improving-install
fc42aaadefce0938ef8f1f39c0e3bbcd89cc8cfc refs/tags/last-version-before-reinstall
…
ed16ee7dec2ffae64e32910eb56d3aefd9983a2f refs/tags/rc1.0
cfccef099bbebaac95e0ead29b1799cd0608e389 refs/tags/rc1.1
940cc2bb749e9863bf12e2eac5c409c5b89d2879 refs/tags/rc2.0.0
c1c19b9e515ef0cb051e20a93a01614ac6ea5faa refs/tags/stresh-to-buster

Le problème semble venir de ces deux lignes :

8fd6eea1236952e0bb9983720443fcbc461926a6 refs/heads/armv7l_disabled_and_add_restore
8fd6eea1236952e0bb9983720443fcbc461926a6 refs/remotes/origin/armv7l_disabled_and_add_restore

La solution dans ce cas est de supprimer la référence invalide, mais dans mon cas ces deux références adressent le même commit, il n’y a donc pas d’ambiguïté…

Si cela avait été le cas, il aurait fallu supprimer la référence invalide à l’aide d’une commande du type :

git update-ref -m "remove ambiguous ref" -d refs/…votre-ref…

Dans mon cas, durant l’investigation le problème semble s’être résolu du lui-même…



Contexte

  • Un checkout banal ou presque…
  • Le problème semble s’être résolu du lui-même ou presque…

D’abord ce checkout n’était pas vraiment banal, le contexte était un peu plus compliqué. Un rebase qui ne se passe pas super bien, ensuite on pousse cela sur une branche temporaire histoire de regarder ce qu’il y a récupéré, on tente des trucs et finalement, je me mets sur master, puis je supprime toutes les branches locales toucher par cet évènement (donc, entre autres, un git branch -D armv7l_disabled_and_add_restore) et le checkout suivant se plante…

Donc non, le contexte n’est pas celui de tous les commits (heureusement d’ailleurs).

J’utilise parfois git-cola pour certaine action, comme la comparaison de branches et tout cela me laisse penser que c’est git-cola qui gardait des références invalide active…



Mise à jour

Ayant pu retrouver ce cas de figure (en dehors d’un git rebase à problème), j’ai constaté que la séquence de commande suivante résolvait l’erreur :

git checkout __la_branche__ # Erreur
git config --local checkout.defaultRemote origin
git checkout __la_branche__ # Erreur encore
git config --local --unset checkout.defaultRemote
git checkout __la_branche__ # Okay

Je dois en conclure à un bug sur la version actuelle de git, surtout que l’analyse de références n’a pas révélé l’ambiguïté prétendue par le git checkout.

Références

ᦿ


ℹ 2006 - 2021 | 🏠 Retour à l'accueil du domaine | 🏡 Retour à l'accueil du blog