如何将Git某仓库的指定提交合入目录结构不同的另一Git仓库
解决方法
你遇到的报错核心原因是两个独立仓库的对应目录基线不一致,Git默认会校验patch上下文与本地文件匹配才会应用,你需要的是类似SVN --accept=tf的「强制以源文件内容覆盖目标文件,跳过基线校验」的效果。
方案1:适配你现有patch流程的修改
- 生成patch的步骤保持不变,在
installer仓库执行:
git format-patch --binary -1 <待同步的commit哈希>
会生成前缀为数字的.patch文件。
- 到
software仓库应用patch时增加强制参数即可:
git am -p2 --directory='dist' --ignore-whitespace --force <patch文件路径>
如果仍有报错,改用更底层的git apply命令,完全跳过校验强制应用:
git apply --binary -p2 --directory='dist' --no-check --unsafe-paths <patch文件路径>
其中--no-check就是等效SVN --accept=tf的核心参数,会跳过所有本地文件与patch的匹配校验,直接用源提交的内容覆盖目标文件。
方案2:更稳妥的跨仓库目录同步方案(无需调整路径层级参数)
如果调整-p参数经常出错,可以直接导出指定目录的差异并替换路径后应用:
- 在
installer仓库导出对应commit的tomcat目录差异:
git diff --binary <commit父版本号> <commit版本号> -- common/tomcat > tomcat_sync.patch
- 到
software仓库替换路径后直接应用:
sed 's/common\/tomcat/dist\/tomcat/g' tomcat_sync.patch | git apply --binary --no-check
Git与SVN --accept=tf的等效参数说明
SVN的--accept=tf全称是--accept=theirs-full,作用是合并时完全使用源版本内容覆盖目标,Git对应场景的等效参数如下:
- 应用patch场景:
git apply --no-check - 同仓库分支合并场景:
git merge -X theirs - 拉取远程分支合并场景:
git pull -X theirs
内容的提问来源于stack exchange,提问作者Andreas N
相关产品推荐
相关产品推荐

