gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:02:38 26 4
gpt4 key购买 nike

更新:我试图简化此处的真实示例以获得对我的选项的清晰解释,但这并没有真正奏效。到目前为止,下面的链接示例过于笼统,甚至无法让这个简单的示例正常工作。

我一直都能用 SVN 做这类事情,并且非常熟练。现在,我发现在 Git 中非常困难,并且开始相信我的历史基本上被拼凑在一起,无法将其分开。

现实世界的问题:我大约有十几个文件已被移动和重命名。他们的历史与数百个其他文件的历史混合在一起,我想完全删除这些文件的历史。

在 SVN 中,我可以使用一系列 dump/include-filter/exclude-filter/load 来精简存储库,很少需要在加载之前在转储文件本身中手动重命名路径。

像这样的事情我会做的:

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 存储库,其中包含一些我想提取到其自己的存储库中的文件。问题是这些文件是在原始存储库的整个历史过程中创建和修改的,所以我无法弄清楚如何干净地提取它们。

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

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 命令,但无法找到执行此操作的方法。任何帮助将不胜感激。

最佳答案

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

关于git - 如何从 Git 中提取历史的子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3670281/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com