通过 .gitattributes 强制 core.autocrlf=input

问题描述 投票:0回答:4

有没有办法从

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

详细来说,我想要的是在

add
上转换为 lf 并在
checkout
上留下 as is

问题是

text
eol
都没有做我想要的
.gitattributes
,因为
eol
有3个可接受的值:

  1. lf
  2. crlf
  3. native

理想情况下,我希望我的

.gitattributes
文件看起来像这样:

* text eol=asis

git line-endings eol gitattributes core.autocrlf
4个回答
11
投票

目前尚不清楚工作树中“按原样”的确切含义。 如果您希望 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
中的修改,即使它忽略了添加时的这些更改(例如,因为您只更改了行结尾);这同样是无法避免的。

如果您想要的是完全不同的东西,请更详细地了解您想要的行为,我将更新更多详细信息。


2
投票

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

这指定它们是文本文件,因此新文件将以 LF 行结尾放入存储库中。 并且,根据 gitattributes 文档,通过设置

text=auto
:

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

我们最近将 Mercurial 存储库转换为 Git。 Mercurial 不进行 eol 转换,因此我们的许多文件在转换后已经有了 CRLF。为这些文件扩展名设置

text=auto
允许新文件仍标准化为 LF,但不会触及现有文件,并且不会将它们显示为在当前目录中修改过的文件。


1
投票

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

Git 不会在提交时进行转换,而是在

git add
时进行转换。 (更准确地说,它对将对象复制到存储库并生成哈希值的操作进行转换 - 但对于大多数目的来说,无论如何,这只是
git add
。)此时,它应用任何“干净”过滤器并执行输入端停产运营。 (同样,当从存储库复制到工作树时,会发生输出端“涂抹”过滤器和 EOL 操作,对于大多数用途来说,这是
git checkout
git reset --hard
。)

根据gitattributes文档,设置

eol=lf

...强制 Git 将行结尾标准化为 LF 签入并防止在文件被转换为 CRLF 时 已签出。

因此,虽然我没有实际测试过,但听起来

* eol=lf
正是你想要的。 请注意,这与
core.eol
不同,后者的行为如您在问题中所描述的那样;这仅适用于
.gitattributes
设置,适用于与名称模式匹配的文件。


0
投票

为了完整起见,有一个适用于 Mac、Windows 和 Linux 的 GitHub 文档,关于 配置 Git 处理行结尾,包括

git config
设置和相应的
.gitattibutes
值,这比 git 文档更容易阅读。它还描述了确保本地存储库是最新的所需的步骤。

© www.soinside.com 2019 - 2025. All rights reserved.