root -- c1 -- c2 -- .. - c1000 -- c1001 -- c1002 -- .. -- c2000 -- top
我希望:
root = c1000 -- c1001 -- c1002 -- .. -- c2000 -- top
如何?
(我想我可以通过git filter-branch
来做,但究竟是怎么做的?)
(当然我知道这意味着历史改写......)
答案 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 a965bb3,commit 25dd3e4,commit 530ca19,commit fdf31b6,commit cd13762,commit f129c42,commit 1f30c90,{{3} },commit b93b81e,commit 4532be7,commit 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
被重写为根提交。有两种选择:
- 不要使用否定修订规范,当您过滤输出内容以对后8个提交进行修改时,请注意不要以任何方式修改任何较早的提交。
- 首先运行'
git fast-export --export-marks=somefile HEAD~8
',然后运行'git fast-export --import-marks=somefile HEAD~8..HEAD
'。两者都比我想要的更容易出错(第一个原因很明显;使用第二个选项,有时我不小心在第一个命令中包含了太多修订,然后发现第二个未导出相应的额外修订命令,因此未按我的预期进行修改。
而且,从性能的角度来看,两者都很差。添加新的
--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引用历史记录排除范围内的提交。
请注意,结果流只能由已经包含必要的父提交的存储库使用。