git - 将文件从一个存储库复制到另一个存储库及其历史记录
问题描述
我想将存储库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 format-patch --root -- file1 file2 etc.
这将生成一系列*.patch
文件。然后在新的仓库中你会做:
git am <the-patch-files>
但是,如果您的存储库有一些复杂的历史记录,您可能会遇到问题,例如涉及列表中某些文件的合并和文件移动。
另一种解决方案是使用git filter-history
重写整个历史记录,并从本质上删除您不想保留的任何文件。不过,您仍然需要处理合并和文件移动。
[编辑] 在某种程度上,您可以通过使用-p
和--directory
with来操作应用补丁的目标路径git am
。例如,在您添加的场景中,git am -p3 0001.patch
将文件EnvironmentCatalog.xosc
放在项目根目录下,git am -p3 --directory alt 0001.patch
并将其放在alt/
.
当然,这里最大的警告是,您提供的数字-p
和路径--directory
都会因提交而异。如果你有多个文件的提交,每个文件都在不同级别的不同子目录下,它不会起作用。
推荐阅读
- cassandra - CQLSH 未执行且连接被拒绝
- swift - 快速创建多个数组组合
- python - kivy.storage.jsonstore 将文件保存在哪里?
- javascript - 映射 Formik 文本字段
- mod-rewrite - Apache 2.4 维护 html 页面图像未加载
- java - 从使用 ClassLoader 加载源时,Apache Pdfbox 展平失败
- angular - Angular 默认路由器插座
- wpf - 如何防止孩子触发鼠标悬停事件?
- ubuntu - 使用vim时如何去除这个绿色区域?
- python-3.x - 未找到 gdal-config,Ubuntu 18.0.4,部署在 gcloud