在gitattributes文件中使用"Git * text=auto"和行尾符

7
基于这篇文章: `.gitattributes` 文件中的 `text=auto` 的目的是什么? 如果在 .gitattributes 文件中有以下内容,则文本文件的行结尾会转换为 LF
* text=auto

我刚在本地存储库上进行了测试:

$ git add -A
warning: LF will be replaced by CRLF in [bla]/.gitattributes.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in [bla]/.gitignore.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in [bla]/README.md.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in [bla].csproj.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in 

但是这里说它会转换为CRLF。在上面的帖子中,它说它会转换为LF,但在这个测试中并不是这样。

所以看起来:

* text=auto

将根据操作系统转换为相应的行尾类型(Windows为CRLF,Linux为LF)。但这不是本文所描述的内容:

https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html

根据以下评论/答案,似乎出现以下情况会导致警告:
* text=auto

在 .gitattributes 文件中:
warning: LF will be replaced by CRLF in [bla]/README.md.
The file will have its original line endings in your working directory.

实际上意味着当您进行检出操作(下次从存储库检出文件到您的工作目录时),当前使用LF结尾的文本文件将被转换为使用CRLF结尾。
警告并未解决在检入操作中行末使用LF的问题,这正是文档所说的。

https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html

设置为字符串值 "auto" 当文本设置为 "auto" 时,路径被标记为自动换行符规范化。如果 Git 决定内容是文本,则在提交时将其行结尾规范化为 LF。


可能是 git replacing LF with CRLF 的重复问题。 - user743382
相关,但不是我在这里所要求的内容。这里是关于特定警告消息的含义,并将其与公共文档中的描述进行比较。 - u123
警告不是由于 text=auto 引起的,但是 text=auto 有效地与您之前设置的其他选项进行交互。其他问题涵盖了这些其他选项。 - user743382
1个回答

6
这条信息有点令人困惑。
当Git无法使用当前的换行符转换设置来完全还原您的文件时,它会发出警告。这个警告并不是因为Git将把CRLFs放入存储库(它不会),而是因为Git检出的文件与您当前磁盘上的文件不同。
由于某种原因,您工作目录中的文件具有Unix风格的换行符(或Unix和Windows样式的混合)。您可以使用十六进制编辑器查看此情况。例如,我有一个带有Unix风格换行符的文件:
C:\Temp>hexdump /C foo
00000000  68 65 6c 6c 6f 21 0a                              |hello!.|
00000007

如果我将文件添加到我的代码库中(使用 * text=autocore.autocrlf=true):

C:\Temp>git add foo
warning: LF will be replaced by CRLF in foo.
The file will have its original line endings in your working directory.

如git所示,我当前的工作目录中的文件具有其原始(Unix风格)的换行符:
C:\Temp>hexdump /C foo
00000000  68 65 6c 6c 6f 21 0a                              |hello!.|
00000007   

但是仓库中的文件同样有Unix风格的行尾:

C:\Temp>git ls-files --stage
100644 4effa19f4f75f846c3229b9dbdbad14eff362f32 0       foo

C:\Temp>git cat-file blob 4effa19 | hexdump /C
00000000  68 65 6c 6c 6f 21 0a                              |hello!.|
00000007

但如果我让git创建文件内容,它将创建一个不同的文件——其行尾是CRLF,这实际上就是那个警告所指示的:

C:\Temp>del foo

C:\Temp>git checkout -f foo

C:\Temp>hexdump -C foo
00000000  68 65 6c 6c 6f 21 0d 0a                           |hello!..|
00000008

因此,这条消息只是为了警告您,下一次检查此文件时实际上将与您当前磁盘上的内容不匹配。 在这种情况下,这可能是无害的,但如果您正在添加一个需要行结束配置与现有文件匹配的文件,则会导致严重问题。


好的,所以这个警告实际上是针对你进行检出操作时的情况,而不是与公共文档中的签入规则有关。请查看我编辑过的帖子。 - u123
1
提交和检出需要全面考虑,您的过滤器和行尾设置适用于两者。这是警告您的适当时机,因为这是您可以采取行动纠正错误的唯一时机。 - Edward Thomson

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