[英]Git on Windows: What do the crlf settings mean?
我不了解git中与CrLf设置相关的复杂性: core.autocrlf
, core.safecrlf
我正在一个团队中开发一个跨平台项目,希望Windows和Linux开发人员能够一起工作,而无需将git标记的文件仅由于行尾样式而修改。
各种设置是什么意思? 选择任何选项会有什么后果? 而对我来说,最好的解决方案是什么?
是的,我知道这个问题 ,那里的答案没有见地,因此无济于事。
autocrlf
的三个值:
true
当内容进入存储库(已提交)时,其行尾将转换为LF,而当内容从存储库中出来(被检出)时,行尾将转换为CRLF。 通常,这是指无知的Windows用户/编辑者。 假设编辑者(或用户)将创建带有CRLF结尾的文件,并且会在看到正常的LF结尾时惊慌失措,但是您想在回购中使用LF结尾,则希望可以覆盖您。 不过,事情可能会出错。 在链接的问题中有虚假合并冲突的示例以及修改文件的报告。
input
-内容进入存储库时,其行尾将转换为LF,但在输出时保持原样。 基本上,这与true
处于同一领域,并假设编辑者实际上可以正确处理LF结尾。 您只是在防止意外创建带有CRLF结尾的文件的可能性。
false
-git根本不处理行尾。 由你决定。 这是很多人推荐的。 使用此设置,如果要弄乱文件的行尾,您将必须意识到这一点,因此合并冲突的可能性要小得多(假设是知情的用户)。 对开发人员进行有关如何使用其编辑器/ IDE的教育几乎可以解决这个问题。 如果配置正确,我见过的所有为程序员设计的编辑器都可以处理。
请注意, autocrlf
不会影响存储库中已经存在的内容。 如果您以前使用CRLF结尾来提交内容,它们将保持这种状态。 这是避免依赖autocrlf的很好理由; 如果一个用户没有设置它,他们可以将带有CRLF结尾的内容添加到存储库中,并且它会一直存在。 强制规范化的一种更强方法是使用text属性 ; 假设git决定内容为文本(非二进制),则将其设置为给定路径的auto
会将其标记为行尾标准化。
一个相关的选项是safecrlf
,它基本上只是确保您不会对二进制文件不可逆地执行CRLF转换的一种方法。
我没有处理Windows问题和git的大量经验,因此当然欢迎您提供有关含义/陷阱的反馈。
我探索了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结尾的行将采用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信息:
core.autocrlf=true
;对于Unix计算机, 必须为core.autocrlf=input
。 core.autocrlf=true
或core.autocrlf=false
。 但是在这种情况下, core.autocrlf=input
将导致问题。 core.autocrlf=true
;对于Unix计算机, 必须为core.autocrlf=input
。 core.autocrlf=input
或core.autocrlf=false
。 但是在这种情况下, core.autocrlf=true
将导致问题。 core.autocrlf=false
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.