You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并无关联Git仓库历史后因文件名大小写冲突无法push的问题

问题根本原因

你执行合并时拉取了源仓库的完整提交历史,虽然你在最新的提交里删除了冲突文件,但源仓库的历史提交中仍然存在包含两个大小写冲突文件的tree对象83f05a173307d3874ab7a304ed3019d2c0af9fe9,远程仓库的大小写校验会扫描所有推送的Git对象,哪怕该对象只存在于历史提交中、不出现在当前分支HEAD里也会触发拦截。

解决方案1:重写源仓库历史清除冲突(推荐,保留所有有效提交历史)

  • 单独克隆一份源仓库的本地副本,安装git filter-repo工具(大部分Git发行版可直接安装,或通过pip安装)
  • 执行以下命令批量删除所有历史提交中的冲突文件:
git filter-repo --invert-paths --path dateTimeRangeOutput.json --path datetimeRangeOutput.json --path datetimerange.PNG --path datetime.PNG

如果不需要删除、只需要统一重命名避免冲突,可使用:

git filter-repo --filename-callback '
  if filename == b"dateTimeRangeOutput.json":
    return b"datetime_range_output.json"
  elif filename == b"datetimeRangeOutput.json":
    return None
  elif filename.lower().endswith(b".png") and b"datetime" in filename.lower():
    return b"datetime.png"
  return filename
'
  • 重写完历史后,再按照你原来的合并流程重新执行一次合并操作即可,此时历史中已不存在冲突的大小写文件对象,可正常推送。

解决方案2:合并时仅导入源仓库最新快照(不保留源仓库提交历史)

如果不需要保留源仓库的完整提交历史,可直接拉取源仓库最新代码到目标仓库的子目录,避开历史对象的校验问题:

  • 在目标仓库的新分支下,执行:
git subtree add --prefix=要存放源仓库内容的子目录 <源仓库地址> <源分支名> --squash

该命令会把源仓库的最新内容合并为单个提交导入目标仓库,不会带入源仓库的历史提交,自然也不会包含冲突的历史tree对象,可直接推送。

临时绕过方案

如果暂时不想修改历史,且你有目标仓库的管理权限,可临时关闭远程仓库的大小写校验,推送完成后再重新开启即可。

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:36:06