使用Google' repo'进行多次结帐的共享对象商店工具?

时间:2017-05-30 13:59:10

标签: linux git repo

在我的组织中,我们使用Google的repo工具来维护代码库,这些代码库分布在大约200个git存储库中。由于编译和测试运行速度非常慢,我通常不仅要在我的Linux机器上检查该源代码树(例如,当前正在编译的源代码树,以及另一个我准备下一次提交的源代码树)。

这些签出的源树每个消耗约7.5GB,其中5.5GB是git对象存储(通常在每个存储库的.git文件夹中,但repo将其重定向到{{1源树的根目录中的文件夹),实际工作副本只有2GB。所以我的问题是:我如何(轻松)使这些不同的签出共享其对象存储,以便对象存储中的每个git对象只存储在我的硬盘上一次?

我知道这可以通过单个git存储库的多个签出来实现,但不确定repo的对象存储重定向如何影响这些方法。简单地用硬链接替换重复文件可能不起作用,因为git将大多数对象存储在共享包文件中,并且即使它们内部的对象都存在,它们在不同的检出之间也不会相同。

2 个答案:

答案 0 :(得分:1)

我正在做的是:

  1. 运行repo init初始化新的回购。

  2. .repo内创建两个名为project-objectsprojects的符号链接,指向现有.repo中的同名目录。

    < / LI>
  3. 然后上升一级repo sync

  4. 到目前为止,

    repo喜欢这个;如果我遇到任何问题,我会更新这个答案。

    几乎可以肯定,我们希望避免在以这种方式共享对象的repo树中运行并发repo操作,因为这些操作可能会在同一个git存储库中发出并发操作。

    如果这是要走的路,明显的下一步是将全局对象存储放在任何.repo目录之外的某个特殊位置,并通过符号链接指向所有这些目录。

    看起来--mirror的{​​{1}}和--reference参数应该达到类似的效果,但我找不到任何关于它们的文档来解释它们究竟做了什么,{ {1}}细节不足。看起来好像repo应该下载一个repo的本地镜像(不是客户端检出而是一个特殊的镜像对象),然后在检出客户端repos时用repo help init参数引用它。

    符号链接的优点是我理解他们在做什么而不必阅读未记录的Python源代码。

答案 1 :(得分:0)

我已经制作了一个原型:https://github.com/zhangchunlin/git-repo/commit/0c16efd203f0b768c103362386f9ae67730bb78f

但是经过测试后,它不能很好地工作,当它是一个很大的git并且需要打包到一个打包文件时,回购的工作区1和工作区2将创建2个git打包文件,也就是说不共享。使用git 1.9.1,2.10.1、2.18.0进行测试,结果完全相同。

user1@server1:~/.project-objects/platform/external/sonivox.git/objects/pack$ ll
total 40648
drwxrwxr-x 2 user1 user1     4096  7月 11 22:30 ./
drwxrwxr-x 4 user1 user1     4096  7月 11 17:16 ../
-r--r--r-- 1 user1 user1   600272  7月 11 22:30 pack-1f3a4c983b7a4c0e6233201745b07f43e5c6daf4.idx
-r--r--r-- 1 user1 user1 20202460  7月 11 22:30 pack-1f3a4c983b7a4c0e6233201745b07f43e5c6daf4.pack
-r--r--r-- 1 user1 user1   600468  7月 11 17:16 pack-47b57752fd0d754b098b23654c31c8dc9be83cd0.idx
-r--r--r-- 1 user1 user1 20203424  7月 11 17:16 pack-47b57752fd0d754b098b23654c31c8dc9be83cd0.pack

如果可以解决这个问题,我认为这是可行的