Wie erzwingen Sie das Git-Verhalten, auch lokal (insbesondere unter Windows)?

13

Ich bin gerade dabei, diesen .NET-Shop von svn auf git zu verlagern, und habe einige Hilfsprobleme identifiziert, für die ich eine Lösung haben möchte, bevor wir den Schalter umlegen.

Die Frage, die ich in dieser Frage speziell stelle, ist die Durchsetzung von Zeilenenden. Standardmäßig wird git für Windows mit dem Befehl 'checkout crlf, commit lf' installiert, was für eine Reihe von Quellen, die (soweit mir bekannt ist) ausschließlich aus crlf-Endungen bestehen, nicht funktioniert.

Ich weiß nicht, dass ich blind einem bestimmten Entwickler vertrauen würde, um diese selbst gegebene Anweisung richtig zu konfigurieren, also überlege ich mir eine (oder beide) der folgenden Möglichkeiten, war aber neugierig, ob jemand hier einen anderen Weg gegangen ist.

  • Ein Pre-Commit-Hook, der nach lf-Zeilenenden (oder allen lf-Zeilenenden) sucht und in diesem Fall zurückweist.
  • Ein Installationsskript, das an devs verteilt wird und das die globale Konfiguration mit "as-is, as-is" auffüllt.

PS Beim Schreiben dieses Artikels ist mir aufgefallen, dass die anfängliche Konvertierung von svn nach git die Standardmethode übernehmen könnte, und solange die Leute an der Standardmethode festhalten, wäre das auch ziemlich nahtlos. Nachdem ich ein Entwickler von Git in einem .NET-Shop war, der Git mit dem nicht standardmäßigen Status "as-is, as-is" installiert hat, habe ich dort auch meine eigenen Probleme erstellt (alle hatten vor meiner Ankunft den Standardwert geändert). . Also neige ich immer noch zu einer Art Durchsetzungsmechanismus.

ndarwincorn
quelle
2
Bei einem Pre-Receive-Hook-Server sollte dies handhabbar sein (achten Sie auf crlf-Endungen und schlagen Sie fehl, wenn nicht). Mit einem Update-Hook sollten Sie auch Pre-Merge-Updates durchführen können. Welche Art von Git-Server verwenden Sie? Wenn dies auf der Workstation durchgeführt werden muss, kann ein Konfigurationsmanager der richtige Weg sein, jedoch schwieriger und mit einigen Nachteilen. Das letzte Mittel greift CI an und
zwingt
1
Ich stimme Tensibai zu und möchte hinzufügen, dass die von Ihnen gewählte Option davon abhängt, wie streng Sie glauben, dass dies durchgesetzt werden sollte. Pre-Commit-Haken für die strikte Durchsetzung, Flusen für die Compliance-Berichterstattung nach dem Commit.
Dave Swersky
Vielen Dank, Dave, meine Motivation für die clientseitige / strengere Durchsetzung ist, dass dies insgesamt weniger Arbeit für mich bedeuten und die Fehler früher beheben würde. Die Entwickler-Workstations werden nicht zum CM, aber die Entwickler-Server befinden sich alle in DSC. Das Hinzufügen ist also trivial. Bearbeiten: Vielen Dank auch @Tensibai ... könnten Sie auf die Nachteile eingehen, die Sie für den Kunden sehen?
ndarwincorn
1
Wenn Sie eine globale Hook-Client-Seite erzwingen, kann dies dazu führen, dass Sie die Arbeit an Projekten verhindern, die lf-Endungen benötigen. Und Sie müssen es auf irgendeine Weise einrichten, Sie können nicht sicher sein, dass jeder das richtige Setup befolgt. Ich bin mir sicher, dass es andere Waffen gibt, an die ich im Moment nicht denke
Tensibai,
Was haben Sie getan, um Ihr Problem zu lösen?
Newtopian

Antworten:

6

Um die Frage zu beantworten, wie etwas lokal durchgesetzt werden kann, müssen Sie den Status jeder Entwickler-Workstation sorgfältig verwalten und durchsetzen, und ich bin normalerweise der Meinung, dass Entwickler wahrscheinlich lokale Administratoren für ihre Entwicklung sein sollten Maschine, denn wenn sie es nicht sind, werden sie nur ihre Zeit damit verbringen, herauszufinden, wie wir diese Privilegien erhalten können.

