深究repo的所谓“续传”功能

从网上了解到的种种下载android源码失败的处理,都提到repo同步是可以“续传”的,我也一直认为这个所谓的“续传”是“断点续传”的意思。直到我在下载android-x86这个开源项目时,才发现这个“续传”不是“断点续传”。

现象是这样的:由于服务器的不稳定,在下载到frameworks/base这个有几GB的project时老是失败,提示信息先后是“The remote end hung up unexpectedly”、“early EOF”、“index-packed failed”,查了一下是因为压缩文件太大,在网络不稳定的情况下容易出现超时现象导致repo同步过程结束并重新开始。但是续传多次失败后(编写了一个重复repo同步过程的脚本),下载目录.repo占用空间却越来越大,按官方的说法下载完毕应该才9GB多,实际却达到了差不多20GB,这是为哪般呢?

原因要先分析git的工作原理,它在下载的时候是将project压缩成一个包下载,然后到本地解压缩的,这个压缩包的本地存放地址是project目录下的objects/pack。由于repo工具实际上使用的是git,frameworks/base对应的就是.repo/projects/frameworks/base.git/objects/pack,压缩包名称是tmp_pack_XXXXXX,后面六位是由repo调用的git根据当前时间随机生成的,当网络超时就会中断repo同步过程,重新开始repo同步过程到断点处会生成一个压缩文件名进行下载,这就导致原有的压缩文件成为垃圾文件。在实际情况下,这个目录下的垃圾文件达到了15GB,也就是没有下载完毕却空间占用有这么大的原因。

在网上找到一个办法说是在.gitconfig的core段加compression=-1,实测没有效果,原因可能是因为这个是针对git的clone命令的,而repo工具使用的是git的fetch命令。

在一个国外的博客(引用一)找到了另一种办法:其原理大致就是修改repo工具中的sync.py,在网络同步某一project失败的时候不是异常退出repo同步过程而是继续同步此project直到成功,但是这样只能解决某一project失败导致repo同步过程中断的问题,仍然无法避免垃圾文件的不断产生,而且它存在的一个问题就是当某一project一直无法完成时将导致它的垃圾文件越来越多。在新的repo工具中sync增加了一个“--force-broken”选项,可以在某个project同步失败的时候跳到下一个project执行而不是中断repo同步过程。关于repo的分析可以参考老罗的博客(引用二)。

在stackoverflow上(引用三、四)讲到了使用“--depth”方式减少压缩文件大小或使用bundle方式,但这两种方式都有局限性:前者仍然依赖于网络状况,后者需要官方或第三方提供bundle文件。

总结:
1、repo同步的续传机制仅到project这一级,当下载失败的时候是新建一个临时压缩文件下载,而不是在旧的压缩文件基础上断点续传。
2、repo同步的“--force-broken”参数可用于在一个project下载失败的时候继续下一个project而不是中断repo同步过程。
3、git断点续传仍无明确解决办法。临时文件名的生成及创建是在wrapper.c的git_mkstemps_mode函数中进行的。

引用:
1、repo sync problems - Android Eclair
http://android.amberfog.com/?p=230

2、Android源代码仓库及其管理工具Repo分析
http://blog.csdn.net/luoshengyang/article/details/18195205

3、fatal: early EOF fatal: index-pack failed
http://stackoverflow.com/questions/21277806/fatal-early-eof-fatal-index-pack-failed

4、How to complete a git clone for a big project on an unstable connection
http://stackoverflow.com/questions/3954852/how-to-complete-a-git-clone-for-a-big-project-on-an-unstable-connection

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
repo project 是指存储库项目,它是一种管理软件开发过程中代码存储和版本控制的工具。它使用版本控制系统(如Git)来跟踪和记录代码的变化,并将代码存储在一个中央位置,供团队成员随时查看和访问。repo project 可以帮助团队成员协同工作,共享代码,并保证每个人都使用相同版本的代码。 repo project 的主要功能包括代码分支管理、合并和冲突解决。它允许开发人员创建不同的分支,在每个分支上进行独立的开发工作,然后将更改合并到主分支中。如果多人同时修改同一个文件,可能会出现冲突,repo project 提供了解决冲突的机制,使团队能够协调一致地修改代码。 repo project 还提供了版本控制的历史记录和回滚功能。每次更改都会记录下来,开发人员可以随时查看先前的版本,并在需要时回滚到之前的版本。这有助于追踪和管理代码的演进,以及在出现问题时进行回退。 此外,repo project 还可以与其他工具集成,例如持续集成工具、项目管理工具和代码审查工具。这些集成可以进一步优化开发过程,提高团队的工作效率和代码质量。 综上所述,repo project 是一个强大的代码存储和版本控制工具,它可以帮助团队协同开发、追踪代码变化并保证代码的一致性和质量。在现代软件开发中,repo project 已成为必备的工具之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值