hen*_*dry 46 git github shallow-clone
我们使用git来分发操作系统并使其保持最新状态.我们无法分发完整的存储库,因为它太大(> 2GB),所以我们一直在使用浅克隆(~300M).然而,最近从浅层克隆中获取时,它现在无法有效地获取整个> 2GB存储库.这对于部署而言是无法浪费的带宽浪费.
git文档说你无法从浅存储库中获取,尽管这绝对不是真的.是否有任何变通方法git clone --depth 1可以获取它的变化?或者其他一些策略是保持分布大小尽可能小,同时让git需要进行更新所有位?
我没有成功尝试克隆--depth 20,看它是否会更有效地升级,这是行不通的.我也看了http://git-scm.com/docs/git-bundle,但这似乎创造了巨大的捆绑.
jth*_*ill 38
--depth是一种git fetch选择.我看到doc并没有真正突出显示git clone取得的内容.
当你获取时,两个repos交换信息,关于谁拥有什么,从远程的头开始,向后搜索获取的refs历史中最近的共享提交,然后填写所有缺少的对象,以完成之间的新提交最近的共享提交和新提交的提交.
一--depth=1取刚刚得到的枝梢,无病史.对这些历史记录的进一步提取将通过上述过程获取所有新内容,但如果先前提取的提交不在新获取的历史记录中,则fetch将检索所有这些提取 - 除非您限制提取--depth.
您的客户从一个仓库进行了深度= 1的提取,并将网址切换到另一个仓库.在这个新的repo的refs中,至少有一条长长的祖先路径显然不会与你回购中的任何内容共享任何提交.这可能值得研究,但除非出于某种特殊原因,否则您的客户可以进行每次获取--depth=1.
Wat*_*ink 26
刚刚做了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
Run Code Online (Sandbox Code Playgroud)
代码更新
git fetch origin branch:branch --depth 1
Run Code Online (Sandbox Code Playgroud)
Von*_*onC 11
请注意,Git 1.9/2.0(2014年第一季度)可以更有效地获取浅层克隆.
见提交82fba2b,从阮泰玉维战(pclouds):
既然git支持从浅层克隆到浅层克隆的数据传输,那么这些限制就不再适用了.
所有细节都在" shallow.c:选择新提交的8个步骤.git/shallow ".
您可以在0d7d285,f2c681c和c29a7b8这样的提交中看到后果,它们支持clone,send-pack/receive-pack和/或来自浅克隆.
smart-http现在也支持浅层提取/克隆.
你甚至可以克隆一个浅的回购.
2015年更新:git 2.5 +(2015年第二季度)甚至允许单次提交!请参阅" 从远程git存储库中提取特定提交 ".
2016年(10月)更新:git 2.11 +(2016年第4季度)允许获取:
如果您可以选择特定分支,则可以更快.这是使用Spark master分支和最新标记的示例:
初始克隆
git clone git@github.com:apache/spark.git --branch master --single-branch --depth 1
Run Code Online (Sandbox Code Playgroud)
更新到特定标签
git fetch --depth 1 origin tags/v1.6.0
Run Code Online (Sandbox Code Playgroud)
以这种方式切换标签/分支变得非常快.
| 归档时间: |
|
| 查看次数: |
31504 次 |
| 最近记录: |