我读到了关于.gitattributes
文件和强制行尾的规则,在一些教程中,它像* text=auto
一样编写,而在另一些教程中则像文件第一行的* text=auto eol=lf
。
有什么不同吗?第一个究竟做什么?它甚至强迫任何行结束吗?
此外,在一些存储库中,还提到* text=auto
预成型LF规范化!我不知道这是真是假。
这些属性之间存在差异。text
要求Git执行行尾转换。Git在任何时候都会将LF结尾存储在存储库中,并在工作树中检出文件时进行转换。text=auto
要求Git在文件的开头搜索一个NUL字节,如果它找到了一个,则该文件是二进制的,并且不执行转换;否则,文件为文本,并执行转换。这通常在大多数情况下都很好,并且是一个合理的默认值。
默认情况下,Git接受几个配置变量来决定应该在工作树(LF或CRLF(中使用哪种换行转换,除非设置了eol
属性。如果设置了eol
,则(a(文件自动设置为text
,并且(b(始终使用该行结尾。
因此,在前一种情况下,* text=auto
说;猜测这是否是一个文本文件,如果是,请使用用户喜欢的行尾签出该文件"eol=lf
仅适用于在这种情况下猜测为text
的文件,从Git2.10开始。通常,如果text
被明确设置,text=auto
被设置并且文件被检测为文本,或者如果text
未被指定,则eol
适用;在Git2.10及更新版本中,它不会影响显式标记为-text
或用text=auto
检测为二进制的文件。
然而,如果你使用的是旧版本的Git,这可能会导致一些二进制文件处理不当,因为这会迫使它们始终是文本。如果您的存储库只包含文本文件,那么它可以工作,但最好写成* text eol=lf
。否则,您可以单独指定不同类型的文件:
* text=auto
*.c text
*.jpg -text
*.sh text eol=lf
*.bat text eol=crlf
上面将shell文件设置为LF,因为这些文件是它们工作所必需的,具有CRLF结尾的批处理文件也是如此。JPEG文件不会有任何转换,因为它们是二进制的。