为什么git branch -t失败了"Not tracking:ambiguous information"?

che*_*che 23 git branch

当我尝试创建一个跟踪远程分支的新分支时,我得到了这个:

$ git branch -t test origin/foo
error: Not tracking: ambiguous information for ref refs/remotes/origin/foo
Run Code Online (Sandbox Code Playgroud)

源代码似乎以某种方式搜索分支来跟踪并抛出我,因为它找到了 不止一个,但我并没有完全得到它正在寻找的东西,因为我已经告诉它要在命令行上跟踪什么.

谁能告诉我发生了什么以及如何解决它?

Mat*_*ips 24

当我有两个具有相同(默认)获取模式(fetch = +refs/heads/*:refs/remotes/origin/*)和相同分支的远程repo时,我也看到了这一点.

我还没有找到如何正确修复它,因为我想继续推/拉到两个回购,但手动将信息添加到项目的.git/config工作,例如:

[branch "mybranch"]
  remote = origin
  merge = refs/heads/mybranch
Run Code Online (Sandbox Code Playgroud)

  • 我想解决方法是将不同的遥控器取到不同的地方,例如.而不是两者都有`fetch = + refs/heads/*:refs/remotes/origin/*`,尝试将第二个目标重命名为`fetch = + refs/heads/*:refs/remotes/another_repo/*` . (10认同)
  • `refs/heads/*:refs/remotes/origin/*`的意思是:在远程一侧的`refs/heads`中取出所有远程引用,然后把'refs/heads/origin`放在我们这边.`refs/heads`是存储分支的路径,所以如果你在遥控器上有分支`foo`,它将被提取到你本地仓库中的`origin/foo`.开头的"+"表示目标分支应该总是被覆盖(没有一些额外的检查). (4认同)

Von*_*onC 15

因为它找不到一个

不,因为它找到了多个匹配的远程分支,这意味着该函数remote_find_tracking()为给定的本地分支ref返回多个跟踪分支.

some_remote_branch不是已经被当地的一个分支跟踪?
(a git config -l将允许您检查您当前设置的内容).
(a git branch -r还可以帮助列出您当前的远程跟踪分支.)


远程分支,我认为远程跟踪分支是不同的.

错了,如这个帖子所示:

远程分支是"真正的"远程跟踪分支.您不在本地提交它们,它们本质上是只读副本,其中包含远程存储库中正在发生的事情.
如果您尝试'git-checkout'远程跟踪分支,您将获得一个分离的HEAD.

本地分支:
您可以提交更改的分支.可选地,分支可以配置为"跟随"一个远程跟踪分支.这意味着' git-pull'无参数(当你的本地分支被检出时)将自动' git-fetch'然后' git-merge'远程跟踪分支.

现在:

git-fetch使用远程存储库中的任何更改来更新远程跟踪分支是一项工作.
Git-pull运行git-fetch然后运行a git-merge来更新当前签出的分支.

问题是,对于git-merge:

发生这种情况时,git-merge必须决定将哪个remote-tracking-branch合并到当前检出的本地分支中.
您可以remote-tracking-branch使用--track选项设置在这种情况下将选择哪个.

--track设置本地跟随分支以引用远程分支,而不是跟踪分支

考虑如果 remote_find_tracking()为src填充了一个远程和refspec,并在填充其dst之后返​​回给定的refspec,如果为远程配置了适当的跟踪,意味着git.

/*
 * For the given remote, reads the refspec's src and sets the other fields.
 */
int remote_find_tracking(struct remote *remote, struct refspec *refspec);
Run Code Online (Sandbox Code Playgroud)

可能它认为它已经有一个本地跟随分支匹配some_remote_branch.你有这个完全相同名称的本地分支吗?
或者,反过来说:您当前的分支有一个类似名称的远程分支,这使得它成为任何一个的自然候选git-merge:尝试使其跟踪另一个远程分支将使git-merge无法选择更新/合并的本地分支远程的变化.


che*_*che 10

得到它了!问题是我之前已经设置了一个遥控器--mirror,目的是拥有我的存储库的备份/公共副本.

如果你跑

git remote add --mirror <name> <url>
Run Code Online (Sandbox Code Playgroud)

它不仅将远程标记为镜像(这是我想要的推送),而且还remote.<mirror>.fetch为镜像配置选项+refs/*:refs/*,这意味着所有分支突然"跟踪"您的镜像存储库以及任何创建跟踪分支的尝试会失败的.

(作为一个额外的好处,运行git fetch <mirror>将覆盖你的备份回购中的旧的refs.)

似乎解决这个问题的解决方案是设置remote.<mirror>.fetch:(我希望,这意味着"永远不会取任何东西").这显然可以解决跟踪问题并消除致命的提取.


GuS*_*uku 5

此处提到的其他修复均不适合我。最终工作的是这样的:

$ git branch -t test origin/test
error: Not tracking: ambiguous information for ref refs/remotes/origin/test
Run Code Online (Sandbox Code Playgroud)

运行上述后,即使 git 抱怨,它最终还是创建了一个本地分支,test但没有上游集。

现在,我打开.git/config文件(没有任何分支记录test)并手动添加以下内容:

[branch "test"]
        remote = origin
        merge = refs/heads/test
Run Code Online (Sandbox Code Playgroud)

之后一切正常。