Comment résoudre le problÚme de checkout ambiguë avec git ?
-
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 certaines actions, comme la comparaison de branches et tout cela me laisse penser que câest git-cola qui gardait des rĂ©fĂ©rences invalides activesâŠ
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
- Git Ambiguous warning, while switching branch (stackoverflow)
኿