如何配置.gitattributes s.t.在 Windows 上使用 LF 提交时,文件不会显示为脏文件?

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

我想在存储库中配置 .gitattributes 来解决所有用户的 EOL 问题,而无需他们更改本地 git 配置。

我的 .gitattributes 看起来像这样:

* text=auto

*.pdf binary
*.xlsx binary
*.png binary
*.jpg binary

在 Windows 上检查时,正如预期的那样,工作树中的行结尾是 CRLF,索引中的行结尾是 LF:

i/lf    w/crlf  attr/text=auto          sample.tex

但是,Texmaker 在保存时倾向于将 tex 文件的行结尾更改为 Unix 风格的 LF,即使没有发生实际更改。因此,“编辑”后,工作树和索引都是 LF:

i/lf    w/lf    attr/text=auto          sample.tex

不幸的是,即使没有发生实际的更改,git status 现在也会将文件显示为脏文件。我该如何解决这个问题?

我知道我可以通过 eol=lf 强制执行 Unix 风格结尾的结帐,但是如果其他用户的编辑器强制执行 CRLF,则可能会遇到问题。我已经设置了 core.autocrlf=true 。我不确定这是否会增加问题。但是,我还想为这个问题找到一个通用的(基于存储库的)解决方案,而不是更改本地配置。

git gitattributes texmaker
1个回答
0
投票

如果该文件实际上已被修改,则无法避免该文件显示为已修改。原因是 Git 使用索引来查看文件是否已被修改,该索引保留文件大小以及其他数据。如果文件大小发生变化,Git 会将其标记为已修改,即使它不会导致存储的 blob 发生实际更改。

原因是索引是一种优化,通过转换机制作为

git status
的一部分来处理文件将是极其昂贵的。例如,如果您有几个大文件(例如 500 MB)都使用行结束转换,则您将花费大量时间来执行转换,从而使
git status
非常慢。

不过,话虽如此,如果您希望 TeX 文件始终为所有用户提供 LF 结尾,您可以这样做

*.tex text eol=lf
。如果你想对所有文件使用 LF,那就是
* text=auto eol=lf

或者,如果只适合您,您可以将

core.eol
调整为
lf
,如下所示:
git config --global core.eol lf
(或仅针对此存储库使用
--global
),这将禁用所有文件的 CRLF 结尾。您还可以编辑
.git/info/attributes
并放置
*.tex text eol=lf
,这将仅为 TeX 文件配置内容,并将覆盖但不修改存储库中的
.gitattributes

根据我的经验,现在大多数编辑器都能够处理 LF 结尾,即使在 Windows 上也是如此,因此这可能是一个有效的选择。在许多情况下,要求开发人员将其编辑器配置为始终生成 LF 是合理的,如果您能就该方法达成一致,那么以通用方式解决此问题可能会更容易。

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