如何在目录结构不同的Git仓库间执行Cherry-pick?
解决跨仓库Cherry-pick时顶层文件夹路径不匹配的问题
方法一:生成并修改补丁后应用(最稳妥)
这是最直接的路径映射方式,手动调整补丁里的文件路径:
- 在源仓库中导出目标提交的补丁文件:
git format-patch -1 <目标提交的哈希值> --stdout > path-fix.patch - 打开生成的
path-fix.patch文件,全局替换所有路径中的NameA/为NameB/(补丁里用正斜杠,即使原路径是Windows反斜杠)。比如把所有NameA/Content/Policy/File1.htm替换成NameB/Content/Policy/File1.htm。 - 切换到目标仓库,应用修改后的补丁:
如果遇到小冲突,可加上git apply path-fix.patch--reject参数生成冲突文件,手动修复后再应用:git apply --reject path-fix.patch
方法二:临时重命名文件夹适配路径
通过临时修改目标仓库的文件夹结构,让路径匹配后再cherry-pick:
- 在目标仓库中,将
NameB临时重命名为NameA:git mv NameB NameA - 执行cherry-pick操作:
git cherry-pick <目标提交的哈希值> - 解决可能的冲突后,再把
NameA改回NameB:git mv NameA NameB - 提交最终的修改结果。
方法三:优化Subtree策略参数
你之前尝试的--strategy=subtree方向是对的,冲突可能是因为Git无法判断文件归属,可尝试加上策略选项强制应用修改:
git cherry-pick --strategy=subtree --strategy-option=theirs <目标提交的哈希值>
--strategy-option=theirs会直接使用源提交中的修改覆盖目标仓库的对应文件,适合你确定要完全复用源提交修改的场景,使用前请确认目标文件的现有内容可以被覆盖。
内容的提问来源于stack exchange,提问作者Thunder1
相关产品推荐
相关产品推荐

