Git 结束符不匹配导致提交时差异对比失效,表现为整个文件删除和新增

今天换了电脑开发,发现在进行 git commit 之后,只要文件有修改,即使是一模一样的内容,都是先删除,然后再新增,无法保存仅修改部分的代码。

image-20220315090318257

正文

通过测试有如下发现:

  1. 对于原电脑的文件,仅在第一次编辑时,会发生上述情况
  2. 对于当前电脑的,git 提交时,不会出现上述情况

由此,可以推测出,是新旧电脑在文件的处理上不一致导致的。顺着这个思路,开始解决这个问题。

通过 google,其原因是由于 End of Line(eof:行尾结束符) 不同导致的。其中

EOF 说明 备注
CRLF 回车换行
CR 回车
LF 换行
  • windows 上,行尾结束符为 CRLF
  • unix 系统,行尾结束符为 LF

通过对比新旧电脑的文件,其原因确实如此。

解决方法有以下几个:

  • 修改 git 设置

    1
    2
    # 检出时自动切换成 CRLF 结束符
    git config --global core.autocrlf true
  • 在项目目录中通过 .gitattributes 来进行配置

  • 如果使用了 prettier,可以用过 prettier 来进行设置

  • 修改 vscode,全局设置

    在 vscode 的配置中,搜索 eol,将其修改为 LF

  • 修改 vscode 项目级配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 在项目根目录新建 .editorconfig 文件
    # 在里面添加如下配置:

    root = true

    [*]
    indent_style = space
    indent_size = 4
    # 此处设置行尾结束符为 lf
    end_of_line = lf
    charset = utf-8
    trim_trailing_whitespace = false
    insert_final_newline = false

参考

  1. http://schacon.github.io/git/gitattributes.html
  2. vs code设置保存时自动将CRLF 转换成 LF