Двусмысленные имена с GIT? - PullRequest
6 голосов
/ 15 марта 2011

Я пытаюсь проверить один из моих локальных филиалов, названный TEAM20-lab2-release. Когда я пытаюсь сделать это, я получаю неоднозначную ошибку refname:

$ git branch TEAM20-lab2-release
warning: refname 'TEAM20-lab1-release' is ambiguous.
fatal: Ambiguous object name: 'TEAM20-lab1-release'.

Вот список моих веток:

$ git branch -a
  TEAM20-lab1
* TEAM20-lab1-release
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

Ответы [ 3 ]

7 голосов
/ 15 марта 2011

Обычно это происходит из-за того, что у вас такое же имя (чем у вашей ветви), используемое в другом пространстве имен :

  • подобно пространству имен " remotes ": имя удаленного репозитория, как показано в этом SO вопросе .
    (Отсюда просьба Давитенио о git branch -a в комментариях)
  • или " tags " namespace ": наличие тега, названного в честь ветви, также может вызвать это сообщение (см. Это сообщение в блоге )

Обновление 2016: Git 2.12 (Q1 2017) не будет отображать никаких ошибок, если ветвь и тег имеют одно и то же имя.

См. коммит b284495 (31 октября 2016 г.) от Деннис Каарсемакер (seveas) .
См. commit eef2bda (28 октября 2016 г.) от Junio ​​C Hamano (gitster) .
(Объединено Junio ​​C Hamano - gitster - в коммит 6c18dd4 , 27 декабря 2016 г.)

push: не использовать потенциально неоднозначный refspec по умолчанию

Когда пользователь выполняет ленивый "git push" без параметров с push.default, установленным в "upstream", "simple" или "current", мы внутренне генерировали refspec, который имеет текущее имя ветки на стороне источника и использовал его для push.

Однако имя ветви (скажем, "test") может быть неоднозначным контекст исходного хранилища --- может быть тег с с таким же именем, например.
Это вызвало бы ненужную ошибку без какой-либо ошибки на стороне конечного пользователя.

Будьте явными и дайте полное refname в качестве исходной стороны, чтобы избежать неоднозначность.
Сторона назначения при нажатии с «current» отправила только имя ветви и заставила принимающую сторону угадать, что является той же проблемой.
Также будьте откровенны.

4 голосов
/ 16 марта 2011

чтобы вы начали искать неоднозначные ссылки

function branchid() 
{ 
    echo $(basename "$(dirname "$1")")/$(basename "$1"); 
}

for ref in $(git for-each-ref | cut -f2)
    do echo -e "$ref\t$(branchid "$ref")"
done | 
    sort --key 2 | uniq -Df 2
1 голос
/ 11 сентября 2014

Я получил то же сообщение об ошибке при попытке установить восходящую ветвь для локальной ветки.

cgd@flavia-cgd-mobi:~/Projects/reporter$ git status
On branch master

nothing to commit, working directory clean
cgd@flavia-cgd-mobi:~/Projects/reporter$ git branch --set-upstream-to gerrit/master master
warning: refname 'gerrit/master' is ambiguous.
fatal: Ambiguous object name: 'gerrit/master'.
cgd@flavia-cgd-mobi:~/Projects/reporter$ git remote -vv
gerrit  ssh://cgd@gerrit.server:29418/reporter (fetch)
gerrit  ssh://cgd@gerrit.server:29418/reporter (push)
cgd@flavia-cgd-mobi:~/Projects/reporter$ git branch -a
  gerrit/master
* master
  remotes/gerrit/master
cgd@flavia-cgd-mobi:~/Projects/reporter$ git branch -d gerrit/master
Deleted branch gerrit/master (was 1234567).
cgd@flavia-cgd-mobi:~/Projects/reporter$ git branch --set-upstream-to gerrit/master master
Branch master set up to track remote branch master from gerrit.

cgd@flavia-cgd-mobi:~/Projects/reporter$ git fetch
cgd@flavia-cgd-mobi:~/Projects/reporter$ git status
On branch master
Your branch is up-to-date with 'gerrit/master'.

nothing to commit, working directory clean

Как видите, я каким-то образом создал локальную ветку с именем gerrit / master, которая вызвала конфликт, поскольку git не мог решить, отслеживать ли локальную ветку или удаленную. Удаление ошибочной ветки исправило это и снова сделало меня счастливым.

...