我想将文件列表从存储库 A 中的给定目录复制到存储库 B 及其提交历史记录。
互联网上充斥着复制完整目录及其所有内容的解决方案: Git: Copy history of file from one repository to another 或者 https://mattsch.com/2015/06/19/move-directory-from-one-repository-to-another-preserving-history/
这些解决方案假设我想复制子目录中的所有文件,但这不是我的情况。我想将目录中的文件子集及其提交历史记录从一个存储库复制到另一个存储库。
例如:
我想复制https://github.com/carla-simulator/scenario_runner/blob/master/srunner/examples/catalogs/EnvironmentCatalog.xosc到另一个存储库 B 并将其放置在根目录 (./
)。
@jingx 建议的解决方案几乎解决了这个问题。
使用
git am <the-patch-files>
该文件将被放置在存储库B中,位置为B/examples/catalogs/EnvironmentCatalog.xosc
,而不是B/EnvironmentCatalog.xosc
将文件移动到“正确”的位置后,由于此目录更改,需要进行额外的提交。
不幸的是,我无法使用上面的方法来做到这一点。
如何解决这个问题?
最佳答案
原则上你可以这样做:
git format-patch --root -- file1 file2 etc.
这将生成一系列*.patch
文件。然后在新的存储库中您将执行以下操作:
git am <the-patch-files>
但是,如果您的存储库有一些复杂的历史记录,例如,您可能会遇到问题。涉及列表中某些文件的 merge 和文件移动。
另一个解决方案是使用 git filter-history 重写整个历史记录,并从本质上删除您不想保留的任何文件。不过,您仍然需要处理 merge 和文件移动。
[编辑]
您可以在某种程度上操纵应用补丁的目标路径,方法是使用 -p
和 --directory
以及 git am
。例如,在您添加的场景中,git am -p3 0001.patch
会将文件 EnvironmentCatalog.xosc
放在项目根目录下,并且 git am -p3 - -directory alt 0001.patch
会将其放在 alt/
下。
这里需要注意的是,您为 -p
提供的编号以及 --directory
的路径在每次提交时都会有所不同。如果您提交了多个文件,每个文件都位于不同级别的不同子目录下,那么它就不起作用。
关于git - 将文件及其历史记录从一个存储库复制到另一个存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65361940/