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。

4

1 回答 1

6

这个消息有点混乱。

当 Git 不会以与当前行结束转换设置相同的方式往返文件时,Git 会警告您。此警告不是因为 Git 将 CRLF 放入存储库(它不是) - 此警告的出现是因为 Git 将检出的文件与当前磁盘上的文件不同。

无论出于何种原因,您工作目录中的文件都具有 Unix 风格的行尾(或 Unix 和 Windows 风格的混合)。您应该能够使用十六进制编辑器看到这一点。例如,我有一个带有 Unix 风格行尾的文件:

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

如果我将文件添加到我的存储库(使用* text=autoor core.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

因此,此消息只是警告您该文件的下一次检出实际上与您当前磁盘上的内容不匹配。在这种情况下,这可能是无害的,但如果您要添加一个文件,其中行尾配置对其匹配至关重要。

于 2015-11-23T18:19:49.870 回答