Windows下不同Git版本执行git status结果不一致问题
问题根因
两个环境执行git status结果不一致,核心是Git for Windows(GitBash内置)和MSYS2源分发的Git属于独立编译分发的二进制包,默认配置、读取的配置路径都存在差异,具体触发点有三个:
- 换行符处理规则差异:GitBash内置的Git为适配Windows平台,默认开启
core.autocrlf = true,会自动在检出时将仓库内的LF换行符转为Windows原生的CRLF格式,提交时转回LF,比对工作区和仓库版本时会自动忽略换行符格式差异,不会标记文件为修改状态。MSYS2源分发的Git遵循POSIX系统默认规则,默认设置core.autocrlf = false,不做换行符自动转换,只要工作区文件是CRLF格式、仓库内是LF格式,就会判定为文件已修改。 - 文件权限检测规则差异:GitBash内置的Git默认关闭POSIX权限位检测(
core.filemode = false),适配Windows NTFS文件系统和POSIX权限模型不兼容的问题,不会因为文件可执行位等权限属性变化标记修改。MSYS2的Git默认开启core.filemode = true,会模拟POSIX环境的权限检测逻辑,只要文件权限位和仓库记录不一致就会标记为修改。 - 配置文件路径不互通:GitBash的Git默认读取Windows用户目录下的全局配置文件,路径一般为
C:\Users\你的用户名\.gitconfig;MSYS2的Git默认读取自身虚拟家目录下的配置文件,路径一般为MSYS2安装路径\home\你的用户名\.gitconfig,两边的全局配置不会自动同步,进一步放大了默认规则的差异。
解决方案
按以下步骤操作即可统一两个环境的Git行为:
- 统一换行符处理规则
最稳妥的方案是在仓库根目录创建.gitattributes文件,强制指定全仓库的换行符规则,该规则优先级高于本地Git配置,所有环境拉取代码后都会遵循统一规则,不会出现识别偏差,示例配置:
如果不想给仓库加配置文件,也可以在两个Shell环境中分别执行以下命令,统一全局换行符配置:# 所有文本文件自动识别换行符 * text=auto # Shell脚本强制使用LF换行 *.sh text eol=lf # Windows批处理脚本强制使用CRLF换行 *.bat text eol=crlfgit config --global core.autocrlf true - 统一权限检测规则
Windows平台下不需要POSIX权限位检测,在两个Shell环境中分别执行以下命令关闭该功能:git config --global core.filemode false - (可选)统一全局配置路径
如果不想在两个环境分别维护Git配置,可以在MSYS2环境中执行以下命令,让MSYS2的Git自动加载Windows系统下的全局Git配置:# 注意把路径中的用户名替换成自己的Windows登录用户名,路径用正斜杠 git config --global --add include.path "C:/Users/你的Windows用户名/.gitconfig" - 刷新工作区状态
配置完成后,在MSYS2环境中进入对应仓库目录,执行以下命令刷新工作区状态(注意:该命令会丢弃所有未提交的本地修改,执行前确认没有需要留存的改动):
执行完成后再分别在两个环境运行git reset --hard HEADgit status,返回结果就会保持一致。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

