git autocrlf设置的明确建议

47
我每天都使用Windows、Mac OS X和Linux。我在所有这些环境中都使用git,从那些由不同行结束符选择的人使用的仓库中拉取代码。
在我的情况下,有没有关于设置core.autocrlf的明确建议?
3个回答

36

我建议,就像我在这个SO问题中所做的那样,将其设置为false。

如果您可以避免修改任何eol(使用您的编辑器),那么最好将带有这些eol的工作推回(即“按照您发现它们”)。


1
自己的笔记:autocrlf 设为 true 的一个棘手的副作用:https://dev59.com/hnI-5IYBdhLWcg3wF0Uc - VonC
2
我同意,不幸的是 autocrlf 会引起很多问题,并使冲突出现在本不存在的地方。 - Ibrahim
一个大问题是如果 Windows 的行尾已经在代码库中(例如使用 git-svn),然后你的本地 Git 搞得一团糟。 - donquixote

17

在这些讨论中经常被忽略的一个问题是,如果你在 Windows 上编写 shell 脚本(比如在 cygwin 中),并以 CRLF (autocrlf=false)提交它们,它们将在 *nix 系统上崩溃,并显示无用的错误消息。(其他脚本语言可能也存在类似情况。) 在疑惑了半个小时后,您会记起来并执行 dos2unix 命令。如果你在混合环境中工作(比如从 Windows 部署到 Linux 服务器),而你绝对想要将 autocrlf 设置为 false,那么请确保所有的 Windows 编辑器都使用 Unix (lf)换行符。否则请将 autocrlf 设置为 input(并祈祷)。大多数 21 世纪的 Windows 程序都可以不用早期的打印机回车 CR 符号,因此最好将行尾设置为 LF(Unix)。


1
嗯,实际上Cygwin似乎需要在shell脚本中使用LF行结束符。也许MinGW/MSYS bash可以使用带有CRLF的shell脚本,我不确定。但是我发现core.autocrlf=true意味着以这种方式检出的shell脚本无法在Cygwin上执行... - Colin D Bennett
4
最理想的解决方案是所有工具都支持两种类型的换行符,这样我们就可以终于把这个最毫无意义的浪费时间的问题放在身后了。而且,Windows 在这方面比 Unix 更领先。 - Roman Starkov
2011年不存在的一个新问题:如果你在Windows上编写shell脚本,有时想要在本地运行docker build,即使是在本地工作区中,CRLF也会让你感到烦恼。在这种情况下,你必须“确保”你的编辑器始终从头开始忠实地只写LF,而不管你在git上做什么。 - GrandOpener

13
GIT在二进制表示中不会针对内部具有相同文本但使用不同换行符(EOL)机制的两个文本文件使用通用的SHA1。内容存储为Blob,如果另一个相同的副本被提交到仓库,则可以重复使用它(节省空间!)。
GIT设计者默认选择尽可能使用*nix风格的EOL字符(仅限LF),以便对于相同的文本内容,您可以获得相同的SHA1。(可能是一个重要的考虑;-)
因为内容/ Blob不再记住用户的原始EOL选择(请记住,现在可能在某个遥远的仓库中),Git必须进行某些猜测(基于选项),以便以您和您的工具可以使用的方式重新创建原始用户的文件(是CRLF还是仅LF)。
通常建议是:每个用户在提交Blob时转换为*nix LF结束符(以便所有人都可以看到常见的SHA1 Blob名称)(即正确的做法),并在本地设置重新创建选项为其本地系统设置,例如*nix(LF)或Windows(CRLF)等。
为您的用户设置一些本地标准,并进行一次大型的“EOL/LF/CRLF和空格校正提交”,然后您就可以放心了(加上培训新用户)。
您还可以确保每个用户使用通用的空格调整设置,以便制表符与空格和尾随空格不会导致更多的diff问题!

内部遵循LF存储的一个好理由(可能会导致将autocrlf设置为true)。此外:我的经验是,当文件以CRLF形式存储在blob中时,应用补丁可能会失败,即使补丁文件的diff内容部分也具有CRLF。 - Rob
这个我一直在纠结的行为现在突然变得有意义了。感谢您的帮助。然而,我发现Git在执行合并时不尊重设置真是令人难以理解:我在Windows上将autocrlf设置为true,但是从团队中其他Linux用户合并后,涉及/接触到合并的文件中所有行都变成了LF。 - AbVog
@AbVog,这些设置分别是什么?最好提供一个 MVCE 来报告给 Git Dev 列表。如果您的存储库中有一些 CRLF 而它们是 LF,则结果可能是混合的,并且可能需要使用 --no-commit 和 --renormalize 进行整理。 - Philip Oakley
团队中的其他成员都使用Ubuntu,所以我认为他们没有配置autocrlf。很有可能我们的GitHub仓库包含了混合的行尾符:之前的团队经理也使用Windows,我确定他没有将autocrlf设置为true。谢谢。 - AbVog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接