Git 无法检出远程分支,尽管 `git ls-remote origin` 显示它存在

问题描述 投票:0回答:1

我正在努力检查我知道存在的远程分支,因为它显示为

git ls-remote
:

$ git ls-remote
242d56fbd8d8af67df3157bd047252f5580e3df8    HEAD
242d56fbd8d8af67df3157bd047252f5580e3df8    refs/heads/master                                         
517af0f6de9a3db846c4bde693a11ccb52092aee    refs/heads/foobar

当我尝试结账时,出现错误:

$ git checkout refs/heads/foobar
error: pathspec 'refs/heads/foobar' did not match any file(s) known to git

我尝试了各种方法都无济于事:

  • git fetch --all
    不会改变任何东西,
    git fetch origin
  • 也没有改变
  • git branch -v -a
    不显示

经过很多这样的答案,我终于偶然发现了一些有用的东西,但我不知道为什么:

git fetch origin foobar:foobar
git git-remote git-config git-fetch git-ls-remote
1个回答
2
投票

事实证明,我最初是用

--depth 1
浅克隆了存储库的。这引起了
.git/config
的微妙变化。我的
remote.origin.fetch
设置为:

$ git config remote.origin.fetch         
+refs/heads/master:refs/remotes/origin/master

这意味着 git 在运行诸如

checkout
fetch
branch
之类的东西时,不会查看除 master 之外的任何内容,但
git ls-remote
除外,它似乎忽略了该配置设置。

修复很简单:

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

但请注意,这会抵消浅克隆的好处。通过这种方式,您将获取相当多的历史记录。

替代方案可能是(未经测试):

git fetch --unshallow

要仅获取一次分支,请使用

git fetch origin foobar:foobar 
。但通过这种方式,您还将获得大量历史记录,并且您将来可能需要再次进行此提取。

如果您只想跟踪某个分支以及其他分支,则可以更改获取配置,但我不太确定具体如何更改。

由于大多数人不使用浅克隆,因此大多数现有的 StackOverflow 问题/答案都没有解决这个特定问题。感谢 kenorb 在这个 answer 中向我指出了这一点。

© www.soinside.com 2019 - 2024. All rights reserved.