Git:如何在特定提交之前删除历史记录

时间:2011-09-18 02:57:21

标签: git git-filter-branch

是的,我有:

root -- c1 -- c2 -- .. - c1000 -- c1001 -- c1002 -- .. -- c2000 -- top

我希望:

root = c1000 -- c1001 -- c1002 -- .. -- c2000 -- top

如何?

(我想我可以通过git filter-branch来做,但究竟是怎么做的?)

(当然我知道这意味着历史改写......)

3 个答案:

答案 0 :(得分:9)

我发现以下内容对于创建具有不同根目录的新回购非常有用(当您在提交之前说删除历史记录时,我认为这是您所要求的):

git fast-export master~5..master | (cd ../newrepo.git && git init . && git fast-import && git checkout)

(您也可以在同一个回购中执行上述操作)

答案 1 :(得分:4)

最简单的方法是使用git移植。如果编辑文件.git / info / grafts,则可以将行放在格式为

的文件中

[ref] [parent1] [parent2] ...

然后,左侧引用的任何提交都被视为右侧列出的父级是该提交的父级。所以你可以插入像

这样的行

c1000

它将被视为没有父母。然后可以通过运行git-filter-branch来“烘焙”。

答案 2 :(得分:0)

请注意,使用Git 2.21(2019年第一季度,超过7年后),git fast-export更加完整。

这意味着基于git fast-export / import的解决方案现在可以做更多的事情。

git fast-export master~5..master | \
  (cd ../newrepo.git && git init . && git fast-import && git checkout)

请参见commit a965bb3commit 25dd3e4commit 530ca19commit fdf31b6commit cd13762commit f129c42commit 1f30c90,{{3} },commit b93b81ecommit 4532be7commit f55c979(2018年11月16日)由commit 843b9e6编写。
(由Elijah Newren (newren)Junio C Hamano -- gitster --中合并,2019年1月4日)

  

快速导出:添加--show-original-ids选项以显示原始名称

     

知道提交的原始名称(哈希)有时可以启用后过滤,否则将很难或不可能。
  特别是,在不知道每个提交的原始名称的情况下,很难重写引用其他先前提交(在执行其他任何过滤操作之外)的提交消息。

     

此外,知道blob的原始名称(哈希)可以通过blob-id进行过滤,而无需重新散列blob的内容,因此作为小型优化很有用。

     

一旦我们为提交和blob添加了原始ID,我们也可能会为标记添加它们的完整性。
  也许有人会对他们有用。

     

此提交教给快速导出一个新的--show-original-ids选项,这将使它在blob,提交和标签中添加'original-oid <hash>'行。
  它还教fast-import解析(并忽略)这样的行。

commit 4d59753现在显示:

--show-original-ids:
  

在输出中为提交和Blob original-oid <SHA1SUM>添加一个额外的指令。
  尽管此类指令可能会被git-fast-import之类的进口商忽略,但它对于中间过滤器(例如,重写提交消息)可能很有用。   指的是较早的提交,或用于按ID删除Blob )。

并且:

  

fast-export:添加--reference-excluded-parents选项

     

git filter-branch具有漂亮的功能,可让您重写,例如只是线性历史记录的最后8次提交

 git filter-branch $OPTIONS HEAD~8..HEAD
     

如果您对git fast-export进行相同的操作,则会获得以下历史记录:   仅8次提交,其中HEAD~7被重写为根提交。

     

有两种选择:

     
      
  1. 不要使用否定修订规范,当您过滤输出内容以对后8个提交进行修改时,请注意不要以任何方式修改任何较早的提交。
  2.   
  3. 首先运行'git fast-export --export-marks=somefile HEAD~8',然后运行'git fast-export --import-marks=somefile HEAD~8..HEAD'。
  4.   
     

两者都比我想要的更容易出错(第一个原因很明显;使用第二个选项,有时我不小心在第一个命令中包含了太多修订,然后发现第二个未导出相应的额外修订命令,因此未按我的预期进行修改。
  而且,从性能的角度来看,两者都很差。

     

添加新的--reference-excluded-parents选项,这将导致fast-export通过sha1sum引用指定的rev-list-args范围之外的提交。
  这样的流仅在已经包含必要提交的存储库中才有用(很像使用--no-data时施加的限制)。

文档现在包括:

--reference-excluded-parents:
     

默认情况下,运行诸如git fast-export master~5..master之类的命令将不包含提交master~5,并使master~4不再具有master {tilde} 5作为父项(尽管两者都旧master~4和新的master~4将具有相同的文件)。

     

使用--reference-excluded-parents来使流按其sha1sum引用历史记录排除范围内的提交。
  请注意,结果流只能由已经包含必要的父提交的存储库使用