如何从Git中提取历史子集?

时间:2010-09-08 17:20:59

标签: git version-control history

更新:我试图简化这里的真实示例,以清楚地解释我的选项,但这并没有真正起作用。到目前为止,下面的链接示例过于笼统,甚至无法使用这个简单的示例。

我能够一直用SVN做这种事情并且非常熟练。现在我发现在Git中非常困难,并开始相信我的历史基本上太过密集,无法将它拉开。

真实问题:我已经移动并重命名了十几个文件。他们的历史与数百个其他文件的历史混杂在一起,我想完全删除历史记录。

在SVN中,我可以使用dump / include-filter / exclude-filter / load序列来修剪存储库,很少我可能需要在加载前在转储文件中手动重命名路径。 / p>

像这样的东西,我会完成的:

SET Includes=trunk/src/Foo.aaa trunk/src/Foo.bbb trunk/src/Foo trunk/src/Bar
SET Excludes=trunk/src/Bar/Blah.aaa trunk/src/Foo/Blah.aaa

svnadmin dump FooSrc > Full.dump 2> Dump.log
svndumpfilter include %Includes% --skip-missing-merge-sources --renumber-revs --drop-empty-revs < Full.dump > Filter_1.dump 2> Filter_1.log
svndumpfilter exclude %Excludes% --skip-missing-merge-sources --renumber-revs --drop-empty-revs < Filter_1.dump > Filter_2.dump 2> Filter_2.log
svnadmin create FooDest
svnadmin load FooDest --ignore-uuid < Filter_2.dump > Load.log 2> Load_Errors.log

有没有人有一个很好的例子,这不仅仅是简单地删除单个文件或导出单个子目录?

我可以定义文件集的最简单方法是使用7个目录路径列表。这些目录中的所有内容都需要保留,外部的所有内容都需要从历史记录中删除。


简化问题:

我有一个Git存储库,它有一些我想要提取到自己的存储库中的文件。问题是这些文件是在原始存储库的历史记录中创建和修改的,因此我无法弄清楚如何干净地提取它们。

以下是我的历史记录的要点(只有更多的提交和更多要忽略)。正如您所看到的,我显然不打算稍后将这些文件从历史中挑选出来:

commit 4a09d3f977a8595d9e3f61766a5fd743e4265a56

M    src/Foo/Bar/FileToExtract2.foo
A    src/Foo/Bar/FileToExtract3.bar
D    src/Foo/AnotherFileToIgnore.txt

commit 05d26f23518083270cc45bf037ced29bec45e064

M    src/Foo/Blah/IgnoreThisOneToo.foo
M    src/Foo/AnotherFileToIgnore.txt

commit 343187228f4bd8e4427395453034c34ebd9a95f3

M    src/Foo/Bar/FileToExtract1.txt
M    src/Foo/AnotherFileToIgnore.txt

commit 46a0129104ac31291462f657292aab43f8883d8d

A    src/Foo/Bar/FileToExtract1.txt
A    src/Foo/Bar/FileToExtract2.foo
M    src/Foo/FileToIgnore.txt

commit 3fe6af56f0d8dc42fcb5b0bafee41bff534ba2cc

A    src/ReadMe.txt
A    src/IgnoreMe.foo
A    src/Foo/FileToIgnore.txt
A    src/Foo/Blah/IgnoreThisOneToo.foo
A    src/Foo/AnotherFileToIgnore.txt

最后,我想要的是一个干净的存储库,其中只包含src/Foo/Bar/中文件的完整历史记录。其余的可以忽略。我也可以按原样保存这个存储库(即没有历史记录重写),只是为整个目录提交删除。

在SVN中,我会使用svnadmin dumpsvndumpfiltersvnadmin load。如果我小心,我甚至可以手动编辑转储文件以清理路径等。

我一直在查看Git命令,但我无法看到这样做的方法。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:7)

您可以使用git filter-branch并将目录Foo分离到其自己的目录中 参见:

答案 1 :(得分:3)

相当于SVN的svnadmin dumpsvndumpfiltersvnadmin load将是 git fast-export ,一个自己的脚本(请参阅examples)和 git fast-import

相关问题