6

我正在重写一个相当大的回购的历史,git filter-branch --tree-filter这需要几个小时。我看到 git 正在使用一个临时目录来存储它的中间工作。这是否意味着如果它被中断可以恢复重写?如果是这样,怎么做?

编辑

我正在做的操作是移动几个目录。这些当前位于子目录中,但我现在需要它们位于根目录中。

例如

dir1
- dir2
- dir3
- dir4

变成

dir1
- dir2
dir3
dir4

当然,我的目录结构比这复杂得多,但这就是我想要做的事情的要点。

4

2 回答 2

14

git filter-branch本身不支持暂停/恢复使用模式 - 尽管它将临时数据写入.git-rewrite文件夹,但实际上不支持基于此目录的内容恢复。如果您git filter-branch在以前中止filter-branch操作的存储库上运行,它会要求您删除该临时文件夹,或者使用--force选项自行执行

潜在的问题是git-filter-branch在大型回购上运行缓慢 - 如果过程快得多,就没有尝试恢复的动力。所以你有几个选择:

让 git-filter-branch 快一点...

  • 使用RAM 磁盘- git-filter-branchIO 非常密集,并且在您的存储库位于 RAM 中时运行速度会更快。
  • 使用--index-filter而不是--tree-filter- 它类似于树过滤器,但不检查文件树,这使它更快,但确实需要您根据 git index 命令重写文件更改。
  • 使用云计算并租用具有快速内存和高时钟速度的机器(除非您自己的命令是多线程的,否则不要打扰多核,因为git-filter-branch它本身是单线程的)

...或使用 BFG (更快)

BFG Repo-Cleaner是一种更简单、更快的替代方案-git-filter-branch在大型 repo 上,它的速度提高了50-150倍。这会将您需要几个小时的工作变成只需要几分钟的工作。

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

于 2013-04-22T18:22:04.457 回答
7

Roberto 在他的回答中提到了这一点,但我想给它一个基准:如果您的git filter-branch操作需要很长时间才能完成,请考虑使用 AWS 高内存实例。

我曾经不得不filter-branch合并 35 个不同的存储库,每个存储库都有两年每天数十次提交的历史。我的脚本在我的笔记本电脑上未能在 25 小时内完成。m2.4xlarge它在亚马逊的一个实例上在 45 分钟内完成。

总消耗?

1.64 美元——比我在 20 盎司苏打水上的花费还少。

BFG 听起来像是一个很棒的工具,我鼓励任何经常改写历史的人尝试一下。但是,如果您只是需要一些东西来工作并且可以轻松访问 AWS,那就太filter-branch简单了。

在 2016 年,这甚至更便宜。只需关注Spot Advisor,就会发现自己属于“每小时 0.30 美元的集群计算”。

于 2013-05-07T15:03:00.630 回答