是否可以更改 .gitattributes 中的 EOL 设置而无需规范化所有文件?

Is it possible to change EOL setting in .gitattributes without need to normalize all files?

我有一个存储库,其中混合了 CRLF 和 LF。有了新的拉取请求,就会产生新的 EOL 更改,这很烦人。有没有办法以以下方式设置 .gitattributes:

  1. 当您签入某些东西(写入对象数据库)时,它会被规范化(到 LF)。
  2. 您不必更改整个存储库中的所有 EOL,这会产生大量不必要的更改,从而加剧指责等。

有,但有点痛苦:将您修改的每个文件添加到 .gitattributes 以将其(通过路径名)指定为文本。也就是说,您将从 .gitattributes 阅读开始:

* binary

然后,每当您(或任何人)处理某个名为 dir/sub/phile.ext 的文件时,您还需要编辑 .gitattributes 以读取:

* binary
dir/sub/file.ext text

这样具有一个特定名称的文件将从那时起对其所有行结尾进行规范化。

当您编辑了 3000 个文件中的 1352 个时,您的 .gitattributes 将包含 1353 行:文件 1352 行,加上前面的 * binary。在某些时候(3000 个文件中的大约 1500 个),反转列表会变得更容易:列出每个 被视为文本的文件,并带有 * text排在前面。从那时起,每次编辑文件时,将其从 .gitattributes 中删除。当您编辑了 3000 个文件中的 2999 个后,您的 .gitattributes 将减少到只有两行:

* text
path/to/never-edited.zog binary

请注意,您可以将一个大的 .gitattributes 文件拆分为多个较小的文件,每个子目录一个:如果此时您已经编辑了 dir/sub 中的每个文件,则可以将它们从例如,顶级 .gitattributes 并让 dir/sub/.gitattributes 将其所有文件列为 * text

关键是最后匹配行 某些属性适用于文件,.gitattribute 文件首先从顶层读取,向下到最具体的子目录最后,因此顶级 .gitattributes 行被 dir/.gitattributes 行覆盖,当处理 [=23] 中的文件时,这些行又被 dir/sub/.gitattributes 行覆盖=].