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

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

我正在一个团队中开发一个跨平台的项目,希望Windows和Linux开发人员能够一起工作,而不会因为线结束风格而修改git标记文件。

各种设置意味着什么? select任何选项会有什么后果? 什么是我的情况最好的解决办法?

是的,我意识到这个问题 ,那里的答案没有洞察力,因此没有帮助。

autocrlf的三个值:

  • true – 当内容进入存储库(提交)时,其行结尾将被转换为LF,并且当内容从存储库中出来(被签出)时,行结束符被转换为CRLF。 这通常意味着无知的Windows用户/编辑。 假设一个编辑器(或用户)要创build带有CRLF结尾的文件,并且如果它看到正常的LF结尾,但是希望在回购结束时使用LF结尾,则会吓坏了,这将有希望覆盖您。 但事情可能会出错。 在链接的问题中有虚假合并冲突的例子和修改文件的报告。

  • input – 当内容进入存储库时,其行结尾将被转换为LF,但内容在出路时保持不变。 这与true情况基本相同,假定编辑者实际上可以正确地处理LF结尾; 你只是防止意外创build一个CRLF结尾的文件的可能性。

  • false – git根本不处理行结尾。 随你便。 这是很多人推荐的。 使用这个设置,如果文件的行结尾会被混淆,你必须知道它,所以合并冲突的可能性要小得多(假设知情的用户)。 教育开发人员如何使用他们的编辑器/ IDE几乎可以解决这个问题。 我所见过的所有编程人员都能够正确处理这个问题。

请注意, autocrlf不会影响已存在于存储库中的内容。 如果你以前用CRLF结局做了什么,他们会保持这种状态。 这是避免取决于autocrlf的一个很好的理由; 如果一个用户没有设置,他们可以将CRLF结尾的内容放入回购站,而且会坚持下去。 强制标准化的一个更强有力的方法是使用文本属性 ; 设置为auto的给定path将标记为行结束标准化,假设git决定内容是文本(而不是二进制)。

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

我没有很多处理Windows问题和git的经验,所以对于暗示/陷阱的反馈当然是受欢迎的。

我为提交和结帐案例探索了3个可能的值,这是得到的表格:

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

我build议在所有平台上使用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 ║ ╚═══════════════╩══════════════╩══════════════╩══════════════╝