关于branch:git shallow clone(clone –depth)错过了远程分支

git shallow clone (clone --depth) misses remote branches

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

1
2
3
4
5
6
7
8
$ 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

在另一台机器上尝试了相同的命令,它运行良好:

1
2
3
4
5
6
7
8
9
10
11
$ 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

还克隆了另一个repo,效果很好。虽然我可以在这台机器上再试一次,但最好知道出了什么问题。

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

编辑:回答总结:由于Git版本1.8.3.2,"深度"和"——没有单个分支"需要一起使用才能获得与以前相同的行为。这被认为是错误修复。


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

  • 跑步(谢谢@jthill):

    1
    git remote set-branches origin '*'
  • 之后,做一个git fetch -v

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

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

    例如,将以下行更改为:

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

    (用*替换master):

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


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

    1
    2
    3
    4
    florianb$ git branch -a
            * master
              remotes/origin/HEAD -> origin/master
              remotes/origin/master

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

    1
    2
    3
    4
    5
    6
    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[…]导致提交链的长度不超过20。"因此,较浅的克隆应该包含从分支尖端请求的提交深度。

    此外,--single-branch选项的git clone文件说明:

    "Clone only the history leading to the tip of a single branch, either specified by the --branch option or the primary branch remote's HEAD points at. When creating a shallow clone with the --depth option, this is the default, unless --no-single-branch is given to fetch the histories near the tips of all branches."

    因此,一个浅克隆(带有深度选项)只获取一个分支(在您请求的深度)。

    不幸的是,这两个选项(--depth--single-branch在过去都是错误的,而使用浅克隆则意味着它还没有解决的问题(如您在上面我发布的链接中所读到的那样),这是由给定的历史重写引起的。在特殊情况下,这会导致总的来说有些复杂的行为。


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

    1
    2
    3
    4
    $ 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

    这将更改指定远程跟踪的分支列表,以便我们只获取和签出所需的分支。