web-dev-qa-db-fra.com

git refname 'Origin / master' est ambigu

J'ai un dépôt git qui suit plusieurs branches distantes:

$ git branch -a
* master
  remotes/git-svn
  remotes/Origin/master
  remotes/trunk

Lorsque j'essaie d'en configurer une par défaut, j'obtiens l'erreur suivante:

$ git branch --set-upstream-to=Origin/master master
warning: refname 'Origin/master' is ambiguous.
fatal: Ambiguous object name: 'Origin/master'.

Je voudrais supprimer certaines des branches maître distantes mais les références maître sont toujours là. Comment puis-je les supprimer pour pouvoir définir la branche amont par défaut sur Origin/master?

$ git show-ref master
cba97a58c99743c355b569bbf35636c8823c2d96 refs/heads/master
6726b4985107e2ddc7539f95e1a6aba536d35bc6 refs/Origin/master
d83f025cd3800ed7acd76b2e52ae296e33f1cd07 refs/original/refs/heads/master
cba97a58c99743c355b569bbf35636c8823c2d96 refs/remotes/Origin/master
48
Miguel de Val-Borro

La sortie de git branch -a indique que vous disposez d'une branche de suivi à distance appelée Origin/master. Parfaitement normal.

Cependant, la sortie de git show-ref master contient

6726b4985107e2ddc7539f95e1a6aba536d35bc6 refs/Origin/master

ce qui indique que vous avez probablement exécuté quelque chose comme la commande de bas niveau suivante:

git update-ref refs/Origin/master master

Cette commande crée une branche (pointant vers le même commit que master) appelée Origin/master, mais vivant directement sous refs/, c'est-à-dire extérieur le refs/heads/ espace de noms, où les succursales locales vivent normalement. Assez suspect ... Vouliez-vous faire ça?

Une telle branche ne sera pas répertoriée par git branch -a. Git devient confus, cependant, car il voit deux branches dont les noms se terminent par Origin/master:

  • refs/remotes/Origin/master, votre branche de suivi à distance, et
  • refs/Origin/master, la branche locale que vous avez créée (par accident) en dehors de refs/heads/.

Solution

Si vous aviez pas voulu créer refs/Origin/master

Supprimez-le simplement:

git update-ref -d refs/Origin/master

Ensuite, il n'y aura aucune ambiguïté, et Git se conformera lorsque vous essayez de définir master en amont.

Si vous vouliez créer refs/Origin/master

Pour éviter toute ambiguïté, spécifiez simplement le complet refname de la branche que vous souhaitez définir comme master en amont:

git branch --set-upstream-to=refs/remotes/Origin/master master

Pour fixer des idées, voici du code qui reproduit la situation dans l'un de mes dépôts GitHub:

$ cd ~/Desktop
$ git clone https://github.com/Jubobs/gitdags && cd gitdags

$ git update-ref refs/Origin/master

$ git branch -a
* master
  remotes/Origin/HEAD -> Origin/master
  remotes/Origin/master

$ git show-ref master
15b28ec22dfb072ff4369b35ef18df51bb55e900 refs/heads/master
15b28ec22dfb072ff4369b35ef18df51bb55e900 refs/Origin/master
15b28ec22dfb072ff4369b35ef18df51bb55e900 refs/remotes/Origin/HEAD
15b28ec22dfb072ff4369b35ef18df51bb55e900 refs/remotes/Origin/master

$ git branch --set-upstream-to=Origin/master master
warning: refname 'Origin/master' is ambiguous.
fatal: Ambiguous object name: 'Origin/master'.

$ git update-ref -d refs/Origin/master
$ git branch --set-upstream-to=Origin/master master
Branch master set up to track remote branch master from Origin.
72
jub0bs

Vous avez probablement accidentellement créé une référence locale appelée 'Origin/master'

par exemple, si vous avez fait cela

git branch Origin/master

Cela conduirait à ce problème. Celui-ci a l'air suspect "refs/Origin/master". "refs/heads/master" est votre maître local, "refs/remotes/Origin/master" est votre référence de branche distante, et "refs/Origin/master" est probablement une erreur qui vous gâche.

Il vous suffit de supprimer cette référence (git update-ref -d) et les choses recommenceront à fonctionner.

24
Andrew C

J'ai rencontré un problème très similaire en raison d'une balise accidentelle nommée "master", apparaissant dans git show-ref master comme refs/tags/master. Le correctif dans ce cas était:

git tag -d master
5
rymo

J'ai rencontré le même problème il y a quelques jours où plusieurs références ont été créées pour la même branche.

Choses que j'ai essayées:

> git show-ref (will give you the list of references, from the
> references list you can check if there are multiple references created
> for the branch you are working on or not.)

Si plusieurs références sont créées, supprimez-les simplement

rm .git/refs/heads/master

Après avoir supprimé les références, vous ne pouvez retirer la branche de l'origine distante que si vous y avez inséré quelque chose, sinon vous devez refaire tout ce que vous avez fait dans la branche

git fetch Origin
git checkout Origin/branchName

Cette solution a fonctionné pour moi en cas de branches ambiguës.

1
Sumit Kapoor