跨平台Git配置的最佳实践?

57

背景

我的应用程序用户配置文件中有一些被保存在Git仓库中,以便在多台机器和多个平台之间进行轻松共享。其中包括.gitconfig,其中包含用于处理回车换行字符的以下设置:

[core]
    autocrlf = true
    safecrlf = false

问题

这些设置也会在 GNU/Linux 平台上应用,导致出现晦涩的错误。

问题

有哪些最佳实践可以处理配置文件中这些平台特定的差异?

建议解决方案

我意识到可以为每个平台创建一个分支,并将公共内容保存在主分支上,并在主分支向前移动时与平台分支合并来解决这个问题。 我想知道是否有任何更加 简单 的解决方案?


有关行尾和Git的相关问题:https://dev59.com/lHM_5IYBdhLWcg3wvF3J - sleske
3个回答

69

永远不要打开autocrlf,它只会带来烦恼和困扰。

在Windows上使用\r\n没有任何借口,所有好的编辑器(按定义)都可以处理\n


11
头痛和悲伤的一些例子会对这个问题的回答有很大的帮助。 - naught101
4
大多数编辑器都可以处理\n,但默认使用平台特定的换行符,如它们所应该做的。 - Dustin Getz
9
如果你与其他开发人员合作,而且你们没有使用相同的autocrlf设置,那么你可能会遇到大量的合并冲突,这些冲突其实并不应该存在,只是因为行尾符不同。这种情况在Git中尤其危险,因为Git默认会自动提交它认为成功的合并结果,并且差异编辑器可以被设置为将空白字符视为无关紧要。如果你的开发团队审核不力或根本没有审核,就可能会导致重新引入已修复的错误/导致危险的代码回归。 - user456814
8
我晚了,但我有个例子 - Cygwin无法处理shell脚本中的CRLF结尾。通常这没问题,但当该脚本是团队一半项目的构建脚本时......很多人认为构建系统出了问题或构建存在缺陷,其实只是忘记运行Dos-to-Unix脚本而已,引起了很多麻烦。最终更改了仓库设置以避免此类问题。 - Jeutnarg
我的嵌入式IDE生成带有CRLF的文件,如果将它们更改为LF,则无法正常工作。 - endolith
显示剩余2条评论

38

我已经在问题:
使用代码分发git配置中广泛地审查了那种配置设置(crlf)。

结论是:

*.java +crlf
*.txt +crlf
...
  • 避免对不需要进行任何类型文件的转换,因为这种转换对合并、git status、shell环境和svn import有各种副作用(请参见"使用代码分发git配置"获取链接和参考文献)。
  • 如果可以的话,应该完全避免任何crlf转换。

现在,关于特定的“按平台设置”问题,分支并不总是正确的工具,尤其是对于与编程无关的数据(即:这些设置与你正在开发的内容无关,只与VCS存储您的开发历史有关)。
Git:如何维护项目的两个分支并仅合并共享数据?中所述:
“如果您将系统相关代码放在不同的目录中,并通过构建系统(Makefiles或任何您使用的其他工具)处理跨平台依赖项,则生活将简单得多。”
在这种情况下,虽然可以为系统相关代码使用分支,但我建议为支持工具的系统相关设置使用目录,并编写一个脚本来构建适当的.gitattributes文件,以根据repo部署平台应用正确的设置。

-3

我认为你应该让.gitconfig文件依赖于用户所使用的操作系统。Windows用户根本不需要autocrlf,而Linux用户则需要。例如,将文本文件保存为crlf格式,并让Git自动地在Linux用户之间进行转换。

你还可以查看.gitattributes,它允许你定义哪些文件需要转换,哪些不需要。如果你只在一个地方放置配置文件,你可以定义只在那个目录中进行转换,以保险起见。


5
Linux文件结尾是默认设置,这也是Git仓库的规范。因此,这些文件已经符合Linux用户的正确格式。你的观点是错误的。 - scott m gardner

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