linux - Git - 在 Linux 上使用 Linux 风格的行尾,在 Windows 上使用 Windows 风格的行尾
问题描述
我有可以在 Linux 和 Windows 上运行的代码(用 C# 编写)。作为自动化构建过程的一部分,单元/集成测试在 TeamCity 构建机器上运行。如果进行了更改,它将同时触发 Linux 和 Windows 构建,并且将在 Linux 和 Windows 上执行相同的单元测试。
那些构建代理使用git来拉取源/构建/测试。
期望的行为是 Linux 代理具有使用 Linux 样式 (LF) 行结尾的源代码,而 Windows 代理的代码将具有 Windows 样式 (CR LF) 行结尾。这样做的原因是代码使用多行字符串文字作为某些单元测试的输入,而被测代码使用Environment.NewLine
var example = @"This is a really,
really long string";
在 Linux 和 Windows 中,我都希望系统定义的 Environment.NewLine 出现在字符串中,但鉴于我的限制,我一直无法做到这一点。
我无权访问构建代理。它需要完成工作的任何设置或值都需要在我的源代码中捕获,而不是机器上的某些本地值。我有限的理解告诉我我应该依赖一个.gitattributes
文件,虽然我已经看到甚至稍微理解了一些可以在.gitattributes
文件中使用的围绕行尾的各种设置。
我不能只配置要使用的 Windows 机器和要使用core.autocrlf=true
的 Linux 机器core.autocrlf=false
或一些变体,除非我只能通过添加或修改我的存储库中包含的文件来做到这一点。
考虑到我的限制,有没有办法使用 git 来完成这项工作?
解决方案
我不能只配置 Windows 机器使用 core.autocrlf=true 和 Linux 机器使用 core.autocrlf=false
完美,core.autocrlf
应该(几乎)总是设置为假,无论如何。
代码本身应该只是 LF:它将被 Windows 和 Linux 上的 IDE 正确解释。
至于字符串,单元测试代码应该:
- 检测操作系统
- 根据操作系统将测试中使用的所述字符串转换为使用 LF 或 CRLF
含义:Git 与单元测试的运行方式无关。
所述单元测试不应依赖于是否正确配置了外部工具(这里是版本控制工具)。它们应该独立于 any 正确运行.gitattributes
:它们的代码应该负责构建预期结果。