Git 属性:`-text` 与 `eol=lf`

问题描述 投票:0回答:1

我想以所有签出都使用

LF
作为行结尾的方式配置 git 存储库,即使在 Windows 上(如果启用了
core.autocrlf
)也是如此。我从文档中得到了以下想法:

  • text
    表示:文件需要进行行尾转换
  • text=auto
    表示:文件应该进行行结束转换,如果启发式确定这是一个文本文件
  • -text
    表示:文件不应进行行结束转换。

我故意没有详细说明“行结束转换”的含义,因为这取决于全局配置和

eol
属性:

  • eol=crlf
    表示:行结束转换应在存储库中的 LF 和工作副本中的 CR/LF 之间进行转换。
  • eol=lf
    表示:行结束转换应该在存储库中的 LF 和工作副本中的 LF 之间进行转换,即它是一个身份转换
  • eol
    未指定的意思是:使用系统相关的默认值(取决于全局git配置、工作副本配置和/或主机操作系统的本机行结束约定)

看起来使用

* -text
* text=auto eol=lf
甚至
* text eol=lf
之间没有区别,因为行结束转换是否禁用或启用但不执行任何操作都无关紧要。我是否忽略了这两种配置的优点或缺点?

git newline eol gitattributes
1个回答
0
投票

这些选项之间绝对存在差异,但可能很微妙。

首先,

text=auto
通常效果很好,但并非总是如此,因为它使用启发式方法并且仅查看文件的开头。碰巧的是,许多 PDF 文件以一堆文本开始,然后包含大量二进制数据,因此它们往往会经常被误检测。在大多数情况下,您希望避免签入生成的文件(例如 PDF),而选择其源文件,但这是一个明确指定
-text
text
很有用的示例。

Settting

text eol=lf
表示当您使用
git add
时,您希望文件在存储库中转换为LF,当您签出时,您希望在工作树中为LF。但是,如果 Windows 上的某人错误配置了编辑器并使用 CRLF 将文件写入磁盘,Git 仍会将其转换为存储库中的 LF,并且您将收到如下错误:“警告:在 'abc.txt' 的工作副本中”。 foo',CRLF 将在下次 Git 触及它时被 LF 替换”。因此,签出时是身份转换,但添加到存储库时则不是。

需要注意的是,用户还可以使用

.gitattributes
覆盖
.git/info/attributes
文件。如果用户在那里设置
eol=crlf
,那么文件仍将以 CRLF 行结尾签出。

设置

-text
禁用所有行结束转换。隐式上下文是这是一个二进制文件,例如图像,并且不进行行结束转换。如果文件中有 CR 或 LF(或任何其他字节序列),则不会以任何方式更改它。这是一种身份转变。

© www.soinside.com 2019 - 2024. All rights reserved.