【问题标题】:Git on Windows: What do the crlf settings mean?Windows 上的 Git:crlf 设置是什么意思?
【发布时间】:2011-05-10 01:45:45
【问题描述】:

我不明白 git 中与 CrLf 设置相关的复杂性:core.autocrlfcore.safecrlf

我正在团队中开发一个跨平台项目,并且希望 Windows 和 Linux 开发人员能够一起工作,而无需 git 将文件标记为仅因为行结束样式而修改。

各种设置是什么意思?选择任何选项会有什么后果?对于我的情况,最好的解决方案是什么?

是的,我知道 this question 并且那里的答案没有洞察力,因此没有帮助。

【问题讨论】:

标签: windows linux git newline core.autocrlf


【解决方案1】:

autocrlf 的三个值:

  • true - 当内容进入存储库(已提交)时,其行尾将转换为 LF,而当内容从存储库出来(已签出)时,行尾将转换为CRLF。这通常适用于无知的 Windows 用户/编辑器。假设编辑器(或用户)将创建带有 CRLF 结尾的文件,并且如果它看到正常的 LF 结尾会吓坏,但是您希望在 repo 中使用 LF 结尾,这有望覆盖您。不过,事情可能会出错。链接问题中有虚假合并冲突的示例和修改文件的报告。

  • input - 当内容进入存储库时,其行尾将被转换为 LF,但内容在输出时保持不变。这与true 基本处于同一领域,假设编辑器实际上可以正确处理LF 结尾;您只是在防止意外创建带有 CRLF 结尾的文件的可能性。

  • false - git 根本不处理行尾。由你决定。这是很多人推荐的。使用此设置,如果文件的行尾将被弄乱,您必须意识到这一点,因此合并冲突的可能性要小得多(假设知情用户)。教育开发人员如何使用他们的编辑器/IDE 几乎可以解决这个问题。如果配置正确,我见过的所有为程序员设计的编辑器都能够处理这个问题。

请注意,autocrlf 不会影响存储库中已经的内容。如果您之前已经提交了带有 CRLF 结尾的内容,他们将保持这种状态。这是避免依赖 autocrlf 的一个很好的理由;如果一个用户没有设置它,他们可以将带有 CRLF 结尾的内容放入 repo,它会一直存在。强制标准化的一种更强大的方法是使用text attribute;假设 git 决定内容是文本(不是二进制),将给定路径设置为 auto 会将其标记为行尾规范化。

一个相关的选项是safecrlf,它基本上只是一种确保您不会对二进制文件执行不可逆转的 CRLF 转换的方法。

我在处理 Windows 问题和 git 方面没有大量经验,因此当然欢迎提供有关影响/陷阱的反馈。

【讨论】:

  • 感谢您清晰详细的回答!几个问题:1)文本属性是回购的一部分吗?如果一个新程序员克隆它,他会收到带有它的 attr 吗? 2) 了解换行样式的动机是什么? 3)假设没有,根据您的解释,我应该 a)设置 autocrlf=true b)在 repo 的根路径上设置 text attr=auto 和 c)设置 safecrlf=?? 4)如果我确实设置了 autocrlf=input,并使用配置不正确的 IDE“触摸”文件(可能将 LF 更改为 CRLF),git 会将该文件视为已修改吗?
  • @Jonathan: (1) 查看链接的 gitattributes 手册页。属性在 .gitattributes 文件中配置,可以像任何其他文件一样进行跟踪。 (2) 配置您的 IDE 以生成正确类型的输出是一次性的事情,而且它是完全必要的 - 一致的缩进、间距和格式怎么样?意识到这意味着没有惊喜。 (3a,b) 将 everything 的 text 属性设置为 auto 无论如何都应该使 autocrlf 设置变得不必要,除非有人设法选择了一个根本无法处理 LF 的编辑器(记事本?)。这是一种更安全的方法。
  • @Jonathan: (3c) 在任何带有跟踪二进制文件和某种行结束转换的 repo 中,启用 safecrlf 可能是一个好主意。 (4) 我认为在这种情况下,您不应该看到修改 - 但我看到很多人提到修改文件的虚假迹象。
  • 根据您在 SA 上的链接,我一直在阅读建议保留 autocrlf=false 的人,从您的原始答案来看,我认为您也倾向于 autocrlf=false。我想我必须配置我的 IDE + 了解 WTF 的运行情况 + 使用一些我可以在网上找到的工具将我当前的所有文件转换为 LF...
  • @Jonathan:在线? dos2unix(我认为在某些系统中打包为fromdos)是执行此操作的标准方法。是的,我真的建议不要使用 autocrlf;如果您想尝试规范化行尾,则文本 gitattribute 是一种更简洁的方法,我相信它在最近的 git 版本中得到了改进。
