2017-01-04 26 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