2017-01-04 24 views
2

我在Windows机器上使用git,nuget和Visual Studio 2015。Git,Nuget和行结尾。为什么要这么辛苦?

我有一个项目,我已经建立到内容只nuget包。包的内容是两个文件:

 
File1.ttinclude 
File2.ttinclude 

这些文件必须具有CRLF行结束。我认为这是Windows的默认设置。我已经试过各种git的设置,并在我的git全局设置,在下面解决:

autocrlf = false 

我可以将文件推送到远程的回购和克隆远程遥控器和文件显示仍有CRLF行结束。

我的问题是当我试图将nuget包纳入另一个项目。 每当我运行install-package(或者从包管理器执行它)时,文件将被添加到LF行尾的项目中,并且所有地狱崩溃。

我试过autocrl=true,我已经尝试在.gitattributes中添加*.ttinclude text eol=crlf作为nuget包和需要包含该包的项目。似乎没有任何工作,我很茫然。

如何获取nuget以安装纯内容包并保留正确的行结尾?

我已经创建了以下git别名,我将它添加到项目时使用。它修复了行结束问题,直到更新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设置?

UPDATE 2: 因此,我刚刚检查了.nupkg的nuget包内容,并且行尾是LF,所以它必须是构建服务器。现在我只需要弄清楚在构建服务器上需要设置哪些git,并将其更改为其他项目?

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

设置'将行结束符转换为CRLF'选项以真正解决问题。当然,我不确定为什么它是一个开始的问题。我在本地autocrlf = false。这些文件是CRLF。如果没有设置该功能相当于具有autocrlf = false的TC,那么它不应该是刚刚工作?目前,我只在这个特定的项目上将该选项设置为true,因为它只是一个需要CRLF的内容包。我不确定它会如何影响其他项目。

+0

TeamCity的,这是确实是一个问题。看到我编辑的答案。 – VonC

+1

不要依赖'core.autocrlf',使用'.gitattributes'。 –

+0

这个问题最终发生在TeamCity和TeamCity服务器构建忽略gitattributes。 –

回答

2

我已经尝试添加*.ttinclude text eol=crlf.gitattributes的NuGet包

这是正确的解决方案:始终设置core.autocrlf为假,并依靠停产指令。虽然看到“Why isn’t eol=crlf honored in .gitattributes?”:

我已经误解了git的标记与text属性的文件时,实际执行。它总是存储文件,内置LF行结束,只有转换成CRLF结账

所以另一种方法,如果你没有需要比较版本,如果这些.ttinclude文件不会过多或过变化,是于:

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

注意,用的TeamCity(这是使用JGit),.gitattributes were not supported(直到最近):使用JGit

+0

'* tt.include -text'只影响从git中拉取文件时的行尾,正确吗?不是git实际存储行结尾的方式。 'autocrlf = false'不会导致git保存push和pull的行结束符?所以,如果我保存文件,并将其与CRLF推送到远程的回购作为行结束,然后构建服务器获取代码,以使NuGet包,做构建服务器还必须'autocrlf = FALSE'如果它是什么' true',这是默认的? –

+0

@RabidPenguin -text表示它不被视为文本,它的eol没有被触及。 autocrlf = false表示没有修改。我相信默认是“输入” – VonC