Und das liegt wahrscheinlich daran, dass Sie sich nicht um den Status der lokalen Konfiguration kümmern müssen, wenn Sie die verteilte Versionskontrolle verwenden. Sie sollten sich nur um den Status Ihrer Konfiguration kümmern . Angenommen, Sie verwenden git als zentrales Versionskontrollsystem, da dies im Grunde genommen sowieso jeder tut, weil es am einfachsten ist, dann nehmen wir einfach an, dass "Ihre" Konfiguration die Kopie des Codes ist, der auf dem zentralen Server gespeichert ist.

Wenn dies der Fall ist, sollten Sie Zusammenführungen nicht akzeptieren, die, wie Sie bereits erwähnt haben, crlf / lf-Zeilenenden unterbrechen. Sie erzwingen dies also, wenn ein anderer Client versucht, Änderungen zu pushen, indem Sie eine serverseitige Logik verwenden, die die Anforderung ablehnt, Ihr Repo mit ihren möglicherweise brechenden Stiloptionen zu belasten .

hvindin
quelle
4

Wir benötigen einen Überprüfungsprozess mit Pull Requests in Github für unsere Hauptentwicklungs- oder Hauptzweige. Während dieses Überprüfungsprozesses markieren wir Pull-Anforderungen als änderungsbedürftig, wenn viele Dateien Leerzeichen oder Zeilenendungsunterschiede aufweisen, und bestehen darauf, dass sie der Formatierung des Dev- oder Master-Zweigs folgen, für den sie die Pull-Anforderung erstellen.

Es gibt auch einige nützliche Tools, die davon abhängen, welche Sprachen Sie verwenden und welche CI-Tools Sie verwenden. Während des Erstellungsprozesses oder des Pull-Request-Schritts kann der Code basierend auf den von Ihnen festgelegten Regeln automatisch formatiert werden. Dies hilft auch dabei, den Code konsistent zu halten und Formatierungsprobleme beim Festschreiben von Code zu minimieren.

avi
quelle
Möchten Sie die von Ihnen verwendeten Werkzeuge näher erläutern? Angesichts der Tatsache, dass es eine Reihe von Möglichkeiten gibt, dies zu erreichen, und wir haben unsere eigenen, müssen sie aber erst noch so umsetzen, bin ich gespannt, wie Sie das lösen.
ndarwincorn
1
Wir verwenden Typoskript, Github und Jenkins. Typescript hat ein schönes Ökosystem für diese Art von Dingen.
Avi
3

Sie können die Konfiguration pro Repository verwenden , um die Konfiguration des Benutzers pro Repository zu überschreiben. Wenn das Repo als zentrale Quelle betrachtet wird, sollte es sich mit Klonen verbreiten und auf andere Repos übertragen, einschließlich lokaler Repos, wodurch die lokale Konfiguration zentral überschrieben wird.

Sie können dies durch Haken in Ihrem zentralen Repository weiter erzwingen , um zu überprüfen, ob die Dateienden so sind, wie sie sein sollen, und das Zusammenführen / Verschieben abzulehnen, falls es nicht koscher sein sollte. Diese Hooks werden jedoch nicht mit dem Repo geklont, zumindest nicht direkt, aber dies ist nicht erforderlich, da die Regeln nur wirklich auf dem zentralen Repo erzwungen werden müssen.

Mithilfe von Vorlagen in Ihrem git init können Sie sicherstellen, dass Ihre Repos mit allen gitignore-, gitattributes-Dateien usw. identisch sind, so wie Sie es möchten.

Als letztes, das nicht direkt mit Ihrer Frage zusammenhängt, fand ich den größten Reibungspunkt, als ich svn saavy team zu einem git-basierten Workflow führte, um sie an das zusätzliche Repo in der Mitte zu gewöhnen. Ich fand heraus, dass dieses visuelle Cue-Sheet ein wenig dazu beitrug, zu erklären, welcher Befehl welchen Effekt auf welchen Teil hatte.

Hoffe das hat ein bisschen geholfen.

Newtopian
quelle