2017-01-04 4 views
2

Ich verwende Git, Nuget und Visual Studio 2015 auf einer Windows-Maschine.Git, Nuget und Zeilenenden. Warum muss es so schwer sein?

Ich habe ein Projekt, das ich gemacht habe, das in ein content-only nuget Paket gebaut wird. Der Inhalt des Pakets besteht aus zwei Dateien:

 
File1.ttinclude 
File2.ttinclude 

Diese Dateien MÜSSEN CRLF Zeilenenden haben. Ich dachte, das war die Standardeinstellung für Windows. Ich habe alle Arten von git Einstellungen ausprobiert und habe folgende in meinen globalen git Einstellungen angesiedelt:

autocrlf = false 

ich die Dateien auf eine Remote-Repo schieben kann und die Remote-Fernbedienung klonen und die Dateien erscheinen noch CRLF haben Zeilenenden.

Mein Problem ist, wenn ich versuche, dieses nugget-Paket in ein anderes Projekt aufzunehmen. Immer wenn ich install-package starte (oder es vom Paketmanager aus mache), werden die Dateien mit LF-Zeilenenden zum Projekt hinzugefügt und die Hölle bricht los.

Ich habe versucht autocrl=true, ich habe versucht, *.ttinclude text eol=crlf zu .gitattributes für das nugget-Paket und das Projekt, das das Paket enthalten muss. Nichts scheint zu funktionieren und ich bin ratlos.

Wie bekomme ich nugget, um das content-only Paket zu installieren und die richtigen Zeilenenden zu behalten?

Ich habe den folgenden Git-Alias ​​erstellt, den ich derzeit verwende, wenn ich dieses nugget-Paket zu einem Projekt hinzufüge. Es behebt das Zeilenende-Problem, bis das nugget-Paket aktualisiert wurde.

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"

UPDATE 1: ich nur daran gedacht, weil es auch das Problem sein kann. Wir verwenden TeamCity als unseren Build-Server und das ist das, was das nugget-Paket von meiner Quelle her aufbaut. Ich habe es nicht eingerichtet, also bin ich nicht zu 100% wie es aufgebaut ist. Muss Git auf dem Build-Server auch auf eine bestimmte Art und Weise eingerichtet werden? Was ist mit den TeamCity-Einstellungen?

UPDATE 2: Also habe ich überprüft nur die nuget Paket Inhalt der .nupkg und den Zeilenenden sind LF, so dass es die Build-Server sein muss. Jetzt muss ich nur herausfinden, was Git auf dem Build-Server eingestellt werden muss und wird es andere Projekte vermasseln?

UPDATE 3 - Gelöst: Es war ein TeamCity-Problem. https://confluence.jetbrains.com/pages/viewpage.action?pageId=48105844

Einstellung 'Konvertieren von Zeilenenden in CRLF' Option auf True das Problem behoben. Natürlich bin ich mir nicht sicher, warum es ein Problem war. Ich habe autocrlf = false lokal. Die Dateien sind CRLF. Wenn diese Einstellung nicht entspricht TC mit autocrlf = false, dann hätte es nicht einfach funktioniert? Derzeit habe ich diese Option nur für dieses spezielle Projekt auf true gesetzt, da es nur ein reines Content-Paket ist, das CRLF benötigt. Ich bin mir nicht sicher, wie es sich auf andere Projekte auswirken würde.

+0

Teamcity mit JGit, das ist ein Problem in der Tat. Siehe meine bearbeitete Antwort. – VonC

+1

Verlassen Sie sich nicht auf 'core.autocrlf', verwenden Sie' .gitattributes'. –

+0

Das Problem endete mit TeamCity und TeamCity Server Builds ignorieren gitattributes. –

Antwort

2

Ich habe versucht, das Hinzufügen *.ttinclude text eol=crlf-.gitattributes für das nuget Paket

Das ist die richtige Lösung ist: set immer core.autocrlf auf false, und verlassen sich auf EOL-Richtlinien. siehe Obwohl „Why isn’t eol=crlf honored in .gitattributes?“:

hatte ich das falsch verstanden, was git eigentlich tut, wenn eine Datei mit dem Attribut text Markierung. Es speichert immer die Dateien mit LF Zeilenenden intern und nur wandelt in CRLF auf Kasse

So ein anderer Ansatz, wenn Sie Version nicht vergleichen müssen und wenn diese .ttinclude Dateien, nicht viel oder überhaupt ändern ist zu:

  • Verwendung *.ttinclude -text
  • sie mit CRLF speichern und begehen.

Beachten Sie, dass mit Teamcity (die JGit verwendet), .gitattributes were not supported (bis vor kurzem?):

+0

Der '* tt.include -text' wirkt sich nur auf Zeilenendungen aus, wenn die Datei von git gezogen wird, richtig? Nicht wie git die Zeilenenden speichert. Ist 'autocrlf = false 'nicht dafür verantwortlich, dass Zeilenenden sowohl beim Drücken als auch beim Ziehen beibehalten werden? Wenn ich also die Datei speichere und sie mit CRLF als Zeilenende an den Remote-Repo schiebe und der Build-Server dann den Code für das nugget-Paket bekommt, muss der Build-Server auch 'autocrlf = false' sein, wenn er' ist true', welches ist die Standardeinstellung? –

+0

@RabidPenguin -Text bedeutet, dass es nicht als Text betrachtet wird, und sein Eol ist unberührt. autocrlf = false bedeutet keine eol-Modifikation. Der Standard, den ich glaube, ist "Eingabe" – VonC

Verwandte Themen