我有一个带有大量分支的仓库和“git filter-branch ... - - all”大大减慢了(大约400,000次提交,大约运行时间7天)。但是,单个分支上的“git filter-branch”可以显着提升性能(大约5天)。
使用以下算法在分支负载上并行化“filter-branch”是否正确?
Rregards,Gert
答案 0 :(得分:3)
恭喜找到一种有趣的方法来并行git filter-branch
的执行 - 我认为原则上,你所描述的程序会成功地提供正确的&内部一致的重写历史,虽然这肯定取决于你的--index-filter
命令正在做什么 (如果你做了像插入随机一样疯狂的事情,结果分支历史就会完全分开例如,数字到文件中。
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的作者。