【问题标题】:Refname 'master' is ambiguousRefname 'master' 不明确
【发布时间】:2012-08-26 19:52:30
【问题描述】:

我查看了所有其他模棱两可的引用名称问题,但似乎都没有帮助。为什么我会收到此警告?

$ git checkout master
warning: refname 'master' is ambiguous.
$ git show-ref master
eef61c00da690f093063ac5a728e22fd21648104 refs/heads/master
$ git branch -a
  checkers
  exercises
* master
$ git remote -v
$ 

【问题讨论】:

  • 正如我的问题中所述,这个仓库只有一个主分支,没有遥控器。您链接到的问题中的用户遇到了远程和同名分支的问题。
  • 你有一个名为“master”的标签吗?
  • 防止这种情况的一种方法是在您的代码库/组织中制定一个约定,以确保您永远不会创建重叠的引用。我使用以下内容:对于非原产地本地分支机构,请使用:local-<remote>/master。对于发布分支和标签,使用 release/1.x.x 之类的东西用于发布分支(即 git flow 功能冻结)和 release-tag/1.1.0 用于标记已部署/已发布的代码,并禁止命名分支 releaserelease-tag 或名称一个起源。

标签: git


【解决方案1】:

TL;DR:保存和删除标签,为Ashutosh Jindalcomments(见“Rename a tag in git?”):

git tag tag-master master
git tag -d master

原答案:

我看到的大多数消息来源(如this FAQ)都指向相同的原因:

当您尝试结帐本地分支时,您会得到一个

warning: refname 'branch-name' is ambiguous

如果您创建了一个与远程标记同名的本地分支,就会发生这种情况
Git 应该检出你的本地分支,但它却试图检出标签,结果很困惑。

最初导入几棵树是有问题的,因为它们包含同名的分支和标签。我们已经通过 renaming away the tags 解决了很多此类问题。

在您的情况下,您没有远程,但命名为您的分支的本地标签就足够了。

歧义在gitrevision

中指定

<refname>,例如master, heads/master, refs/heads/master

一个符号引用名称。例如。 master 通常表示refs/heads/master 引用的提交对象。
如果你碰巧同时拥有heads/mastertags/master,你可以明确地说heads/master 告诉git 是哪一个你的意思是。
当有歧义时,<refname> 通过采用以下规则中的第一个匹配项来消除歧义:

如果$GIT_DIR/<refname> 存在,那就是你的意思(这通常只对HEADFETCH_HEADORIG_HEADMERGE_HEADCHERRY_PICK_HEAD 有用);

  • 否则,refs/<refname> 如果存在;
  • 否则,refs/tags/<refname> 如果存在;
  • 否则,refs/heads/<refname> 如果存在;
  • 否则,refs/remotes/<refname> 如果存在;
  • 否则,refs/remotes/<refname>/HEAD 如果存在。

因此请检查在您的存储库中可以找到master 的位置。

git checkout heads/master 将始终有效。
警告:默认情况下,这将检查DETACHED HEAD mode 中的分支。见“Why does git checkout with explicit 'refs/heads/branch' give detached HEAD?”。

为避免这种情况,并且仍然使用明确的 ref,请键入:

git checkout -B master heads/master

【讨论】:

  • refs 的搜索顺序很有帮助。 $GIT_DIR/master 确实存在出于某种原因(不知道它指向什么或它是如何创建的)。删除它修复了警告。
  • @Max,这正是我的问题——某些东西制作了一个 .git/master 文件(其内容是一个哈希,指向 曾经是几转的主文件前)并重命名它修复了警告。谢谢!
  • 谢谢!所以我的修复是git tag tag-master master ; git tag -d master(这也很有帮助:stackoverflow.com/questions/1028649/rename-a-tag-in-git
  • @AshutoshJindal 太好了!我已将您的评论包含在答案中以提高知名度。
【解决方案2】:

这只是发生在我身上。我不知何故有一个包含 sha 的文件 .git/master。不知道那是怎么到那里的,但是当我删除它时,错误就消失了。如果您仔细阅读接受的答案,这是“预期行为”,但如果您这样做,您将看不到 .git/master git show-ref master 因为它遵循的规则略有不同。

【讨论】:

  • 这是因为你忘记了 update-ref 命令的“refs/heads”部分(对我来说还是这样)。请参阅我对stackoverflow.com/questions/13073062/…的回复
  • 这是我的问题。 git checkout master 正确加载了分支,git diff master staging 使用了古老的参考,这让人困惑。
  • 这就是我的解决方案。花了我太长时间才意识到,我在运行find .git -iname master后终于注意到了
【解决方案3】:

虽然这不适用于 OP 的情况,但在不小心执行了 git branch origin/branch 而不是 git checkout origin/branch 后,我得到了 refname is ambiguous 警告。这创建了一个名为 origin/branch 的本地分支,这使得它与远程分支不明确。解决问题就像git branch -D origin/branch 一样简单(安全,因为-D 在本地分支上运行)。

【讨论】:

  • 这种情况发生在我身上不止一次,当我删除master 分支时最令人沮丧和莫名其妙的症状,但在执行git rev-parse master 时仍然出现
  • 谢谢!你的回答解释了我做错了什么。
【解决方案4】:

如果您错误地配置了两个具有相同名称的远程服务器,也会出现此消息,从而产生歧义。

检查您的.git/config 文件。如果你有多个远程仓库配置了相同的:

fetch = +refs/heads/*:refs/remotes/origin/*.

您应该将其中一个更改为不同的名称,例如:

fetch = +refs/heads/*:refs/remotes/another_repo/*

【讨论】:

    猜你喜欢
    • 2014-11-20
    • 2022-06-17
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多