更新:我试图简化这里的真实示例,以清楚地解释我的选项,但这并没有真正起作用。到目前为止,下面的链接示例过于笼统,甚至无法使用这个简单的示例。
我能够一直用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 dump
,svndumpfilter
和svnadmin load
。如果我小心,我甚至可以手动编辑转储文件以清理路径等。
我一直在查看Git命令,但我无法看到这样做的方法。任何帮助将不胜感激。
答案 0 :(得分:7)
您可以使用git filter-branch
并将目录Foo分离到其自己的目录中
参见:
答案 1 :(得分:3)
相当于SVN的svnadmin dump
,svndumpfilter
和svnadmin load
将是 git fast-export
,一个自己的脚本(请参阅examples)和 git fast-import
。