通过.gitattributes强制执行core.autocrlf = input

时间:2017-03-08 09:51:10

标签: git line-endings eol gitattributes core.autocrlf

有没有办法在core.autocrlf=input内强制执行.gitattributes,以便在我的同事中传播政策?

详细说明我想在添加上转换为lf,并在结帐上保留as is

问题是texteol都没有.gitattributes执行我想要的操作,因为eol有3个可接受的值:

  1. lf
  2. crlf
  3. native
  4. 理想情况下,我希望我的.gitattributes文件看起来像这样:

      

    * text eol=asis

3 个答案:

答案 0 :(得分:1)

  

详细说明我想要的是在提交时转换为lf并在结帐时保持原样。

Git不会在提交时转换,而是在git add转换。 (更确切地说,它会对将对象复制到存储库并生成哈希值的操作进行转换 - 但对于大多数用途而言,无论如何都只是git add。)此时它适用于任何&#34 ;清洁&#34;过滤并执行输入端EOL操作。 (同样,当从存储库复制到工作树时,会出现输出端&#34;污迹&#34;过滤器和EOL操作,对于大多数用途,工作树为git checkoutgit reset --hard。)< / p>

根据the gitattributes documentation,设置eol=lf

  

...强制Git将行结尾标准化为LF on   签入并阻止文件转换为CRLF   检查出来。

因此,虽然我实际上没有对此进行测试,但听起来* eol=lf正是您想要的。 请注意,这与core.eol 不同,后者的行为与您在问题中描述的相同;这仅适用于.gitattributes设置,该设置适用于与名称模式匹配的文件。

答案 1 :(得分:1)

最接近core.autocrlf=input的地方是在.gitattributes中使用text=auto

指定它们是文本文件,因此新文件将以LF行结尾放入回购文件中。 并且,根据The gitattributes documentation,通过设置text=auto

使用CRLF提交文件后,不会进行任何转换。

我们最近将Mercurial仓库转换为Git。 Mercurial不会进行eol转换,因此转换后我们的许多文件已经具有CRLF。为这些文件扩展名设置text=auto可使新文件仍被归一化为LF,但不会触及现有文件,也不会在当前目录中显示它们的修改状态。

答案 2 :(得分:1)

目前尚不清楚您在工作树中“原样”是什么意思。如果您想让Git在存储库中的LF中存储行尾,并让用户(根据其平台和/或设置)在工作树中决定他们想要的内容,请使用以下方法:

* text

这将强制行尾转换,而Git将在存储库中将文件转换为LF,并在结帐时兑现用户首选的行尾。如果并非所有文件都是文本文件(即您有图像或其他二进制文件),并且希望Git进行猜测,则可以使用以下方法:

* text=auto

请注意,如LoopInFool所述,这不会导致已经CRLF的文件被转换,因此您需要确保文件已经在存储库中的LF中,或者将这些文件类型明确地以文本形式列出(例如*.c text)。

core.autocrlf=input的行为是在添加到存储库时强制转换为LF,而在结帐时不执行任何转换;也就是说,无论用户如何设置,始终使用LF结尾。如果这是您想要的行为,则可以执行以下操作:

* eol=lf

请注意,设置eol可以有效地设置text属性,因此您不应在任何二进制文件中对其进行设置。

如果您要的是让Git匹配结帐时工作树中已经存在的行尾(例如,通过读取文件),那么它将不会这样做。 Git总是根据配置进行行尾转换,而不考虑已经存在的内容,因此用户将不得不以某种方式表明其偏好或接受平台的默认行为。

此外,Git始终将对文件大小的任何更改都视为git status中的更改,即使它忽略添加时的更改(例如,因为您仅更改了行尾);同样,这也是不可避免的。

如果您想要的完全不同,请进一步介绍您想要的行为,我将提供更多详细信息。