我想在存储库中配置 .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 使用索引来查看文件是否已被修改,该索引保留文件大小以及其他数据。如果文件大小发生变化,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 是合理的,如果您能就该方法达成一致,那么以通用方式解决此问题可能会更容易。