首页 > 解决方案 > 将文件从一个存储库复制到另一个存储库及其历史记录

问题描述

我想将存储库A中给定目录中的文件列表及其提交历史记录复制到存储库B。

互联网上到处都是复制完整目录及其所有内容的解决方案: Git:将文件历史记录从一个存储库复制到另一个存储库https://mattsch.com/2015/06/19/move-directory-from-one-存储库到另一个保存历史/

这些解决方案假设我想复制子目录中的所有文件,这不是我的情况。我想将目录中的文件子集及其提交历史从一个存储库复制到另一个存储库。

例如:我想将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

解决方案


原则上你可以这样做:

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

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

git am <the-patch-files>

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

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

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

当然,这里最大的警告是,您提供的数字-p和路径--directory都会因提交而异。如果你有多个文件的提交,每个文件都在不同级别的不同子目录下,它不会起作用。


推荐阅读