Performance 如何优化git更新索引?

Performance 如何优化git更新索引?,performance,git,optimization,git-filter-branch,git-rewrite-history,Performance,Git,Optimization,Git Filter Branch,Git Rewrite History,我有一个相当大的存储库(11GB,900000多个文件),在合理的时间内进行迭代时遇到困难。经过一点分析,真正的瓶颈似乎是git更新索引: $ time git update-index --replace $path > /dev/null real 0m5.766s user 0m1.984s sys 0m0.391s 这使得获取文件列表的天数无法忍受。有没有办法加快更新索引操作的速度 值得一提的是,我正在Windows7上运行cygwin 编辑:为问题添加更多

我有一个相当大的存储库(11GB,900000多个文件),在合理的时间内进行迭代时遇到困难。经过一点分析,真正的瓶颈似乎是git更新索引:

$ time git update-index --replace $path > /dev/null

real    0m5.766s
user    0m1.984s
sys     0m0.391s
这使得获取文件列表的天数无法忍受。有没有办法加快更新索引操作的速度

值得一提的是,我正在Windows7上运行cygwin

编辑:为问题添加更多上下文

大型存储库来自一个SVN导入,包含许多不应该在存储库中的二进制文件。但是,我希望保留提交历史记录和提交日志。为了做到这一点,我正在尝试用文件散列替换二进制文件的内容,这将压缩存储库并允许我保留历史。

您想使用,这是一种比
git过滤器分支
更快、更简单的替代方法,专门用于从git repos中删除大型文件

下载(需要Java 6或更高版本)并运行以下命令:

$ java -jar bfg.jar  --strip-blobs-bigger-than 1MB  my-repo.git
任何大小超过1MB的文件(不在您最近提交的文件中)都将从Git存储库的历史记录中删除,并替换为
.Git id
文件,该文件包含原始文件的旧Git哈希id(与问题的文件哈希替换二进制文件的内容相匹配)

然后可以使用
git gc
清除死数据:

$ git gc --prune=now --aggressive
BFG通常比运行
git过滤器分支
更快,并且选项是围绕以下两种常见用例定制的:

  • 删除疯狂的大文件
  • 删除密码、凭据和其他私人数据

全面披露:我是BFG回购清理器的作者。

这是一个已知的问题,事实上git的最大问题是它的速度。一个解决方案是分割你的项目(因为900000个文件是一个巨大的数目),我认为这是一个重复:@Vince,好吧,以大规模回购的速度。我仍然更愿意在几乎任何回购协议的任何一天发行
git分支机构
,然后发行
svn副本
。@Christopher是的,我不是说这是一个止步秀。我在有10000份文件的回购协议上试用过,效果很好。不管怎样,如果子模块有问题,它也有类似的功能。在这个精确的例子中,有900000个文件,我相信Git不是唯一一个被混淆的…@Vince子存储库是一个可靠的想法。webmage,这些文件是经常更改还是大部分时间都是静态的?@webmage你确定使用二进制文件是个好主意吗?我的意思是,难道不可能从源代码生成这些代码吗?在这种情况下,也许你不应该索引它们。