有时获取任何 git 存储库(通过执行“git fetch repository_URL
") 可能需要几个小时,具体取决于存储库的大小和网络速度。
如果由于某种原因用户中途取消了提取,然后稍后尝试在他/她取消上次提取的完全相同的环境中提取相同的存储库,那么提取将如何工作?
它会从中断处恢复提取吗?
否(2015 年)或可能很快(2018 年第 4 季度),git clone/fetch/pull
操作没有“恢复”功能。
自那以后:
- 2018 年第四季度,Git 2.18 和 2.19 引入了 Wire v2 协议.
-
GitLab 将从 2018 年 10 月开始支持它.
2015:
唯一的选择,在这个线程中提到, is gitolite(这是一个管理 ACM 的 Perl 脚本——您的存储库的访问控制级别,并提供围绕 git 访问的其他实用程序)
gitolite 可以配置为更新“Git 包”(请参阅git-bundle manual)然后可以通过 rsync 或
HTTP 协议,然后可以使用 rsync 客户端下载
支持断点续传的HTTP客户端。
使用此技术可以使“下载所有内容”和“从下载的内容中创建存储库”步骤截然不同,并且可以使用任意次数的尝试来执行第一步。
缺点也很明显:
- 这需要在服务器端进行特殊设置。
- 目前尚不清楚如果有人设法更新存储库会发生什么
当有人下载其捆绑包或更新时
相邻下载尝试之间。
关于可恢复功能git clone
/fetch
(在“如何在连接不稳定的情况下完成大项目的git克隆?”),最近(2016 年 3 月)有一次关于git 邮件列表.
- 一种方法是让服务器生成可以加载的包(使用resume
wget -c
!)并添加到本地存储库(因为捆绑包是one您可以从中克隆文件,就好像它是 git 存储库一样)。
See "从捆绑包克隆 Linux"
That is:
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
,在此线程中讨论
我们可以通过混合以下方式来实现可恢复克隆
智能和愚蠢的HTTP协议。
A git clone
最终调用传输层,并且git-remote-curl
将探测信息/克隆 URL;如果资源
无法加载,一切都通过传统的代码路径。
When git-remote-curl
检测到哑克隆的支持,它会执行以下操作
“重试,直到成功完全下载包数据”舞蹈
在内部,暂时更新远程跟踪引用,然后
假装好像被要求进行增量获取。如果这
成功,没有任何die()
,皆大欢喜。
If the above step 3. has to die()
for some reason (including
impatience hitting CTRLC), leave the $GIT_DIR
, downloaded .info
file and partially downloaded .pack
file.
Tell the user that the cloning can be resumed and how.
请注意,这是针对可恢复克隆的,not可恢复的获取:
最初的“克隆”和随后的增量“获取”是正交问题.
因为提议的“克隆”更新比
建议更改为“fetch”,即
- 传输的数据量要大得多,因此
在网络环境较差的情况下,网络超时的几率为
高得多,恢复的需要就大得多。
- 该方法不仅使“克隆”可恢复并且有帮助
客户端,它可以帮助服务器卸载批量传输到 CDN。
并且它对现有代码的损害要小得多,即
- 我们不必悲观包装过程,只需丢弃
生成的大量字节,就像建议的方法一样
对于“获取”。
- 需要新代码的区域被很好地隔离并且切换到
新协议在交换过程中很早就发生,但没有共享
代码到现有的代码路径;这些特性使其风险较小
引入回归。
为了避免新协议中仅使用 HTTP 功能,有人提议使用“v2”协议,让双方在 ref 通告之前交换功能。然后,客户端在看到服务器的可恢复 URL 后,就知道是否继续进行广告。
See stefanbeller/gitprotocol2-102017年7月。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)