有没有办法从
core.autocrlf=input
内部强制执行 .gitattributes
,以便在我的同事中传播该政策?
详细来说,我想要的是在
add上转换为
lf
并在 checkout上留下
as is
。
问题是
text
和eol
都没有做我想要的.gitattributes
,因为eol
有3个可接受的值:
lf
crlf
native
理想情况下,我希望我的
.gitattributes
文件看起来像这样:
* text eol=asis
目前尚不清楚工作树中“按原样”的确切含义。 如果您希望 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
中的修改,即使它忽略了添加时的这些更改(例如,因为您只更改了行结尾);这同样是无法避免的。
如果您想要的是完全不同的东西,请更详细地了解您想要的行为,我将更新更多详细信息。
与
core.autocrlf=input
最接近的是在 .gitattributes 中使用 text=auto
。
这指定它们是文本文件,因此新文件将以 LF 行结尾放入存储库中。 并且,根据 gitattributes 文档,通过设置
text=auto
:
当使用 CRLF 提交文件时,不会进行任何转换。
我们最近将 Mercurial 存储库转换为 Git。 Mercurial 不进行 eol 转换,因此我们的许多文件在转换后已经有了 CRLF。为这些文件扩展名设置
text=auto
允许新文件仍标准化为 LF,但不会触及现有文件,并且不会将它们显示为在当前目录中修改过的文件。
详细来说,我想要的是在提交时转换为 lf 并在结账时保持原样。
Git 不会在提交时进行转换,而是在
git add
时进行转换。 (更准确地说,它对将对象复制到存储库并生成哈希值的操作进行转换 - 但对于大多数目的来说,无论如何,这只是git add
。)此时,它应用任何“干净”过滤器并执行输入端停产运营。 (同样,当从存储库复制到工作树时,会发生输出端“涂抹”过滤器和 EOL 操作,对于大多数用途来说,这是 git checkout
和 git reset --hard
。)
根据gitattributes文档,设置
eol=lf
:
...强制 Git 将行结尾标准化为 LF 签入并防止在文件被转换为 CRLF 时 已签出。
因此,虽然我没有实际测试过,但听起来
* eol=lf
正是你想要的。 请注意,这与 core.eol
不同,后者的行为如您在问题中所描述的那样;这仅适用于 .gitattributes
设置,适用于与名称模式匹配的文件。
为了完整起见,有一个适用于 Mac、Windows 和 Linux 的 GitHub 文档,关于 配置 Git 处理行结尾,包括
git config
设置和相应的 .gitattibutes
值,这比 git 文档更容易阅读。它还描述了确保本地存储库是最新的所需的步骤。