Git 浅克隆(克隆深度)错过远程分支

在克隆一个远程存储库之后,它不会通过-a 选项显示任何远程分支。有什么问题吗?如何调试?在这个代码片段中,没有显示两个远程分支:

$ git clone --depth 1 git://git.savannah.gnu.org/pythonwebkit.git
$ cd pythonwebkit
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
$ git --version
git version 1.8.3.1

在另一台机器上尝试了同样的命令,效果很好:

$ git clone --depth 1 git://git.savannah.gnu.org/pythonwebkit.git
Receiving objects: 100% (186886/186886), 818.91 MiB | 3.44 MiB/s, done.
$ cd pythonwebkit/
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/debian
remotes/origin/master
remotes/origin/python_codegen
$ git --version
git version 1.7.1

也试过克隆另一个回购协议,效果很好。虽然我可以在这台机器上再试一次,但最好能知道出了什么问题。

任何建议或提示都将非常受欢迎。

编辑: 答案摘要: 自 git 版本1.8.3.2以来,“—— deep”和“—— no-single-Branch”需要一起使用,以获得与前面相同的行为。这被认为是一个错误修复。

91292 次浏览

行为是正确的,在最后一次修订之后,主分支(因为这是主远程的 HEAD)是存储库中唯一的远程分支:

florianb$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master

完整的克隆提供了新的(所有)分支:

florianb$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/debian
remotes/origin/master
remotes/origin/python_codegen

肤浅的克隆人

由于技术文档中的 肤浅的描述,“ git-clone --depth 20 repo[ ... ] result [ s ]在提交链中的长度最多为20。”因此,浅克隆应该包含请求的提交深度,从分支的顶端开始。

此外,关于 --single-branch选项的 git clone文件描述如下:

”只克隆指向单个分支尖端的历史记录,该历史记录可以由 --branch选项指定,也可以由主分支远程的 HEAD点指定。当使用 ABC2选项创建浅克隆时,这是默认值,除非 --no-single-branch被赋予在所有分支的提示附近获取历史记录。

因此浅 克隆人(深度-选项)只有 取回来只有 一根树枝(在你要求的深度)。


不幸的是,这两个选项(--depth--single-branch)在过去都是错误的,而且使用浅克隆隐含着未解决的问题(正如你可以在上面我发布的链接中读到的) ,这是由给定的历史重写造成的。在特殊情况下,这会导致总体上有些复杂的行为。

在做了一个浅层克隆之后, 能够到 从远程签出其他分支,

  1. 运行(谢谢@jthill) 关于集合分支的文献:

     git remote set-branches origin '*'
    
  2. 然后做 git fetch -v --depth=1

  3. 最后是 git checkout the-branch-i-ve-been-looking-for


步骤1也可以通过编辑 .git/config手动完成。

例如,将下列行更改为:

fetch = +refs/heads/master:refs/remotes/origin/master

改为(以 *取代 master) :

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

通过阅读@jthill 的回复和评论,对我来说最有效的方法是在 git remote命令中使用 set-branches选项:

$ git clone --depth 1 https://github.com/dogescript/dogescript.git
$ git remote set-branches origin 'remote_branch_name'
$ git fetch --depth 1 origin remote_branch_name
$ git checkout remote_branch_name

这将更改由命名远程跟踪的分支列表,以便我们可以只提取和签出所需的分支。