如何让Git仓库在Windows与Linux间兼容(解决.git目录大小写敏感问题)
核心矛盾很明确:Windows默认采用大小写不敏感的文件系统,会把仅大小写不同的文件视为同一个;而Linux环境(包括多数远程Git服务器)的Git是大小写敏感的,允许存在同名但大小写差异的分支。
一、先确认远程分支的真实状态
先在Linux环境下执行命令,排查远程仓库是否真的存在这两个分支:
git branch -r
如果输出里只有其中一个分支(比如
origin/xyz-1012-see-more),说明本地的另一个日志文件是历史残留,可按以下步骤清理:- 先备份整个
.git目录,防止误操作丢失数据; - 删除多余的日志文件(比如
.git/logs/refs/remotes/origin/XYZ-1012-see-more); - 执行
git remote prune origin,清理本地所有过时的远程分支引用,之后再迁移到Windows就不会有冲突。
- 先备份整个
如果输出里同时存在两个分支,说明远程仓库本身就有命名冲突的分支,这时候本地脚本处理只是临时方案——只要你在Windows上执行
git fetch或git pull,Git会再次创建这两个冲突的日志文件,导致Windows文件系统报错。
二、彻底解决的两种路径
1. 从远程仓库根源解决(推荐)
联系仓库管理员,在远程服务器上合并或删除其中一个分支,统一分支名称的大小写。比如保留xyz-1012-see-more,删除XYZ-1012-see-more:
# 在Linux环境下执行 git push origin --delete XYZ-1012-see-more
之后本地执行git fetch --prune,清理本地的过时引用,再迁移到Windows就不会有冲突。
2. 在Windows上启用目录大小写敏感
如果无法修改远程分支,可针对Git仓库所在的Windows目录启用大小写敏感:
# 以管理员身份打开PowerShell,替换为你的仓库路径执行 fsutil file setCaseSensitiveInfo C:\path\to\your\repo enable
启用后,该目录下的文件系统会区分大小写,Git就能正常处理这两个分支的日志文件。但注意这个设置只对该目录生效,且部分Windows旧软件可能不兼容大小写敏感的目录。
三、脚本处理的局限性
可以写脚本批量清理本地大小写冲突的日志文件,但前提是远程已经不存在对应的分支——否则只要和远程同步,冲突就会重现。脚本示例(Bash,在Linux环境执行):
#!/bin/bash cd .git/logs/refs/remotes/origin # 查找并删除大小写重复的文件 for file in *; do lower_file=$(echo "$file" | tr '[:upper:]' '[:lower:]') if [ "$file" != "$lower_file" ] && [ -f "$lower_file" ]; then echo "Removing duplicate file: $file" rm "$file" fi done git remote prune origin
再次强调:如果远程分支没处理,这个脚本只是治标不治本。
内容的提问来源于stack exchange,提问作者Marian