【解决方案2】:

我探索了提交和签出案例的 3 个可能值,这是结果表:

╔═══════════════╦══════════════╦══════════════╦══════════════╗
║ core.autocrlf ║     false    ║     input    ║     true     ║
╠═══════════════╬══════════════╬══════════════╬══════════════╣
║   git commit  ║ LF => LF     ║ LF => LF     ║ LF => LF     ║
║               ║ CR => CR     ║ CR => CR     ║ CR => CR     ║
║               ║ CRLF => CRLF ║ CRLF => LF   ║ CRLF => LF   ║
╠═══════════════╬══════════════╬══════════════╬══════════════╣
║  git checkout ║ LF => LF     ║ LF => LF     ║ LF => CRLF   ║
║               ║ CR => CR     ║ CR => CR     ║ CR => CR     ║
║               ║ CRLF => CRLF ║ CRLF => CRLF ║ CRLF => CRLF ║
╚═══════════════╩══════════════╩══════════════╩══════════════╝

我建议在所有平台上使用core.autocrlf = input。在这种情况下,如果 Git 面对 CRLF,它会隐式将其转换为 LF,而现有的带有 LF 的文件将保持原样。

【讨论】:

  • 你是在 Windows 机器还是 Unix 机器上做这些实验的?
  • @EdwardFalk, core.autocrlf 行为不依赖于操作系统类型。但如果我没记错的话,Windows 上的默认值是 true,而 Linux 上的默认值是 input。可能导致问题的另一件事是 Windows 上的大多数 IDE 都配置为默认使用 CRLF 来处理新文件和 Linux - LF。
  • 我想你换了inputtrue。下面 Srikanth Popuri 的表格对我来说是正确的。
  • @GandalfSaxe 看起来你是对的。让我解决它
【解决方案3】:

仅供参考,默认情况下,以 Windows 结尾的行将采用 CRLF,Linux 将采用 LF。 请参阅下表以便清楚了解。

╔═══════════════╦══════════════╦══════════════╦══════════════╗
║ core.autocrlf ║    false     ║    input     ║    true      ║
║               ║ Win => Unix  ║ Win => Unix  ║ Win => Unix  ║
╠═══════════════╬══════════════╬══════════════╬══════════════╣
║   git commit  ║ LF => LF     ║ LF => LF     ║ LF => LF     ║
║               ║ CR => CR     ║ CR => CR     ║ CR => CR     ║
║               ║ CRLF => CRLF ║ *CRLF => LF  ║ *CRLF => LF  ║
╠═══════════════╬══════════════╬══════════════╬══════════════╣
║  git checkout ║ LF => LF     ║ LF => LF     ║ *LF => CRLF  ║
║               ║ CR => CR     ║ CR => CR     ║ CR => CR     ║
║               ║ CRLF => CRLF ║ CRLF => CRLF ║ CRLF => CRLF ║
╚═══════════════╩══════════════╩══════════════╩══════════════╝

在上述表格信息中,符号 * 突出显示了 Windows 和 Unix 之间的差异。一目了然,以下是基于 OS 平台的 CLRF 信息:


对于 Windows 用户

  • 如果 Windows 用户处理跨平台项目,必须对于 Windows 机器为core.autocrlf=true,对于 Unix 机器为core.autocrlf=input
  • 如果 Windows 用户只使用 Windows 项目,它可以是 core.autocrlf=truecore.autocrlf=false。但是core.autocrlf=input 在这种情况下会导致问题。

适用于 Unix 用户(Linux / Mac OS)

  • 如果 Unix 用户处理跨平台项目,则必须对于 Windows 机器为 core.autocrlf=true,对于 Unix 机器为 core.autocrlf=input
  • 如果 Unix 用户只使用 Unix 项目,它可以是 core.autocrlf=inputcore.autocrlf=false。但是core.autocrlf=true 在这种情况下会导致问题。

对于相同的操作系统用户

  • 对于纯Windows项目或纯Unix项目,可以是core.autocrlf=false

【讨论】:

    猜你喜欢
    • 2013-02-14
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多