大多数.gitattributes
文件都具有* text = auto
。该文件中的text=auto
有什么目的?
大多数.gitattributes
文件都具有* text = auto
。该文件中的text=auto
有什么目的?
来自文档:
.gitattributes
(或.git/info/attributes
)文件中的每一行都是以下形式:
pattern attr1 attr2 ...
因此,在这里,模式是*
,意味着所有文件,属性是text=auto
。
text=auto
表示什么意思?从文档中可以得知:
当设置text为“auto”时,路径会被标记为自动行尾规范化。如果Git决定内容是文本,则在提交时将其行尾规范化为LF。
如果没有启用,默认行为是什么?
未指定
如果未指定文本属性,则Git使用core.autocrlf配置变量来确定是否应转换该文件。
core.autocrlf
是什么作用?来自文档: core.autocrlf
将此变量设置为“true”,几乎相当于在所有文件上将文本属性设置为“auto”,但是除了不能保证规范化的文本文件外,存储库中包含CRLF的文件不会被修改。如果您想要工作目录中具有CRLF行尾,即使存储库没有规范化的行尾,请使用此设置。
此变量可以设置为"input",在这种情况下,不执行任何输出转换。
如果你认为这很难理解,你并不孤单。
以下是我的话:* text=auto
做了什么: 当有人提交一个文件时,Git会猜测该文件是否是文本文件,如果是,则会提交一个版本的文件,其中所有的CR + LF字节都将被替换为LF字节。它不会直接影响工作目录中文件的外观,当检出文件时,有其他设置会将LF字节转换为CR + LF字节。
我不建议在.gitattributes
文件中放置* text=auto
。相反,我建议类似于以下内容:
*.txt text
*.html text
*.css text
*.js text
这明确指定哪些文件是文本文件,并且在对象数据库中将CRLF转换为LF(但不一定在工作树中)。我们有一个带有* text=auto
的仓库,而Git却错误地猜测了一个图像文件是文本文件,在对象数据库中用LF字节替换CR + LF字节,导致它损坏。这个问题调试起来很棘手。
如果必须使用* text=auto
,请将其放在.gitattributes
的第一行,以便后面的行可以覆盖它。这似乎已经成为越来越流行的做法。
它确保规范化行尾。来源:Kernel.org
当文本设置为“auto”时,将对路径进行自动行尾规范化标记。如果git决定内容是文本,则其行尾在提交时会被规范化为LF。
如果您想与强制执行行尾规范化的源代码管理系统进行交互,或者您只想使存储库中的所有文本文件都规范化,请将text属性设置为“auto”以针对所有文件。
这确保了git认为是文本的所有文件在存储库中都具有规范化(LF)的行尾。
LF
,即使在 Windows 上也是如此? - Anthony该配置涉及如何处理行尾。当启用时,所有行尾都将转换为LF存储在代码库中。还有其他标志来处理工作目录中行尾的转换。关于此问题的完整信息可以在这里找到:https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html
git-scm
。MacOS使用LF。只有Windows(仅考虑主流操作系统)使用CRLF。这使得在Windows上使用nix工具的开发人员以及交换文件时所有人都更加困难。另请参见为什么要使用CRLF。 - Roi Danton*.txt text=auto
和*.txt text
有什么区别?我原以为你上面的示例中所有的 4 行都应该是text=auto
,而不仅仅是文件扩展名后面的text
。例如 KiCad 器件封装文件(".kicad_mod" 扩展名)会在其 gitattributes 文件中使用这行代码进行归一化:*.kicad_mod text=auto
(http://kicad-pcb.org/libraries/klc/G1.7/)。 - Gabriel Staples