有时获取任何git存储库(通过执行" git fetch repository_URL")可能需要数小时,具体取决于存储库的大小和网络速度.
如果出于某种原因,用户取消了中途获取,然后尝试获取相同的存储库,在他/她取消最后一次获取的完全相同的环境中,获取将如何工作?
它会从中断处继续取回吗?
不(2015年)或可能很快(2018年第四季度),git clone/fetch/pull运营没有"恢复"能力.
自那时候起:
2015年:
这个帖子中提到的唯一替代方案是gitolite(这是一个管理ACM的perl脚本 - 您的repo的访问控制级别,以及围绕git访问提供其他实用程序)
gitolite可以配置为更新"Git bundle"(参见
git-bundle手册),然后可以通过rsync或HTTP协议下载它,然后可以使用支持恢复的HTTP客户端的rsync客户端下载它.使用这种技术可以使"下载所有内容"和"从下载的内容中制作回购"步骤不同,并且可以使用任意数量的尝试来执行第一步.
缺点很明显:
- 这需要在服务器端进行特殊设置.
- 目前还不清楚如果有人在下载其捆绑包时设法更新存储库,或者在相邻下载尝试之间进行更新,会发生什么.
关于git clone/ 的可恢复功能fetch(在" 如何为不稳定连接上的大项目完成git克隆? "中提到),最近在git邮件列表上进行了讨论(2016年3月).
wget -c!)并添加到本地仓库(因为捆绑包是一个可以克隆的文件,就好像它是一个git仓库).那是:
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
Run Code Online (Sandbox Code Playgroud)
git clone,在此线程讨论我们可以通过制作一些智能和愚蠢的HTTP协议的混合来实现可恢复克隆.
A
git clone最终调用传输层,git-remote-curl并将探测info/clone URL; 如果资源加载失败,一切都会通过传统的代码路径.当
git-remote-curl检测到哑巴克隆的支持时,它会在内部进行"重试直到成功完全下载数据包",暂时更新远程跟踪引用,然后假装它被要求进行增量提取.如果没有任何成功die(),每个人都很高兴.如果上述步骤3.
die()由于某种原因(包括急躁打击CTRLC),请保留$GIT_DIR下载的.info文件和部分下载的.pack文件.
告诉用户克隆可以恢复以及如何恢复.
请注意,这是一个可恢复的克隆,而不是一个可恢复的提取:
初始"克隆"和随后的增量"获取"是正交问题.
因为建议的"克隆"更新比建议的"获取"更改具有更大的收益,即
- 传输的数据量要大得多,因此在较差的网络环境中网络超时的可能性要高得多,需要恢复更大的数据.
- 不仅这种方法使"克隆"可以恢复并帮助客户端,它还有助于服务器卸载批量转移到CDN.
它对现有代码的损害要小得多,即
- 我们不必对包装过程进行微调,只是为了丢弃生成的大量字节,就像提出的"获取"方法一样.
- 所需的区域新代码是完全隔离的,并且在交换的早期就可以切换到新协议,而无需将代码共享到现有的代码路径; 这些属性使得引入回归的风险降低.
为了避免新协议中的仅HTTP功能,有人建议使用"v2"协议,让双方在ref广告之前交换功能.然后,客户端看到服务器的可恢复URL后,知道是否继续进行广告.
请参阅stefanbeller/gitprotocol2-102017年7月.
| 归档时间: |
|
| 查看次数: |
1874 次 |
| 最近记录: |