Git合并时如何忽略同名同内容文件冲突,core.fileMode配置不生效怎么办
问题核心原因
core.fileMode配置仅作用于工作区文件与本地暂存区、提交记录的权限对比,不会忽略已经写入Git提交历史的文件mode差异。你看到的diff是两个分支已提交记录的mode差异,不受这个配置控制,这是配置不生效的根本原因。
解决方案
方案一:预处理上游提交,从根源消除mode冲突
适合需要长期跟进厂商内核更新的场景,一劳永逸:
- 切换到你解压厂商源码后初始化的独立Git仓库
- 执行以下命令重写提交历史,统一所有文件的权限:
# 开启忽略工作区权限配置 git config core.fileMode false # 重写整个分支的提交,将所有普通文件权限设为644,示例中已排除.sh、.awk等需要执行位的脚本,可按需调整规则 git filter-repo --tree-filter 'find . -type f \( ! -name "*.sh" ! -name "*.awk" \) -exec chmod 644 {} \;' --force # 若没有安装git-filter-repo,也可以使用git filter-branch实现 # git filter-branch --tree-filter 'find . -type f \( ! -name "*.sh" ! -name "*.awk" \) -exec chmod 644 {} \;' HEAD
- 处理完成后回到你的主开发仓库,重新fetch上游新内核分支,再执行合并操作,就不会出现大量mode冲突。
方案二:合并阶段自动处理仅mode不同的冲突
适合单次合并,不想修改上游提交记录的场景:
- 停留在当前合并暂停、存在大量冲突的状态,执行以下批量处理命令:
# 遍历所有冲突文件,自动解决仅mode不同、内容完全一致的冲突 git diff --name-only --diff-filter=U | while read -r file; do # 比较两个分支的文件内容,无差异则自动采用当前分支的版本(要用上游新版本就把--ours改成--theirs) if diff -q <(git show :1:"$file") <(git show :2:"$file") > /dev/null 2>&1; then git checkout --ours -- "$file" git add "$file" fi done
- 命令执行完成后,剩余的未解决冲突就是文件内容存在真实差异的部分,手动处理即可。
附加小技巧
如果只是要查看两个分支的真实内容差异,不需要显示mode变更,可以在diff命令后加--ignore-mode参数:
git diff --ignore-mode master new/master
内容的提问来源于stack exchange,提问作者b1ad3runn3r
相关产品推荐
相关产品推荐

