修复因大二进制文件而变慢的git repo

anr*_*r78 19 git

我们有一个包含源代码和二进制文件的git repo.裸仓库现已达到约9GB,克隆它需要很长时间.大部分时间都花在"远程:压缩对象"上.在使用其中一个较大的二进制文件的新版本提交之后,获取需要很长时间,也会花费在服务器上压缩对象.

没有远程压缩对象的情况下阅读git pull之后,我怀疑二进制文件的delta压缩也会伤害我们,但我并不是100%肯定如何解决这个问题.

在服务器上修复裸仓库的确切步骤是什么?我猜:

  • 为我想要的所有扩展名添加像'*.zip -delta'这样的条目.git/info/attributes
  • 运行'git repack',但有什么选择?-adF会重新打包所有内容,并给我一个repo,其中没有对指定的文件类型进行增量压缩吗?
  • 运行'git prune'.我以为这是自动完成的,但是当我玩这个repo的裸克隆时,运行它会减小~2GB的大小
  • 克隆repo,添加并提交一个.gitattributes,其条目与我在裸仓库中的.git/info/attributes中添加的条目相同

我有事吗?

更新:

对此有一些有趣的测试结果.今天我开始对有问题的回购进行了简单的克隆.我们不那么强大的4GB内存服务器耗尽内存并开始交换.3个小时后我放弃了......

然后我从我最新的工作副本中克隆了一份裸露的回购.在工作站之间克隆一个大约需要5分钟.然后我把它作为一个新的回购推送到服务器.克隆那个回购仅用了7分钟.

如果我正确地解释了这一点,即使没有禁用二进制文件的增量压缩,更好的压缩仓库也会表现得更好.我想这意味着上面的步骤确实是我想在短期内做的事情,但另外我需要找出如何限制git被允许用于服务器上的打包/压缩的内存量,这样我就可以避免了交换.

如果重要:服务器运行git 1.7.0.4,工作站运行1.7.9.5.

更新2:

我在testrepo上做了以下步骤,并认为我有机会在服务器上执行它们(备份后)

  • 打包对象时限制内存使用量

    git config pack.windowMemory 100m
    git config pack.packSizeLimit 200m

  • 禁用某些扩展的增量压缩

    echo'*.tar.gz -delta'>> info/attributes
    echo'*.tar.bz2 -delta'>> info/attributes
    echo'*.bin -delta'>> info/attributes
    echo'*.png -delta '>> info/attributes

  • 重新包装存储库并收集垃圾

    git repack -a -d -F --window-memory 100m - max-pack-size 200m
    git gc

更新3:

此操作后出现一些意外的副作用:尝试重新打包git repo以提高性能后出现问题

Ami*_*bin 7

虽然您的问题询问如何使您当前的回购更有效率,但我认为这不可行.

遵循人群的建议:

  1. 将您的大二进制文件移出您的仓库
  2. 将您的开发环境移动到虚拟机映像:https://www.virtualbox.org/
  3. 使用这个Python脚本来清理那些大型二进制blob的repo(我在我的repo上使用它并且效果很好) https://gist.github.com/1433794


xce*_*ion 0

你应该使用不同的机制来存储大二进制文件,如果它们是由你不能存储它们的东西生成的,只能存储生成它们的代码,否则我建议将它们全部移动到一个目录并使用 rsync 或 svn 进行管理根据您的需求。

  • 我想 rootfs 上的文件实际上很少会在每次构建时进行更改,因此在这种情况下,不压缩它们而是直接将它们添加到存储库中可能会更明智(以防万一这不够清楚,请添加整个文件)目录你添加到 tar 而不是生成的 tar.bz2 文件),这样你的 diff 应该更小,因为 git 不能很好地处理 diff-ing 二进制文件。 (3认同)