git浅克隆(克隆-深度)错过了远程分支


98

克隆远程存储库后,它不会通过-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起,“-depth”和“ --no-single-branch”需要一起使用才能获得与以前相同的行为。这被视为错误修复。


3
master是您的本地分支机构。remotes/origin/master是相应的远程分支。到底是什么问题?
michas

1
您也许忘记了冗长吗?试试git branch -avv
jthill

到其他地方:我们通常不将master称为分支机构,对于造成的混乱,我们深表歉意。添加了“未显示两个远程分支”。致ththill:感谢您的提醒,您是正确的。
minghua 2014年

1
感谢您的介绍git clone --depth=1 --no-single-branch,这是我在大多数情况下需要的。
Alireza Mohamadi

Answers:


63

该行为是正确的,在上次修订之后,主分支(由于这是主远程的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结果提交链的长度最多为20。” 因此,浅层克隆应从分支的尖端开始包含请求的提交深度。

作为-除了-的文档git clone--single-branch-option描述:

“仅克隆通向单个分支尖端的历史记录,该历史记录由--branch选项指定,或者由主分支远程HEAD站点的点指定。当使用该--depth选项创建浅表克隆时,这是默认设置,除非--no-single-branch给出了获取附近的历史记录的选项。所有分支机构的提示。

因此,一个浅克隆深度 -选项)只只有一个单一的分支(以您所要求的深度)。


不幸的是,这两个选项(--depth--single-branch)过去都是错误的,浅克隆的使用隐含了未解决的问题(如您在我上面发布的链接中所读),这是由给定的历史重写引起的。在特殊情况下,这总体上导致某些复杂的行为。


1
florianb:您的git版本是什么?感谢您尝试。我在1.7.1上做了--depth 1,它显示了所有远程分支。以此更新了问题。+1用于验证问题。
minghua 2014年

1
@minghua:我使用的是1.8.4-如果该问题有补丁,我会做一些调查。
Florian Breisch 2014年

1
@minghua:我编辑以反映有关“浅克隆”的新发现。
Florian Breisch 2014年

1
这几乎是完美的,只有一件事:说“回购所有者决定切断其他分支”是什么意思?我认为那些分支仍然存在。
minghua 2014年

2
--no-single-branch还会克隆所有标签。我们可以通过创建一个新的仓库来避免这种情况,使用相同的配置来获取所有远程数据库,即fetch = +refs/heads/*:refs/remotes/origin/*,然后运行git fetch --depth 1(不带--tags)。我们还可以使用config等添加要提取的特定标签fetch = +refs/tags/v2.0.0:refs/tags/v2.0.0
山姆·沃特金斯

204

进行浅层克隆后,为了能够从远程签出其他分支

  1. 运行(感谢@jthill):

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

  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/*

57
您还可以git remote set-branches origin '*'将所有分支都使用,用的分支名称替换*
jthill 2014年

谢谢!这挽救了我的一天。
史蒂文·徐

是什么-vvv意思git fetch -vvv?我在git-fetch doc中找不到有关它的任何信息
guo

@guo是用于verbosity或的debug日志记录级别git。不是来自fetch方法。
Marlo

1
@ kawing-chiu如果您有这么多分支机构,并且对于“互联网连接”而言规模太大了,现在可以负担得起所有这些分支机构,则这很有用。:)
marlo

61

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

$ 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

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


15
最好使用git remote set-branches --add origin 'remote_branch_name'新分支作为现有分支的补充,而不是替换远程分支的分支列表(或分支模式)以在.git / config文件中获取。
dumbledad '17

2
天哪,单引号'很重要git remote set-branches --add origin 'remote_branch_name'
周末

@Weekend,直到我取消单引号之前,我无法正常工作
PandaWood

@PandaWood您可能在Windows上。答案中的“ $”符号表示Bash(在Unix或Cygwin / MSYS上)。
吴永伟

我在文档中没有看到关于单引号的任何信息,并且至少在macOS上没有单引号似乎可以正常工作。
Nickolay,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.