当GOL在.gitattributes中设置为CRLF时,Git diff认为行结尾是LF

时间:2016-11-08 03:46:03

标签: git

当我将更改恢复为具有Windows行结尾的文件并且.gitattributes将EOL定义为CRLF时,git认为行结尾已更改为LR,即使十六进制编辑器显示CRLF。

仅当.gitattributes定义EOL字符时才会发生这种情况。

没有.gitattributes:

这是正常的。

这是我的文件Web.config的原始版本。最后两个字符为 0d 0a (CR LF)

00000000: efbb bf3c 3f78 6d6c 2076 6572 7369 6f6e  ...<?xml version
00000010: 3d22 312e 3022 2065 6e63 6f64 696e 673d  ="1.0" encoding=
00000020: 2275 7466 2d38 223f 3e0d 0a              "utf-8"?>..     

我在第一行的末尾添加了一个空格字符 20 0d 0a

00000000: efbb bf3c 3f78 6d6c 2076 6572 7369 6f6e  ...<?xml version
00000010: 3d22 312e 3022 2065 6e63 6f64 696e 673d  ="1.0" encoding=
00000020: 2275 7466 2d38 223f 3e20 0d0a            "utf-8"?> ..    

Git diff显示空格字符:

diff --git a/Web.config b/Web.config
index bc3c3c3..6215f5e 100644
--- a/Web.config
+++ b/Web.config
@@ -1,4 +1,4 @@
<U+FEFF><?xml version="1.0" encoding="utf-8"?>{+ +}

还原文件,所有更改都消失了:

$ git checkout Web.config

$ git status Web.config
On branch develop
Your branch is up-to-date with 'origin/develop'.

nothing to commit, working directory clean

使用.gitattributes

这不能正常工作。

将CRLF定义为.gitattributes:

*.config eol=crlf

将空格字符添加到第一行的末尾:

00000000: efbb bf3c 3f78 6d6c 2076 6572 7369 6f6e  ...<?xml version
00000010: 3d22 312e 3022 2065 6e63 6f64 696e 673d  ="1.0" encoding=
00000020: 2275 7466 2d38 223f 3e20 0d0a            "utf-8"?> ..    

Git diff显示空格,但CR缺失(^ M):

diff --git a/Web.config b/Web.config
index bc3c3c3..9d3bc53 100644
--- a/Web.config
+++ b/Web.config
@@ -1,248 +1,248 @@
<U+FEFF><?xml version="1.0" encoding="utf-8"?>[-^M-]{+ +}

还原档案:

$ git checkout Web.config

$ git status Web.config
On branch develop
Your branch is up-to-date with 'origin/develop'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   Web.config

no changes added to commit (use "git add" and/or "git commit -a")

Git认为CR已从所有行中删除:

$ git diff --word-diff-regex=. Web.config
diff --git a/Web.config b/Web.config
index bc3c3c3..094d1d5 100644
--- a/Web.config
+++ b/Web.config
@@ -1,248 +1,248 @@
<U+FEFF><?xml version="1.0" encoding="utf-8"?>[-^M-]
<!--[-^M-]
  For more information on how to configure your ASP.NET application, please visit[-^M-]
  http://go.microsoft.com/fwlink/?LinkId=152368[-^M-]
  -->[-^M-]
<configuration>[-^M-]

但是在十六进制编辑器中并非如此:

00000000: efbb bf3c 3f78 6d6c 2076 6572 7369 6f6e  ...<?xml version
00000010: 3d22 312e 3022 2065 6e63 6f64 696e 673d  ="1.0" encoding=
00000020: 2275 7466 2d38 223f 3e0d 0a3c 212d 2d0d  "utf-8"?>..<!--.
00000030: 0a20 2046 6f72 206d 6f72 6520 696e 666f  .  For more info
00000040: 726d 6174 696f 6e20 6f6e 2068 6f77 2074  rmation on how t
00000050: 6f20 636f 6e66 6967 7572 6520 796f 7572  o configure your
00000060: 2041 5350 2e4e 4554 2061 7070 6c69 6361   ASP.NET applica
00000070: 7469 6f6e 2c20 706c 6561 7365 2076 6973  tion, please vis
00000080: 6974 0d0a 2020 6874 7470 3a2f 2f67 6f2e  it..  http://go.
00000090: 6d69 6372 6f73 6f66 742e 636f 6d2f 6677  microsoft.com/fw
000000a0: 6c69 6e6b 2f3f 4c69 6e6b 4964 3d31 3532  link/?LinkId=152
000000b0: 3336 380d 0a20 202d 2d3e 0d0a 3c63 6f6e  368..  -->..<con
000000c0: 6669 6775 7261 7469 6f6e 3e0d 0a20 203c  figuration>..  <

这里发生了什么以及如何让它正常工作?

4 个答案:

答案 0 :(得分:3)

这里的关键是,无论您使用text=autotext eol=crlf还是text eol=lf,git都会:

  1. 将行结尾转换为存储库中的LF(即git commit}
  2. 从中复制时,将行结尾转换为首选格式 存储库到您的工作树(即git checkoutgit merge
  3. 这可能是违反直觉的,但请记住git源自Linux世界并且不是错误。从文本文件规范化后的git documentation:“,其行结尾将转换为存储库中的LF ”。

    作为一个必然结果,我发现当我加入现有项目并且需要引入.gitattributes来规范化行结尾时,我发现最好编写一个Powershell脚本(或者你喜欢的任何方法)来规范化一次跨存储库的所有文件中的行结尾。这是为了避免持续混淆差异,其中唯一的变化是由.gitattributes引入的行结尾。

    最后,如果它有助于,我之前已经发布了一个沙箱,可以在我的GitHub上播放行结尾设置:https://github.com/teamtam/git-line-endings

答案 1 :(得分:3)

这是我面对某些时候的git错误。您可以向git小组报告:

  

可以使用电子邮件地址git@vger.kernel.org将Git社区的问题或评论发送到邮件列表。应该将git的错误报告发送到此邮件列表。

https://git-scm.com/community

如果您在Windows,您还可以尝试打开错误报告:

  1. https://github.com/git-for-windows/git/issues
  2. 可能是这个错误已在最新版本的git 2.10.2上得到修复,你可以将你的版本更新到最新版本,如果还没有:

    1. https://en.wikipedia.org/wiki/Git

答案 2 :(得分:2)

首先检查您的git config core.autocrlf值。

为确保您的.gitattributes指令是唯一要应用的指令,请务必键入:

git config --global core.autocrlf false

然后再次克隆你的Git repo并查看问题是否仍然存在。

答案 3 :(得分:2)

要在Windows上使用unix行结尾:

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

所以在你的情况下你应该设置:

git config --global core.autocrlf input
git config --global core.eol crlf

对于特定文件夹,您可以明显地执行此操作,而不是像上面显示的那样全局