首页 > 解决方案 > 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 来完成这项工作?

标签: linuxwindowsgit

解决方案


我不能只配置 Windows 机器使用 core.autocrlf=true 和 Linux 机器使用 core.autocrlf=false

完美,core.autocrlf应该(几乎)总是设置为假,无论如何

代码本身应该只是 LF:它将被 Windows 和 Linux 上的 IDE 正确解释。

至于字符串,单元测试代码应该:

  • 检测操作系统
  • 根据操作系统将测试中使用的所述字符串转换为使用 LF 或 CRLF

含义:Git 与单元测试的运行方式无关。
所述单元测试不应依赖于是否正确配置了外部工具(这里是版本控制工具)。它们应该独立于 any 正确运行.gitattributes:它们的代码应该负责构建预期结果。


推荐阅读