Git 尽管 .gitattributes 搞乱了行尾

Git messing up line endings despite .gitattributes

我已经看到了 ,这是一个不同且非常奇怪的问题。我已经检查了我的 autocrlf 和 eol 配置,但它们没有设置

我在 Mac。在我们的存储库中,我们有一个 .gitattributes 文件,如下所示:

*.sql text eol=lf
*.sh text eol=lf

这对 .sql 文件非常有效。但是我们有一个名为 scripts/some-version.SQL 的文件。它以 Unix lf 结尾签入。当我在 OS X 上检查它时,该文件立即转换为 dos crlf 结尾并标记为已更改。在 Windows 上检查相同的文件会给出 Unix lf 结尾。

如果我注释掉 .gitattributes 文件中的 .sql 行,我将停止将 .SQL 文件签出为 crlf。导致此行为的是 .gitattributes。然而,Windows 用户会不小心再次开始签入 crlf 结尾。遗憾的是,更改文件名不是一个选项。

我尝试向 .gitattributes 添加 .SQL text eol=lf 行,但这没有帮助。

我们如何才能为 Windows 用户提供 .gitattributes 而不会弄乱 OS X 上此文件的行尾?


根据要求。该问题的演示,以及 check-attr.

macbookpro:postgres btilly$ git checkout scripts/
Updated 1 path from the index
macbookpro:postgres btilly$ git status scripts/3.20.08-UPDATE.SQL 
On branch integration
Your branch is up to date with 'origin/integration'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   scripts/3.20.08-UPDATE.SQL

no changes added to commit (use "git add" and/or "git commit -a")
macbookpro:postgres btilly$ git check-attr -a scripts/3.20.08-UPDATE.SQL 
scripts/3.20.08-UPDATE.SQL: text: set
scripts/3.20.08-UPDATE.SQL: eol: lf
macbookpro:postgres btilly$ file scripts/3.20.08-UPDATE.SQL 
scripts/3.20.08-UPDATE.SQL: UTF-8 Unicode text, with very long lines, with CRLF line terminators

很可能您的文件已使用 CRLF 行结尾签入,至少在某些地方是这样。令人们惊讶的是,编辑 .gitattributes 不会影响任何已签入存储库的文件,也不会影响工作树中的干净文件。

基本上,无论何时您对 .gitattributes 进行更改,您都需要 运行 git add --renormalize . 并提交这些更改。否则,您最终可能会处于不一致的状态。

另请注意,您的 .gitattributes 模式不适用于区分大小写的系统,因为您的模式使用小写 *.sql 而您的文件使用大写 .SQL。所以你可能还想添加这个:

*.SQL text eol=lf

当然,您需要在 运行宁 git add --renormalize . 之前完成。