对git subtree拆分的仓库应用git-filter-repo后如何解决合并不相关历史报错
问题根因
git filter-repo执行时会重写公共子仓库所有提交的哈希值,而私有主仓库中关联的subtree提交哈希还是旧版本的,两边没有公共的祖先提交,因此Git会判定为无关历史拒绝合并。
解决方法
方法一:重写私有主仓库对应路径的历史(推荐,一劳永逸)
该方法可以保证两边提交哈希完全对齐,后续同步无需额外操作,且能彻底避免敏感文件被重新推回公共仓库:
- 第一步:进入私有主仓库本地目录,先备份当前分支,避免操作失误丢失数据:
git checkout -b backup_main - 第二步:在私有主仓库中执行相同的过滤规则,仅删除subprojectA路径下的敏感文件:
git filter-repo --invert-paths --path "subprojectA/confident.properties" - 第三步:重新关联修改后的公共子仓库远程地址:
git remote remove new_repos_subprojectAgit remote add new_repos_subprojectA <公共子仓库的实际路径/地址> - 第四步:正常执行subtree拉取命令即可完成同步:
git subtree --prefix="subprojectA/" pull new_repos_subprojectA subA
方法二:临时允许合并不相关历史(仅适合临时测试场景)
如果暂时不想修改私有主仓库的历史,可以在拉取时添加参数强制合并,注意该方法可能导致后续推送时敏感文件被重新传回公共仓库,不建议生产环境使用:
- 执行pull命令时新增
--allow-unrelated-histories参数:git subtree --prefix="subprojectA/" pull new_repos_subprojectA subA --allow-unrelated-histories - 执行命令后会触发合并冲突,手动确认合并内容、保留需要的代码后提交即可。
注意:如果公共子仓库已经对外公开,必须选择第一种方法,确保私有主仓库中的敏感文件也被彻底删除,避免后续同步时敏感文件泄露。
内容的提问来源于stack exchange,提问作者SaschaH
相关产品推荐
相关产品推荐

