Двусмысленные имена с GIT?

Я пытаюсь проверить один из моих местных отделений, названный 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 ответа

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

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

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

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

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

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

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

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

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

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

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

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 не мог решить, отслеживать ли локальную ветку или удаленную. Удаление ошибочной ветки исправило проблему и снова сделало меня счастливым.

Другие вопросы по тегам