Rainzee's Blog

LF will be replaced by CRLF

· rainzee

警告出现的原因§

Git 在 Windows 上的的 core.autocrlf 的默认值是 true 这导致了Git会始终尝试自动转换换行符

AUTO CRLF工作方式§

在GIT中,当设置 * text=auto 或者 core.autocrlf = true 的时候,意味着,我们采用LF做为标准,当你在Windows上,使用CRLF做为换行符的时候,你的文件在硬盘(工作区)上的体现是CRLF,但是当你git add 到暂存区后,git会自动的将你的文件转换为LF,当你clone到本地后,又会回到CRLF。这样做的好处是,你不需要任何显式的修改,就能在本地用到原生的换行符,不会在跨平台协作的时候造成麻烦,在Git中,所有人,所有文件的状态都是统一的LF。

也可以显式的指定为LF或者为CRLF

三个配置的具体行为§

以上配置为全局配置,会被项目级别的配置覆盖

最佳实践§

最好不要指定全局级别的Config,而是进行项目级隔离,在项目的根目录下 .gitattributes 配置,根据项目的文件类型,手动指定换行,如果工作区内的换行与指定的换行不符,那么允许Git在提交的时候进行Auto CRLF,在签出的时候恢复,这样可以最大程度的在不同的平台上进行合作,且不会影响本地工作区。* text=auto 是一个合理的默认设置,这允许Git来选择最佳的处理方式,默认的标准是LF,但是确保他在你配置的首行,这样允许之后的配置合理的覆盖。显式的指定换行,还能消除Git的换行警告,因为Git默认你当前系统使用CRLF,如果你的工作区文件不是CRLF,Git会尝试提醒你会从LF转化到CRLF,但是在我测试后,这似乎不会做任何事情,Git不会私自改动你工作区的任何内容,这也许是一个久远的BUG。

下面是一份合理的 .gitattributes

# Auto detect text files and perform LF normalization
* text=auto
*.json text eol=lf
*.gitattributes text eol=lf
*.txt text eol=lf

下面是Django

# Normalize line endings to avoid spurious failures in the core test suite on Windows.
*html text eol=lf
*css text eol=lf
*js text eol=lf
tests/staticfiles_tests/apps/test/static/test/*txt text eol=lf
tests/staticfiles_tests/project/documents/test/*txt text eol=lf
docs/releases/*.txt merge=union

Reference§

Mind the End of Your Line ∙ Adaptive Patchwork

配置 Git 处理行结束符 - GitHub Docs

git如何避免”warning: LF will be replaced by CRLF“提示? - 知乎 (zhihu.com)