我正在努力检查我知道存在的远程分支,因为它显示为
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
事实证明,我最初是用
--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 中向我指出了这一点。