如何恢复git历史记录重写?

时间:2013-04-22 16:47:23

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

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

修改

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

e.g。

dir1
- dir2
- dir3
- dir4

变为

dir1
- dir2
dir3
dir4

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

2 个答案:

答案 0 :(得分:14)

git filter-branch本身不支持暂停/恢复使用模式 - 虽然它将临时数据写入.git-rewrite文件夹,但实际上并不支持根据此目录的内容进行恢复。如果您在先前已中止git filter-branch操作的存储库上运行filter-branch,它将要求您删除该临时文件夹,或者使用--force选项{{3} }。

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

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

  • 使用do it itself - git-filter-branch非常耗费IO,并且在您的存储库位于RAM中时运行速度会更快。
  • 使用--index-filter而不是--tree-filter - 它类似于树过滤器,但不会检出文件树,这会让它更快,但 要求你根据git索引命令重写文件更改。
  • 使用RAM-disk并雇用具有快速ram和高时钟速度的计算机(除非您自己的命令是多线程的,否则不要打扰多个核心,因为git-filter-branch本身是单线程的)

...或使用BFG (方式更快)

cloud computinggit-filter-branch的一种更简单,更快捷的替代方案 - 在大型回购广告上BFG Repo-Cleaner更快。这将你的工作需要几个小时才能完成一个只需几分钟的

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

答案 1 :(得分: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美元/小时。

相关问题