将文件从一个存储库复制到另一个存储库及其历史记录

时间:2020-12-18 18:09:51

标签: git

我想将存储库 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

将文件移动到“正确”位置后,由于此目录更改,需要额外提交。

不幸的是,我无法使用上面的这种方法来做到这一点。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

原则上你可以这样做:

git format-patch --root -- file1 file2 etc.

这将生成一系列 *.patch 文件。然后在新的 repo 中你会这样做:

git am <the-patch-files>

但是,如果您的存储库有一些复杂的历史记录,您可能会遇到问题,例如合并和文件移动涉及您列表中的某些文件。

另一种解决方案是使用 git filter-history 重写整个历史记录,并基本上删除您不想保留的任何文件。。不过,您仍然需要处理合并和文件移动。

[编辑] 在某种程度上,您可以通过将 -p--directorygit am 结合使用来操纵应用补丁的目标路径。例如,在您添加的场景中,git am -p3 0001.patch 会将文件 EnvironmentCatalog.xosc 放在项目根目录下,而 git am -p3 --directory alt 0001.patch 会将其放在 alt/ 下。

这里的重要警告当然是您提供给 -p 的数字和 --directory 的路径会因提交而异。如果您提交了多个文件,每个文件都位于不同级别的不同子目录下,那么它就不会起作用。