Git、Nuget 和行结尾。为什么一定要这么难?

Git, Nuget, and line endings. Why does it have to be so hard?

我在 Windows 机器上使用 git、nuget 和 Visual Studio 2015。

我有一个项目,它被内置到一个仅包含内容的 nuget 包中。压缩包内容为两个文件:

File1.ttinclude
File2.ttinclude

这些文件必须有 CRLF 行结尾。我认为这是 Windows 的默认设置。我尝试了各种 git 设置,并在我的全局 git 设置中确定了以下内容:

autocrlf = false

我可以将文件推送到远程仓库并克隆远程仓库,但文件似乎仍然有 CRLF 行结尾。

我的问题是当我尝试将该 nuget 包包含到另一个项目中时。 每当我 运行 安装包(或从包管理器中执行)时,文件都会以 LF 行结尾添加到项目中,一切都会崩溃。

我试过 autocrl=true,我试过将 *.ttinclude text eol=crlf 添加到 .git nuget 包和需要包含该包的项目的属性。似乎没有任何效果,我很茫然。

如何让 nuget 安装纯内容包并保持正确的行结尾?

我创建了以下 git 别名,我目前在将该 nuget 包添加到项目时使用该别名。它修复了行结束问题,直到 nuget 包更新。

alias.fixeol=!git add . -u && git commit -m "start eol fix" && git rm --cache -r . && git reset --hard && git add . && git commit -m "end eol fix"

更新 1: 我只是想到了这一点,因为它也可能是问题所在。我们使用 TeamCity 作为我们的构建服务器,这就是从我的源构建 nuget 包的原因。不过我没有设置它,所以我不是 100% 了解它的设置方式。构建服务器上的 git 是否也需要以某种方式设置? TeamCity 设置如何?

更新 2: 所以我只是检查了 .nupkg 的 nuget 包内容,行尾是 LF,所以它一定是构建服务器。现在我只需要弄清楚 git 需要在构建服务器上设置什么,更改它会搞砸其他项目吗?

更新 3 - 已解决: 这是一个 TeamCity 问题。 https://confluence.jetbrains.com/pages/viewpage.action?pageId=48105844

将 'Convert line-endings to CRLF' 选项设置为 true 解决了这个问题。当然,我不确定为什么一开始就是一个问题。我在本地有 autocrlf=false。这些文件是 CRLF。如果不设置该功能等同于 TC 具有 autocrlf=false 那么它不应该刚刚工作吗?目前我只在这个特定项目上将该选项设置为 true,因为它只是一个需要 CRLF 的纯内容包。我不确定它会如何影响其他项目。

I've tried adding *.ttinclude text eol=crlf to .gitattributes for the nuget package

这是正确的解决方案:始终将 core.autocrlf 设置为 false,并依赖于 eol 指令。虽然看到“”:

I’d misunderstood what git actually does when marking a file with the text attribute. It always stores the files with LF line endings internally and only converts to CRLF on checkout

所以另一种方法,如果你不需要比较版本并且如果那些 .ttinclude 文件没有太大变化或永远不会变化,那就是:

  • 使用*.ttinclude -text
  • 使用 CRLF 保存并提交它们。

请注意,对于 TeamCity(使用 JGit),.gitattributes were not supported(直到最近?):