什么"!eol"在gitattributes吗?

时间:2014-01-23 08:09:56

标签: git line-endings eol gitattributes

最近,我在.gitattributes文件中遇到了以下条目:

"* text=auto !eol"

!eol做了什么?

4 个答案:

答案 0 :(得分:16)

Git有两个处理行尾的属性:

  1. 文本
  2. 文档说:

      

    此属性启用和控制行尾标准化。对文本文件进行规范化后,其行结尾将转换为存储库中的LF

    这实际上意味着当你提交回购时,它会将行结尾转换为LF

    1. EOL
    2. 文档说:

        

      此属性设置要在工作目录中使用的特定行结束样式。它可以在没有任何内容检查的情况下实现行尾规范化,有效地设置文本属性。

      因此,虽然 text 属性会影响文件在“重播”中的显示方式,但eol会影响文件在工作目录中的显示方式。

      现在,属性可以有4种状态:

      设置为无值
      例如:* text

      未设置
      例如:* -text

      设置具体值
      例如:* text=auto

      未指定
      例如:* !text

      所以,* text=auto !eol意味着:

      所有文件的属性文本都设置为auto,eol属性未指定。阅读文档,我们发现text = auto意味着你让git决定文件是否是文本,如果它是正常化它(将repo中的行结束设置为LF)。

      !eol表示属性eol设置为未明确指定。在这种情况下,它完全没有指定它,指示Git查看core.eol配置设置,以了解如何处理工作目录中的行结尾。请注意:

        

      core.eol配置变量控制Git将用于工作目录中规范化文件的行结尾;默认设置是使用您平台的本机行结束,如果设置了core.autocrlf,则使用CRLF。

      但你会在以下情况下使用!eol:

      * text=auto eol=CRLF
      test.txt !eol
      

      基本上覆盖了来自 CRLF 的eol属性到未指定的test.txt。这意味着对于除test.txt之外的所有文件,Git会将checkout EOL转换为CRLF,但不会对test.txt执行任何操作。

答案 1 :(得分:5)

* text=auto !eol

意味着:

  • 不会对二进制文件执行EOL(行尾)转换。
  • 对于文本文件,EOL在检出文件时转换为依赖于操作系统的EOL(对于Unix转换为LF,对于Windows转换为CR + LF),并在签入时替换为LF。

答案 2 :(得分:3)

根据documentation

,它基本上会停用eol
  

有时您需要覆盖a的属性设置   未指定状态的路径。这可以通过列出的名称来完成   带有感叹号前缀的属性!。

eol执行以下操作:

  

此属性设置要在其中使用的特定行结束样式   工作的          目录。它可以在没有任何内容的情况下实现行尾标准化          检查,有效地设置文本属性。

答案 3 :(得分:2)

简短版本:

如果Git决定内容是文本,则在签入时其行结尾将标准化为LF。 在某些嵌套的.gitattributes文件中恢复任何显式的eol设置。

请参阅man gitattributes

   Each line in gitattributes file is of form:

       pattern attr1 attr2 ...

   Sometimes you would need to override an setting of an attribute for a path to
   Unspecified state. This can be done by listing the name of the attribute
   prefixed with an exclamation point !.

   text
       This attribute enables and controls end-of-line normalization. When a text
       file is normalized, its line endings are converted to LF in the
       repository. To control what line ending style is used in the working
       directory, use the eol attribute for a single file and the core.eol
       configuration variable for all text files.

       Set to string value "auto"
           When text is set to "auto", the path is marked for automatic
           end-of-line normalization. If Git decides that the content is text,
           its line endings are normalized to LF on checkin.

   eol
       This attribute sets a specific line-ending style to be used in the working
       directory. It enables end-of-line normalization without any content
       checks, effectively setting the text attribute.