PS:最近又换回了 Linux Mint,作为一个 Linux 桌面黑,有点尴尬。。。:)
换行符是 *nux 与 Windows 系及其他系的各种不兼容问题的代表之一,于是,在不同平台使用 Git 时经常碰到 git status 列出一大串修改过的文件,git diff 查看一下其实只是换行符问题。不多扯了,直接上解决方案:
方案1: 增加 .gitattribute 文件
在 repo 目录下新建 .gitattribute 文件,内容为:
* text eol=lf
方案2: 修改 Git 配置
git config --global core.autocrlf false
git config --global core.safecrlf true
如果只需要修改当前仓库,去掉 --global。
方案3: 行政命令
下令:一律使用 unix 换行符,违者男的穿裙子,女的不许穿!
参考:
问题:
Windows 下使用 git 没问题,在 Cygwin 中出现文件全部被修改问题。运行 git diff 看到变化是 ^M,即 Linux 与 Win 的换行符区别。
解决:
git config --global core.autocrlf true
关于换行符 Git 有两个重要的配置,如下:
换行符的问题 autocrlf and safecrlf
Windows(rn)、Linux(n)和MacOS(r)三个主流系统的换行符各不相同,这样在跨平台合作的时候就容易出现换行符的问题。
Git 提供了 autocrlf 和 safecrlf 两个参数来解决这个问题。但这两个参数如果没用好,就会影响开发。
例如,出现这种情况:
A和B两个开发人员,A使用LF(n)做换行符,B使用CRLF(rn)做换行符,且都没有开启 autocrlf 参数,那么A在迁出B的文件,并使用自己的编辑器打开之后就会发现,虽然没有对文件做任何修改,但它的状态是modified。这是由于A的编辑器自动将B的文件中的所有换行符替换成了(LF),这与版本库中的(CRLF)不同。
让我们来看看 autocrlf 参数的作用:
# 签出时将换行符转换成CRLF,签入时转换回 LF。
git config --global core.autocrlf true
#签出时不转换换行符,签入时转换回 LF
git config --global core.autocrlf input
#签出签入均不转换
git config --global core.autocrlf false
这些选项在TorgoiseGit中也可以设置。
我的建议是在无论在什么系统下编程,都把所有人的编辑器的换行符模式设置成Unix格式,然后把autocrlf设置成false,这样一劳永逸。
毕竟除了Windows记事本这类软件外,已经很少有文本编辑器不支持换行符设置了。
如果你把换行符搞乱了,在一个文件中既包含windows风格的换行符也包含unix风格换行符,那么 safecrlf 就可以发挥作用了:
# 拒绝提交包含混合换行符的文件
git config --global core.safecrlf true
# 允许提交包含混合换行符的文件
git config --global core.safecrlf false
# 提交包含混合换行符的文件时候给出警示
git config --global core.safecrlf warn