正确并行化git filter-branch

时间:2014-02-18 10:00:17

标签: git git-filter-branch git-rewrite-history

我有一个带有大量分支的仓库和“git filter-branch ... - - all”大大减慢了(大约400,000次提交,大约运行时间7天)。但是,单个分支上的“git filter-branch”可以显着提升性能(大约5天)。

使用以下算法在分支负载上并行化“filter-branch”是否正确?

  1. for bx(B1..Bn)do:git clone --bare -b bx repo.orig repo.bx
  2. 并行化repo.bx:git filter-branch --index-filter ... - HEAD
  3. git init --bare repo.new
  4. for bx(B1..Bn)do:cd repo.bx; git push repo.new HEAD:bx
  5. Rregards,Gert

1 个答案:

答案 0 :(得分:3)

恭喜找到一种有趣的方法来并行git filter-branch的执行 - 我认为原则上,你所描述的程序成功地提供正确的&内部一致的重写历史,虽然这肯定取决于你的--index-filter命令正在做什么 (如果你做了像插入随机一样疯狂的事情,结果分支历史就会完全分开例如,数字到文件中。

git filter-branch非常强大的工具:它允许您对每个&执行完全任意的操作。每个文件并在您的历史记录中提交 - 虽然这种灵活性听起来很吸引人,但它通常会对您不利 - 您在执行时付出了价格。所以问题是 - 你需要这种灵活性吗?你能否在你的问题中更具体地了解你想要实现的目标?

The BFG,替代git filter-branch ...

从Git v1.9开始,documentation notes for git filter-branch包含了这个建议(诚然由我自己贡献,但是由Git邮件列表审查!):

  

git-filter-branch允许您进行复杂的shell脚本重写   你的Git历史,但如果你可能不需要这种灵活性   你只是删除不需要的数据,如大文件或密码。   对于那些操作,您可能需要考虑The BFG Repo-Cleaner,a   基于JVM的git-filter-branch替代方案,通常至少10-50x   这些用例更快,并且具有完全不同的特征

BFG可以执行git filter-branch用于执行的许多任务 - 但更快更多 - 部分原因是它使用了memoization,但也因为它执行了清理的并行化任务,使其能够充分利用多核机器。这些因素相结合,可以节省执行时间,而不是平行化filter-branch运行可能带来的减少30% - 事实上,运行时间减少通常更接近98%, 50x 加速或以上。

A comment by Elliot Glaysher,Google工程师在Google Chrome上工作:

  

我能够将当前存储库缩小到约500兆字节   使用此工具约10分钟。我的手工制作脚本时钟   在3天时间内以615兆字节进行比较。

总而言之,值得考虑的是,BFG是否可以成为更好的工具。

完全披露:我是BFG Repo-Cleaner的作者。