Windows上的Git:crlf设置是什么意思?


73

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

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

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

是的,我知道这个问题,而且那里的答案没有见识,因此无济于事。




1
只是为了让您感到更舒适:没有人充分做到:)
eckes

Answers:


97

的三个值autocrlf

  • true-当内容进入存储库(已提交)时,其行尾将转换为LF,而内容从存储库中出来(被检出)时,行尾将转换为CRLF。通常,这是指无知的Windows用户/编辑者。假设编辑者(或用户)将创建带有CRLF结尾的文件,并且会在看到正常的LF结尾时惊慌失措,但是您想在回购中使用LF结尾,则希望可以覆盖您。不过,事情可能会出错。在链接的问题中有虚假合并冲突的示例以及修改文件的报告。

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

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

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

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

我没有大量处理Windows问题和git的经验,因此当然欢迎您提供有关含义/陷阱的反馈。


感谢您提供清晰详细的答案!一些问题:1)文本属性是回购的一部分吗?如果新的程序员可以克隆它,他会收到它的attr吗?2)了解换行样式的动机是什么?3)假设没有一个,根据您的解释,我应该a)设置autocrlf = true b)在回购的根路径上设置text attr = auto并c)设置safecrlf = ?? 4)如果我确实设置了autocrlf = input,并使用配置不正确的IDE(可能将LF更改为CRLF)“触摸”文件,git会认为该文件已修改吗?
乔纳森(Jonathan)2010年

1
@Jonathan:(1)看一下链接的gitattributes联机帮助页。属性在.gitattributes文件中配置,可以像跟踪其他文件一样进行跟踪。(2)配置您的IDE以生成正确的输出是一次性的事情,这是非常必要的-一致的缩进,间距和格式如何?意识到并不意味着意外。(3A,3B)的文本属性设置为auto一切都应该让autocrlf设置不必要的,无论如何,除非有人已经成功地选择一个编辑器(记事本?),它根本无法处理的LF。这是一种更安全的方法。
卡斯卡贝尔

@Jonathan:(3c)在具有跟踪二进制文件和某种行尾转换正在进行的任何回购中,启用safecrlf可能是一个好主意。(4)我认为在那种情况下,您不应该看到修改-但是我看到很多人提到修改过的文件的虚假迹象。
卡斯卡贝尔

跟随您在SA上的链接,我一直在阅读有关建议保留autocrlf = false的人的信息,从您最初的回答中我认为您也倾向于autocrlf = false。猜猜我将不得不配置我的IDE +了解WTF正在进行的工作+使用我可以在网上找到的一些工具将所有当前文件转换为LF ...
Jonathan

@乔纳森:在线?的dos2unix(如包装fromdos在一些系统中,我认为)是这样做的标准方式。是的,我真的建议您不要使用autocrlf。如果您想标准化行尾,则文本gitattribute是一种更干净的方法,我相信它在最新版本的git中得到了改进。
卡斯卡贝尔

11

我探索了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仍保持原样。


1
您是在Windows盒还是Unix盒上进行这些实验的?
爱德华·福尔克

1
@EdwardFalk,core.autocrlf行为不取决于操作系统类型。但是,如果我没记错的话,Windows的默认值是trueLinux- input。可能引起问题的另一件事是,默认情况下,Windows上的大多数IDE配置为对新文件和Linux-LF使用CRLF。
pratt

我认为您为input和进行了更改true。下面的Srikanth Popuri桌子对我来说似乎正确。
甘道夫·萨克斯

@GandalfSaxe看起来您是对的。让我修复一下
pratt,

4

仅供参考。默认情况下,以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用户提供跨平台项目的工作,它必须core.autocrlf=true针对Windows机器和core.autocrlf=input用于Unix机器。
  • 如果Windows用户仅使用Windows项目,则可以同时使用core.autocrlf=truecore.autocrlf=false。但是core.autocrlf=input在这种情况下会导致问题。

对于Unix用户(Linux / Mac OS)

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

对于相同的操作系统用户

  • 对于纯Windows项目或纯Unix项目,可以为core.autocrlf=false
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.