有没有办法在core.autocrlf=input
内强制执行.gitattributes
,以便在我的同事中传播政策?
详细说明我想在添加上转换为lf
,并在结帐上保留as is
。
问题是text
和eol
都没有.gitattributes
执行我想要的操作,因为eol
有3个可接受的值:
lf
crlf
native
理想情况下,我希望我的.gitattributes
文件看起来像这样:
* text eol=asis
答案 0 :(得分:1)
详细说明我想要的是在提交时转换为lf并在结帐时保持原样。
Git不会在提交时转换,而是在git add
转换。 (更确切地说,它会对将对象复制到存储库并生成哈希值的操作进行转换 - 但对于大多数用途而言,无论如何都只是git add
。)此时它适用于任何&#34 ;清洁"过滤并执行输入端EOL操作。 (同样,当从存储库复制到工作树时,会出现输出端"污迹"过滤器和EOL操作,对于大多数用途,工作树为git checkout
和git 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
中的更改,即使它忽略添加时的更改(例如,因为您仅更改了行尾);同样,这也是不可避免的。
如果您想要的完全不同,请进一步介绍您想要的行为,我将提供更多详细信息。