When/Why 有人会克隆一个特定的分支而不是整个存储库吗?

When/Why would someone clone a specific branch instead of the whole repository?

我正在阅读 this 博客并开始了解

git remote add -t <remoteBranchName> -f origin <remoteRepoUrlPath>

根据博客,此命令克隆指定的远程分支。但是为什么有人会只克隆一个分支呢?我想知道什么情况下只需要克隆一个分支?

任何见解将不胜感激,提前致谢!!

我认为至少有 3 个原因:

  • CI 服务器通常不需要为了 运行 管道检出整个存储库。例如,我正在考虑多分支管道,其中管道是根据触发构建的分支定制的。
  • 克隆存储库可能需要几分钟时间,尤其是在许多开发人员正在试验新功能(我假设是分支)的项目中
  • 如果您知道要在特定分支上工作,为什么还需要其他分支?只是。愚蠢的例子:我有一个 git 别名显示 所有 分支的图表,但大多数时候我只对我正在处理的那个感兴趣。如果您的回购包含许多分支,则在 运行 宁 git 命令的脚本时更有可能出错。

从来没有1 需要这样做。

人们有时 想要 这样做,通常是由于误解(他们认为 Git 分支比实际更重要)。你看到这个的第一反应应该是:不想那样做。

所谓的单分支克隆,在Git中,意味着git fetch操作忽略除一个分支名称之外的所有分支名称,只带来在满足该分支的尖端提交所需的任何提交上。但是,如果您的存储库不是 shallow 存储库,这通常意味着无论如何都要带来几乎所有的提交,即,通常很少有时间和 space 进行单次提交节省分支克隆。此规则有例外情况(请参阅脚注 1),如果您确实 确实 节省了大量资金,则可以继续这样做。

您通常可以节省更多时间,并且 space 使用 Git 所谓的 shallow 克隆。因此,除了单分支克隆之外,您可能还想创建一个浅层克隆。 git clone--depth 参数默认创建一个浅的单分支克隆。

浅克隆有一些限制,但大多数讨厌的(例如无法使用 git push 从一个)很久以前就被删除了。由于默认情况下浅克隆是单分支克隆,因此最好了解单分支克隆的作用。

使用任何克隆,尝试 运行:

git ls-remote

(此命令仅打印内容,它不会对您的存储库执行任何操作)。您会看到您的 Git 调用的另一个 Git 列出了 所有 的分支和标记名称以及相应的哈希 ID。这使您的 Git 能够请求他们拥有的所有提交,并为他们的每个分支名称创建或更新远程跟踪名称。如果您不 想要 所有这些,您可以消除大部分这些远程跟踪名称。这加快了一些速度。2 此外,通过不要求他们的某些提交,您可以避免获得他们的 所有 提交——尽管,再次, shallow 克隆 far 更有效地确保您不会获得他们的所有提交。


1在此处插入 Gilbert & Sullivan 例程。有一些特殊情况,例如,当已知分支 X 从不包含具有大文件的提交并且分支 Y 包含 do 具有大文件的提交并且本地磁盘上没有足够的空间容纳大文件。但是“因为是faster/smaller”并不是体力上的要求,只是急躁而已。 :-) 有关更多信息,请参阅上面的其余部分,关于浅层克隆。

2虽然 git ls-remote 必然会询问他们的 Git 关于 所有 他们的分支机构,有些相当最近的工作使 Git 的某些版本更智能一些,因此如果您有一个单分支克隆,或一个 N 值较小的 N 分支克隆,您的 Git 可以告诉他们 Git 你不需要 every 分支和标签名称。在一些存储库中——例如 Google 的 Chrome——有如此多的分支和标签名称,仅此一项节省就很明显了。

为此,Gits(您的和远程的)都必须相当现代。 Git 1.x 就出来了。