问题

由于经常会在windowslinux间交替写代码,因此也经常遇到使用git status查看有变更,使用git diff查看却没有看到差异的情况,原因有两种:

  1. 换行符的差异

  2. 文件权限的差异

换行符

默认情况下,windows使用crlf做为换行符,linux使用lf做为换行符,不进行配置和处理的话,自然会出现上述情况。

通常情况下,windows下的git进行如下配置:

1
2
git config --global core.safecrlf true
git config --global core.autocrlf true

linux下进行如下配置:

1
2
git config --global core.safecrlf true
git config --global core.autocrlf input

如此,可解决绝大部分换行符问题,但对于需要精细化控制的场景显然不够,对此,可通过仓库的.gitattributes进行配置实现。

1
2
*.bat   text    eol=crlf
*.sh    text    eol=lf

文件权限

windows下,准确说是windows的文件系统下(如ntfs),git init一个仓库时,其filemode默认是false,即忽略文件权限的变化;而linux的文件系统下(如ext4),其filemode默认是true,即跟踪文件权限的变化。若是在两者之间交替工作,或是拷贝文件,则会出现文件权限的变化,此时若filemode=true则会出现上述问题。

一种是一刀切的方案,关闭filemode,即:

1
git config --local core.fileMode false

另一种精细化的方案,自然还是借助.gitattributes进行配置:

1
2
*       -filemode
*.sh    filemode=755