GIT中的模糊命名问题?

6

我想要检出本地的一个分支,名为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个回答

8
通常是因为您在另一个命名空间中使用了与您的分支相同的名称:
  • 例如“remotes”命名空间:远程存储库的名称,如SO问题所示。
    (因此,在评论中davitenio请求使用git branch -a
  • 或“tags”命名空间:使用与分支同名的标记也可能触发该消息(请参见此博客文章

更新2016:Git 2.12(2017年第一季度)如果分支和标签共享相同的名称,则不会显示任何错误。

请查看提交 b284495(2016年10月31日)由Dennis Kaarsemaker (seveas)进行。
请查看提交 eef2bda(2016年10月28日)由Junio C Hamano (gitster)进行。
(由Junio C Hamano -- gitster --合并于提交 6c18dd4,2016年12月27日)

push: 不要使用可能含糊不清的默认 refspec

当用户使用 push.default 设置为 "upstream", "simple" 或 "current" 并且没有参数地执行懒惰的 "git push" 时,我们会内部生成一个 refspec,该 refspec 在源端具有当前分支名称并用于推送。

然而,分支名称(例如 "test")可能在源存储库的上下文中是一个含糊的引用名称 --- 例如可能存在同名的标签。
这将触发不必要的错误,而没有任何终端用户的过错。

请明确指定源端的完整 refname 以避免歧义。
使用 "current" 推送时,目标端只发送了分支的名称并强制接收端猜测,这是相同的问题。
也请在那里明确指定。


4

为了帮助您开始定位模糊的引用

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
它值得成为自己的答案,而不是我的回答的评论;)+1 - VonC

1

当我尝试为本地分支设置上游分支时,出现了相同的错误消息。

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无法确定是跟踪本地分支还是远程分支。删除错误的分支解决了问题,并让我再次感到快乐。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接