2020年,在Windows上如何使用Git来实现良好的LF行尾?

9
我们的代码库使用LF,我安装的Git for Windows使用“按原样签出,提交Unix风格换行符”。

enter image description here

但是,每次我在我的IDE中检出文件时,仍然会遇到错误墙,因为它始终接收CRLF,即使它支持LF并已配置使用LF通过签入的.editorconfig文件(或其自身设置)。

.editorconfig
root = true

[*]
end_of_line = lf

已经到了2020年,IDE和工具已经支持在Windows上使用LF,那么我该如何享受这些好处呢?

请参考此答案。在你的情况下新增第四点:core.eol=lf。在尝试清理混乱的仓库之前,请使用新的存储库进行尝试。重要的是要强调:autocrlf在所有级别上都应该为false:系统、全局、存储库。 - Rusi
2个回答

20
有两个git配置属性会影响行尾符: core.autocrlfcore.eol
以前,你被告知使用core.autocrlf = true来处理跨平台项目,但现在不再需要了。 如果你的系统/IDE/工具支持LF,并且你希望像团队中的其他人一样使用LF,而不要有任何隐式的lf-> crlf-> lf规范化,则必须关闭autocrlf并将eol配置为不推断本机行尾,并强制使用lf
现在有两种方法可以在所有文件和/或存储库中实现LF:
  1. 全局为本地机器上的所有存储库。
  2. 通过检入的.gitattributes文件针对每个存储库进行设置。此文件会覆盖克隆存储库的任何本地配置。
我个人建议为所有本地存储库都使用这两种方法,并确保跨平台和跨开发环境的一致性。

1)对于本地机器上的所有存储库进行全局设置

进入你的工作目录(即本地存储库):

  1. 首先将所有更改提交。

  2. 设置全局和存储库的配置。以防万一。

git config --global core.eol lf
git config --global core.autocrlf false

git config core.eol lf
git config core.autocrlf false
  • 删除所有“代码”内容,保留.git
    您还可以省略依赖项、已安装文件(如node_modules)、生成文件以及任何被Git忽略的文件。

  • 最后运行

  • git reset --hard HEAD
    

    现在应该可以正常工作了。新检查的文件应该遵循新的配置,并保留从远程仓库克隆的任何行末标识符。

    请注意,如果您的远程仓库使用混合的crlflf结尾,您还需要运行并推送更改。

    git add --renormalize .
    

    2) 通过检入的.gitattributes文件设置每个存储库

    在你的工作目录(本地仓库)中:

    1. 在根目录下创建.gitattributes文件,将以下内容添加进去:

      * text=auto eol=lf
      
    2. 提交文件(以及其他所有文件)

    3. 与上述操作相同

    4. 与上述操作相同

    重要提示:将文件引入存储库后,每个仍使用旧CRLF文件的人都需要执行步骤3和4以更新其工作目录,因为仅检出提交不会影响已存在的文件。

    git reset hard


    注意事项

    设置core.autocrlftrueinput可以覆盖core.eol

    https://www.git-scm.com/docs/git-config#Documentation/git-config.txt-coreautocrlf

    core.autocrlf=input是Unix系统上的首选值。 https://dev59.com/BXA75IYBdhLWcg3wm6Uj#41282375
    https://dev59.com/BXA75IYBdhLWcg3wm6Uj#4425433

    故障排除

    以第三个选项(与Q中的屏幕截图相同)重新安装Windows版git

    检出原样-提交原样(core.autocrlf=false


    2

    实际上我不想要 CRLF。是的,我在谈论支持 LF 的 IDE 和工具,因此需要 .editorconfig。从我的学习中得知,.gitattributes 可能会相当复杂,你需要调整某些扩展名。无论如何,要使用 .gitattributes,你仍然需要确保每个开发者的 git 安装正确设置,因此我认为另一种解决方案更直接,需要更少的工作和进一步的维护。 - Qwerty
    抱歉,我忘记编辑行以更改为“LF”(现已编辑)。而且,.editorconfig不是解决方案。是的,.gitattributes是现在的好解决方案,因为它不需要所有开发人员正确配置他们的git。你读过Edward Thomson的帖子吗?不,你的解决方案并不是最直接的,因为有时候开发人员会提交错误的eol... - Philippe
    1
    不,.gitattributes 覆盖了 core.autocrlf,这是事实。请确保正确使用并将其提交到您的代码库中,这样无论 core.autocrlfcore.eol 设置为什么都不会有影响。这就是 .gitattributes 的作用所在。 - Edward Thomson
    就像我在问题中所说的那样,仓库已经使用了LF,我不需要运行规范化。您能否确认要使.gitattributes生效,必须将本地git配置设置为core.autocrlf=false - Qwerty
    1
    不管你将core.autocrlf设置为什么,.gitattributes都会覆盖它。如果你为一个文件配置了.gitattributes,那么core.autocrlf将被忽略。 - Edward Thomson
    显示剩余6条评论

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接