有时提取任何git存储库(通过执行“git fetch repository_URL
”)可能需要数小时,具体取决于存储库大小和网络速度。
如果出于某种原因,用户取消了中途获取然后尝试获取相同的存储库,在他/她取消最后一次获取的完全相同的环境中,获取将如何工作?
它会从中断处继续取回吗?
答案 0 :(得分:5)
否(2015年)或者很快(2018年第4季度),git clone/fetch/pull
运营没有"简历"能力。
此后:
2015:
唯一的选择mentioned in this thread是 gitolite (这是一个管理ACM的perl脚本 - 您的回购的访问控制级别,以及提供其他实用程序git access)
gitolite可以配置为更新" Git捆绑" (见
git-bundle
manual)然后可以通过rsync或者下载 HTTP协议然后可以使用a的rsync客户端下载 支持恢复的HTTP客户端。使用这种技术可以使"下载所有内容"和#34;从下载的东西中回购#34;步骤不同,第一步可以使用任意次数的尝试进行。
缺点很明显:
- 这需要在服务器端进行特殊设置。
- 目前还不清楚如果有人设法更新存储库会发生什么 有人正在下载其捆绑包,或者更新发生 相邻的下载尝试之间。
醇>
关于git clone
/ fetch
的可恢复功能(在" How to complete a git clone for a big project on an unstable connection?"中提到),最近有一个关于{{{2016}的讨论(2016年3月) 3}}
wget -c
恢复!)并添加到本地仓库(因为捆绑包是一个文件,你可以克隆,好像是一个git repo)
请参阅" git mailing list" 那是:
wget -c https://cdn.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/clone.bundle
git bundle verify clone.bundle
...
clone.bundle is okay
git clone clone.bundle linux
#Now, point the origin to the live git repository and get the latest changes:
cd linux
git remote remove origin
git remote add origin https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
git pull origin master
git clone
,Cloning Linux from a bundle 我们可以通过制作一点混合来实现可恢复克隆 智能和愚蠢的HTTP协议。
git clone
最终会调用传输层,并且git-remote-curl
将探测info / clone网址;如果资源 无法加载,一切都通过传统的代码路径。当
git-remote-curl
检测到哑巴克隆的支持时,它会执行 "重试,直到成功完全下载包数据"舞蹈 在内部,暂时更新远程跟踪引用,然后 假装好像被要求进行增量提取。如果这 没有任何die()
成功,每个人都很高兴。- 醇>
如果上述步骤3.由于某种原因必须
die()
(包括 急躁 CTRL C ),保留$GIT_DIR
,下载的.info
文件和部分下载的.pack
文件。
告诉用户可以恢复克隆以及如何进行克隆。
请注意,这是针对可恢复的克隆discussed in this thread:
最初的"克隆"以及随后的增量" fetch"是正交问题。
因为建议更新"克隆"有比这更大的回报 建议改为" fetch",即
- 传输的数据量要大得多 在糟糕的网络环境中网络超时的可能性是 更高,需要恢复更大。
- 这种方法不仅可以克隆"克隆"可以恢复和帮助 客户端,它可以帮助服务器卸载批量转移到CDN。
它对现有代码的损害要小得多,即
- 我们不必对包装过程感到悲观,只是放弃 生成的大部分字节,就像提出的方法一样 for" fetch"。
- 需要的区域新代码很好地隔离并切换到 新协议在交换的早期就发生而不共享 代码到现有的代码路径;这些属性使其风险较小 介绍回归。
为避免新协议中仅支持HTTP的功能,建议使用" v2"在裁判广告之前让双方交换能力的协议。然后,客户端看到服务器的可恢复URL,知道是否继续进行广告 请参阅2017年7月的not a resumable fetch。