【问题标题】:Git checkout files with LF line endings带有 LF 行结尾的 Git 签出文件
【发布时间】:2021-07-31 13:43:15
【问题描述】:

PSR-12 用于 PHP 和 Airbnb's ESLint config for React 要求 LF 行结尾超过 CRLF。我在 ESLint 文档中看到他们 recommend adding a .gitattributes file 的内容与此类似:

*.js text eol=lf

我检查了 Git 文档,它提到使用 eol 会使路径被认为是脏的。这是什么意思?我还注意到文档后面提到了core.safecrlf,那么这些类型的转换会导致不可逆转的问题吗?

我还需要set core.autocrlf to false so that .gitattributes takes effect吗?

【问题讨论】:

  • 不要使用 CRLF 行尾,这些都不重要。只需git clone ... --config core.autocrlf=false 并将您的编辑器配置为默认为 git 设置(如果可用)或 LF。
  • @IInspectable 我们目前正在这样做。只是寻找一种方法来标准化它,以便团队中的每个人都在项目级别使用 LF 行结尾。

标签: windows git eslint line-breaks gitattributes


【解决方案1】:

当您在 Git 中将文件设置为 text 模式时,这会告诉 Git 您希望它执行行尾转换。这意味着 Git 将始终以 LF 结尾将文件写入其内部存储,然后检查指定的结尾,无论是由于 .gitattributes 还是各种配置选项。

但是,如果存储库已包含签入的 CRLF 行结尾的文件,则设置 eol 选项将导致文件签入以 LF 结尾的存储库,如上所述。这将使 Git 认为文件已被修改,确实如此。这就是使“路径被认为是脏的”的意思。

解决这个问题最简单的方法是将条目添加到.gitattributes,添加.gitattributes文件,然后运行git add --renormalize .然后提交。这样,任何以 CRLF 结尾的文件都将在存储库中转换为 LF 结尾。

您也不需要另外设置core.autocrlf。该行为被.gitattributes 文件覆盖。

【讨论】:

  • 我认为这很清楚。考虑到 Git 设置中的默认选项是“签出 Windows 样式,提交 Unix 样式的行尾”,我认为我们的仓库中的大多数文件已经是 LF 格式。
  • 在这种情况下,运行 git pull 会将文件恢复为 CRLF 吗?我可能在 SO 上误解了这篇文章:stackoverflow.com/a/62367282/7487871.
  • 不应该。在这种情况下,有人将带有 CRLF 的文件检入存储库并且没有重新规范化,因此,CRLF 文件没有被转换并以这种方式被检出。如果你重新规范化,问题就会消失。
  • 对不起,如果这些是愚蠢的问题。在提交中将文件推送到存储库时,文件是否会转换为 LF?另外,还有什么我应该考虑的(例如,风险或其他什么)?
  • 当使用git add(包括对现有文件的更新或使用--renormalize 选项)将文件添加到存储库时,它们将被转换为LF。除非您不小心将二进制文件(例如图像)标记为文本文件,否则没有风险。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-07
  • 2015-02-21
相关资源
最近更新 更多