【问题标题】:Git makes all checked out files' end of line CRLFGit 使所有签出文件的行尾为 CRLF
【发布时间】:2010-09-01 18:57:23
【问题描述】:

我在 mac 上编程,我真的不明白 Git 对我的文件行尾做了什么:

我创建了一个存储库,其中包含一些 Unix 格式的文件(LF 行尾)

当我克隆我创建的存储库时,我所有的行尾都是 CRLF。它不应该自动检测到我需要 LF end of line 吗?

我已将 autoclrf 设置为 true。

GIT 关于 autoclrf 的文档很难理解:

如果您只想在工作目录中使用 CRLF 行结尾,而不管您正在使用的存储库如何,您可以设置配置变量“core.autocrlf”而不更改任何属性。

[核心]

   autocrlf = true

这不会强制对所有文本文件进行规范化,但会确保您引入存储库的文本文件在添加时将其行尾规范化为 LF,并且已在存储库中规范化的文件保持规范化。

第一句说“如果你想拥有所有crlf”,而第二句说git会自动调整行尾。

就我而言,似乎 Git 将所有内容都转换为 CRLF,并在我尝试克隆时保持不变。

【问题讨论】:

标签: windows linux git macos


【解决方案1】:

gitattributes 联机帮助页的布局很差。在后面的部分中,您会发现:

core.eol 配置变量控制 git 将哪些行结尾用于工作目录中的规范化文件;默认为您的平台使用本机行尾,如果设置了core.autocrlf,则为CRLF。

因此,除非您指定了 core.eol,否则无论您使用的是 Apple Mac OS X、Microsoft Windows 还是 Ubuntu Linux,您最终都会得到以 CR+LF 字符结尾的行。

根据您的问题:

第一句说“如果你想拥有所有crlf”,而第二句说git会自动调整行尾。

需要注意的是,当core.autocrlf 设置为true 时,会执行两个调整方向:

  • CR+LFs 会变成你的repository/repositories中的LFs。也就是说,提交文件和repository 后端在文本文件的行尾都会有LFs .这使您的提交历史中的事情保持一致,如果您同事的 IDE 决定神奇地将您的 LF 转换为 CR+LF(谁想在他们的 diff 中看到这一点?),则使差异/比较更容易。我想你也会节省几个字节的硬盘空间。
  • LF 将在您的工作目录中变成 CR+LF。 在您签出的文件系统中,任何新的文本文件都会在 git 接触到它时有以 CR+LF 结尾的行。即使文件在您第一次创建时有以纯 LF 结尾的行,也会发生这种情况。

您要做的第一件事是取消设置core.autocrlf 或将其设置为false。如果您希望签出的文本文件符合用户的操作系统首选行结尾,无论它们是如何创建的,只需将其添加到您的 .gitattributes 中:

* text=auto

或者,如果 git 不善于猜测你的哪些文件是文本,你可以声明一个特定的扩展来进行这种双向规范化:

*.ext text

(其中ext 是有问题的文件扩展名)

【讨论】:

    【解决方案2】:

    当您将 core.autocrlf 设置为 true 时,Git 在提交到 repo 时会将行尾转换为 LF,但会使用适合您平台设置的行尾(LF on Mac/Unix/Linux,CRLF 在 Windows 上)。

    【讨论】:

    • 那么为什么我在从 Git 拉取文件后编辑文件时会得到那些 ^M 呢?该文件是“.sh”并且是可执行文件。
    • 您是否在 Git diff 或其他地方看到了这些控制字符?
    【解决方案3】:

    是的,当 autocrlf 设置为 true 时,您应该在 Windows 上的工作树中看到 CRLF,这包括您是否正在浏览资源管理器。如果您推送到 Linux 存储库,您应该会看到所有文件都以 LF 正确结束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2013-11-02
      • 2020-10-16
      • 2012-04-13
      • 1970-01-01
      相关资源
      最近更新 更多