行尾转换如何在不同操作系统之间使用git core.autocrlf

行尾转换如何在不同操作系统之间使用git core.autocrlf,git,newline,core.autocrlf,Git,Newline,Core.autocrlf,我已经阅读了许多关于堆栈溢出的不同问题和答案,以及关于core.autocrlf设置如何工作的git文档 这是我读到的理解: Unix和Mac OSX(OSX之前使用CR)客户端使用LF行结尾。 Windows客户端使用CRLF行结尾 当客户机上的core.autocrlf设置为true时,git存储库始终以LF行结束格式存储文件,对于使用非LF行结束的客户机(即Windows),客户机上文件中的行结束在签出/提交时来回转换,无论行结束文件在客户机上的格式如何(这与Tim Clem的定义不一致—

我已经阅读了许多关于堆栈溢出的不同问题和答案,以及关于core.autocrlf设置如何工作的git文档

这是我读到的理解:

Unix和Mac OSX(OSX之前使用CR)客户端使用LF行结尾。
Windows客户端使用CRLF行结尾

当客户机上的core.autocrlf设置为true时,git存储库始终以LF行结束格式存储文件,对于使用非LF行结束的客户机(即Windows),客户机上文件中的行结束在签出/提交时来回转换,无论行结束文件在客户机上的格式如何(这与Tim Clem的定义不一致——见下文更新)

下面是一个矩阵,它试图用问号记录core.autocrlf的“输入”和“假”设置,我不确定行结束转换行为

我的问题是:

  • 问号应该是什么?
  • 该矩阵对于“非问号”是否正确?
  • 随着共识的形成,我将更新答案中的问号

    core.autocrlf value true input false ---------------------------------------------------------- commit | convert ? ? new | to LF (convert to LF?) (no conversion?) commit | convert to ? no existing | LF (convert to LF?) conversion checkout | convert to ? no existing | CRLF (no conversion?) conversion core.autocrlf值 真输入假 ---------------------------------------------------------- 提交|转换? 新的|到LF(转换到LF?)(没有转换?) 提交|转换为?否 现有| LF(转换为LF?)转换 结帐|转换为?否 现有| CRLF(无转换?)转换 我并不是真的在寻找各种设置的优缺点的意见,我只是在寻找数据,让人们清楚地知道git如何在这三种设置下运行

    --

    更新2012年4月17日:在阅读了JJD在评论中的链接后,我修改了上表中“未知”值中的一些值,并将“checkout existing | true改为转换为CRLF,而不是转换为client”.以下是他给出的定义,比我在其他地方看到的任何定义都要清晰:

    core.autocrlf=false

    这是默认设置,但鼓励大多数人更改此设置 立即。使用false的结果是Git永远不会弄乱 文件上有行尾。您可以使用LF或CRLF签入文件 或者CR或者这三者的任意组合,Git并不在意 可以使差异更难阅读,合并更难。大多数人 在Unix/Linux世界中工作时使用此值,因为它们没有 CRLF问题,他们不需要Git在任何时候做额外的工作 文件被写入对象数据库或写入 工作目录

    core.autocrlf=true

    这意味着Git将处理所有文本文件,并确保 将该文件写入对象数据库时,CRLF将替换为LF 并将所有LF在写入工作表时重新转换为CRLF 目录。这是Windows上的建议设置,因为 确保您的存储库可以在其他平台上使用,同时 在您的工作目录中保留CRLF

    core.autocrlf=输入

    这意味着Git将处理所有文本文件,并确保 将文件写入对象时,CRLF将替换为LF 但是,当您读取文件时,它不会执行相反的操作 退出对象数据库并将其写入工作数据库 目录,它们仍然有LFs来表示行的结尾 设置通常在Unix/Linux/OS X上使用,以防止CRLFs 将其写入存储库。其想法是如果您粘贴 来自web浏览器的代码,并意外地将CRLFs插入到您的 文件,Git会确保在您编写时将它们替换为LFs 到对象数据库

    Tim的文章非常优秀,我唯一能想到的是,他认为存储库是LF格式的,这不一定是真的,尤其是对于仅Windows的项目


    将Tim的文章与jmlane迄今为止投票率最高的答案进行比较,可以看出在真设置和输入设置上完全一致,而在假设置上则不一致。

    在“eol转换”方面,情况即将发生变化,如下所示:

    新的配置设置:

    这是“添加”
    core.eol
    “配置变量”提交的替代品,当前位于
    pu
    (我系列中的最后一个)。
    与其暗示“
    core.autocrlf=true
    ”是“
    *text=auto
    ”的替代品,相反,它明确表明了这样一个事实:
    autocrlf
    仅适用于希望使用它的用户 CRLF位于没有文本的存储库上的工作目录中 文件规范化

    启用时,“core.eol”被忽略

    引入一个新的配置变量“
    core.eol
    ”,该变量允许用户设置工作目录中的行尾规范化文件要使用的行尾。
    它默认为“
    native
    ”,这意味着Windows上的CRLF和其他地方的LF。 请注意,“
    core.autocrlf
    ”覆盖
    core.eol

    这意味着:

    [core]
      autocrlf = true
    
    即使
    core.eol
    设置为“
    lf
    ”,也会将CRLF置于工作目录中

    设置要在工作目录中为设置了
    text
    属性的文件使用的行尾类型。
    备选方案有“lf”、“crlf”和“native”,它们使用平台的本机行结尾。
    默认值为
    native


    其他演变:

    1.8,我会考虑制作<代码>核心。AutoLoFF <代码>打开正常化并离开T。

    core.eol:
    
    CRLF_GUESS && core.autocrlf=true -> CRLF_AUTO_CRLF
    CRLF_GUESS && core.autocrlf=false -> CRLF_BINARY
    CRLF_GUESS && core.autocrlf=input -> CRLF_AUTO_INPUT
    
    - CRLF_UNDEFINED : No attributes set. Temparally used, until core.autocrlf
                       and core.eol is evaluated and one of CRLF_BINARY,
                       CRLF_AUTO_INPUT or CRLF_AUTO_CRLF is selected
    - CRLF_BINARY    : No processing of line endings.
    - CRLF_TEXT      : attribute "text" is set, line endings are processed.
    - CRLF_TEXT_INPUT: attribute "input" or "eol=lf" is set. This implies text.
    - CRLF_TEXT_CRLF : attribute "eol=crlf" is set. This implies text.
    - CRLF_AUTO      : attribute "auto" is set.
    - CRLF_AUTO_INPUT: core.autocrlf=input (no attributes)
    - CRLF_AUTO_CRLF : core.autocrlf=true  (no attributes)
    
    | Resulting conversion when | Resulting conversion when | committing files with various | checking out FROM repo - | EOLs INTO repo and | with mixed files in it and | core.autocrlf value: | core.autocrlf value: -------------------------------------------------------------------------------- File | true | input | false | true | input | false -------------------------------------------------------------------------------- Windows-CRLF | CRLF -> LF | CRLF -> LF | as-is | as-is | as-is | as-is Unix -LF | as-is | as-is | as-is | LF -> CRLF | as-is | as-is Mac -CR | as-is | as-is | as-is | as-is | as-is | as-is Mixed-CRLF+LF | as-is | as-is | as-is | as-is | as-is | as-is Mixed-CRLF+LF+CR | as-is | as-is | as-is | as-is | as-is | as-is
    ╔═══════════════╦══════════════╦══════════════╦══════════════╗
    ║ core.autocrlf ║     false    ║     input    ║     true     ║
    ╠═══════════════╬══════════════╬══════════════╬══════════════╣
    ║               ║ LF   => LF   ║ LF   => LF   ║ LF   => LF   ║
    ║ git commit    ║ CR   => CR   ║ CR   => CR   ║ CR   => CR   ║
    ║               ║ CRLF => CRLF ║ CRLF => LF   ║ CRLF => LF   ║
    ╠═══════════════╬══════════════╬══════════════╬══════════════╣
    ║               ║ LF   => LF   ║ LF   => LF   ║ LF   => CRLF ║
    ║ git checkout  ║ CR   => CR   ║ CR   => CR   ║ CR   => CR   ║
    ║               ║ CRLF => CRLF ║ CRLF => CRLF ║ CRLF => CRLF ║
    ╚═══════════════╩══════════════╩══════════════╩══════════════╝
    
    commit core.autocrlf false, remove, checkout core.autocrlf false: LF=>LF   CRLF=>CRLF  
    commit core.autocrlf false, remove, checkout core.autocrlf input: LF=>LF   CRLF=>CRLF  
    commit core.autocrlf false, remove, checkout core.autocrlf true : LF=>LF   CRLF=>CRLF  
    commit core.autocrlf input, remove, checkout core.autocrlf false: LF=>LF   CRLF=>LF  
    commit core.autocrlf input, remove, checkout core.autocrlf input: LF=>LF   CRLF=>LF  
    commit core.autocrlf input, remove, checkout core.autocrlf true : LF=>CRLF CRLF=>CRLF  
    commit core.autocrlf true, remove, checkout core.autocrlf false: LF=>LF   CRLF=>LF  
    commit core.autocrlf true, remove, checkout core.autocrlf input: LF=>LF   CRLF=>LF  
    commit core.autocrlf true,  remove, checkout core.autocrlf true : LF=>CRLF CRLF=>CRLF