如何从浅层克隆中有效地获取git

时间:2013-10-14 03:00:32

标签: git github shallow-clone

我们使用git to distribute an operating system and keep it upto date。我们无法分发完整的存储库,因为它太大(> 2GB),所以我们一直在使用浅克隆(~300M)。但是recently when fetching from a shallow clone, it's now inefficiently fetches the entire >2GB repository。这对于部署来说是一种难以为继的带宽浪费。

git文档说你无法从浅存储库中获取,尽管这绝对不是真的。是否有任何变通方法可以让git clone --depth 1能够从中获取更改内容?或者其他一些策略是保持分发大小尽可能小,同时让git需要进行更新所有位?

我没有成功尝试从--depth 20克隆,看看它是否会更有效地升级,但是没有用。我也考虑了http://git-scm.com/docs/git-bundle,但这似乎创造了巨大的捆绑。

5 个答案:

答案 0 :(得分:35)

--depthgit fetch选项。我发现文档没有真正强调git clone进行提取。

当您获取时,两个存储库交换信息关于谁拥有什么,从远程的头开始并向后搜索获取的refs历史中的最新共享提交,然后填写所有缺少的对象以完成新的在最近的共享提交和新提交的提交之间提交。

--depth=1 fetch只获取分支提示,没有先前的历史记录。进一步提取这些历史记录将通过上述过程获取所有新内容,但如果先前提取的提交不在新获取的历史记录中,则提取将检索所有提交 - 除非您使用--depth限制提取。

您的客户从一个仓库进行了深度= 1的提取,并将网址切换到另一个仓库。在这个新的repo的refs中,至少有一条长长的祖先路径显然不会与你回购中的任何内容共享任何提交。这可能值得调查,但除非出于某种特殊原因,否则您的客户可以执行每次提取--depth=1

答案 1 :(得分:25)

刚刚做过g clone github.com:torvalds/linux并花了很多时间,所以我只是跳过CTRL+C

然后做了g clone github.com:torvalds/linux --depth 1并且确实克隆得很快。我在git log只有一次提交。

所以clone --depth 1应该有效。如果需要更新现有存储库,则应使用git fetch origin branchname:branchname --depth 1。它也有效,它只提取一次提交。

总结:

初始克隆:

git clone git_url --depth 1

代码更新

git fetch origin branch:branch --depth 1

答案 2 :(得分:10)

请注意,Git 1.9 / 2.0(2014年第一季度)可以更有效地获取浅层克隆 请参阅commit 82fba2b中的Nguyễn Thái Ngọc Duy (pclouds)

  

现在git支持从浅层克隆到浅层克隆的数据传输,这些限制不再适用。

所有细节都在“shallow.c: the 8 steps to select new commits for .git/shallow”中。

您可以在提交支持克隆,send-pack / receive-pack和/来自浅克隆的0d7d285f2c681cc29a7b8等提交中查看结果。
smart-http now supports shallow fetch/clone too
你可以even clone form a shallow repo

2015年更新:git 2.5 +(2015年第二季度)甚至允许单次提交提取!请参阅“Pull a specific commit from a remote git repository”。

2016年更新(10月):git 2.11 +(2016年第4季度)允许抓取:

答案 3 :(得分:9)

如果您可以选择特定分支,则可以更快。这是使用Spark主分支和最新标记的示例:

初始克隆

git clone git@github.com:apache/spark.git --branch master --single-branch --depth 1

更新为特定代码

git fetch --depth 1 origin tags/v1.6.0

以这种方式切换标签/分支变得非常快。

答案 4 :(得分:1)

我不知道它是否适合您的设置,但我使用的是在一个单独的目录中完全克隆一个repo。然后我从远程存储库中参考本地存储器进行浅层克隆。

git clone --depth 1 --reference /path/to/local/clone git@some.com/group/repo.git 

这样只实际获取了与引用存储库和远程数据库的差异。为了更快地使用--shared选项,请务必阅读git文档中的限制(这可能很危险)。

此外,我发现在某些情况下,当遥控器发生了很大变化时,克隆会开始获取太多数据。然后打破它并更新引用repo是很好的(奇怪的是带宽比首先要少得多。)然后再次启动克隆。