Wir haben mehrere Teams von Entwicklern in verschiedenen Büros, und sie benötigen unterschiedliche Werte für eine Reihe von Konfigurationseinstellungen in unseren Projekten web.config
und app.config
Dateien.web.config und app.config maschinenspezifische Einstellungen in git
Wir behalten diese Konfigurationsdateien gerne mit einem vernünftigen Satz von Standardwerten, damit Sie beim Auschecken des Stamm-/Hauptzweiges etwas arbeiten können, ohne nach Konfigurationsdateien suchen zu müssen.
Historisch haben wir Subversion, und speziell TortoiseSVN, verwendet, und dies bot eine einfache Möglichkeit, lokale Änderungen zu verwalten: Wir fügten diese Dateien einfach zu TortoiseSVNs automatischer Änderungsliste ignore-on-commit
hinzu. Dies verhindert ein versehentliches Einchecken dieser Dateien, da Sie sie dann speziell auswählen müssen, um sie beim Einchecken einzuschließen (und Sie können sicherstellen, dass Sie wichtige Änderungen einchecken, nicht das lokale Konfigurationsrauschen). Der Hauptnachteil dieses Ansatzes besteht darin, dass die Konfigurationsdateien immer "geändert" aussehen. Daher ist es nicht möglich, auf einen Blick zu erkennen, ob Sie lokale Änderungen vorgenommen haben.
Wir suchen nach Git, und ich versuche, den besten Ansatz herauszufinden.
Zunächst einmal, was in anderen Antworten bereits Stackoverflow gibt es:
Option 1: Überprüfen Sie in xxx.sample Dateien und .gitignore die aktuellen Konfigurationsdateien: Dies wird empfohlen, zum Beispiel in this answer. Das Hauptproblem, das ich dabei sehe, ist, dass Änderungen an der Konfigurationsdatei leicht vergessen werden, an zwei verschiedenen Punkten: Der Committer kann leicht Änderungen verpassen, die sie der .sample
Datei hinzufügen müssen, und Verbraucher (besonders Continuous Integration Server) können leicht Fehlende Änderungen, die sie aus der Datei .sample
in ihre lokale Konfigurationsdatei einbinden müssen. Im Grunde scheint das keine gute Lösung zu sein.
Option 2: Haben Sie ein checkte in xxx.defaults-Datei und eine .gitignored xxx.local Konfigurationsdatei, die alle Einstellungen außer Kraft gesetzt definiert: Dies wird dargebracht, fr Beispiel here. Das Problem ist, dass wir mit Standardkonfigurationsanbietern von .Net arbeiten - ich möchte wirklich nicht, dass wir ein komplett neues Settings-Loading-Framework implementieren, wenn Mirosoft bereits die ganze Arbeit erledigt hat. Kennt jemand eine Möglichkeit, die Dateien app.config und web.config auf optionale lokale Überschreibungsdateien zu verweisen?
Option 3: Lassen Sie Entwickler lokale Niederlassungen halten, und dann haben sie immer Kirsch-Picks oder rebased Zweige in Master überprüfen, um die unerwünschten Commits in ihrer lokalen Niederlassung immer zu umgehen/vermeiden: Dies wird als möglich angeboten Workflow here, und während ich die Sauberkeit in Bezug auf Change-Tracking zu schätzen (alles eingecheckt), führt es eine erhebliche Menge von erforderlich Aufwand bei jedem einzelnen Check-in; Es ist ein großer Schmerz!
Option 4: Haben Konfigurationsdateien eingecheckt, aber haben sie mit --assume-unchanged
markiert: Dies als möglicher Option angeboten wird here; soweit ich das beurteilen kann, ist es sehr ähnlich der ignore-on-commit
Änderungsliste in TortoiseSVN, außer dass Sie keine Sichtbarkeit für diese "versteckten" geänderten Dateien in einem Commit-Prozess haben; TortoiseGit zum Beispiel zeigt die Datei mit einem "geänderten" Icon-Overlay, aber im Commit-Dialog wird die Datei überhaupt nicht angezeigt. Dies scheint ein wenig beängstigend, wieder sehr leicht zu vergessen, Änderungen zu überprüfen.
Angesichts dieser Optionen, die alle diejenigen sind, die ich gefunden habe, hoffe ich auf eine Möglichkeit, eine lokale Konfigurationsdatei in/über eine eingecheckte Datei app.config/web.config optional "einzuschließen" und gehen Sie mit Option 2; Weiß jemand einen Weg, dies zu tun, oder andere Optionen, die ich vermisse? (Ich bin leicht versucht, einen benutzerdefinierten Xml-Merging Pre-Build-Schritt in Betracht zu ziehen ...)
Ich hätte früher erwähnt werden müssen, wir sind immer noch auf VS2008, daher sind keine Konfigurationstransformationen verfügbar.
UPDATE: (gelöscht, war schlicht falsch)
UPDATE 2: ich meine letzte Aktualisierung und Antwort gelöscht habe, es war dumm/funktionierte nicht. Mir ist nicht aufgefallen, dass nach einem "Our" Merge der nächste Merge in die andere Richtung die "Original" Versionen dieser Dateien zurückbringt (überschreibt die lokalen Branch Changes); Wenn Sie interessiert sind, sehen Sie sich den Verlauf an. Diese Frage ist so offen wie immer.
Welchen Ansatz haben Sie gewählt? Vielen Dank. – Hewins
Am Ende haben wir ein internes Tool erstellt, das ich nicht teilen kann, ohne durch zu viele Ringe springen zu müssen. Es unterstützt einfach Platzhalter in "Template" -Dateien, die es in "finale" Dateien konvertiert. Placeholder-to-Value-Zuordnungen werden in einem Paar einfacher Xml-Dokumente gespeichert, ein "Standard" -Dokument wird eingecheckt und ein "lokales" Dokument wird nicht eingecheckt (.Gitimigned). Die Vorlagendateien sind eingecheckt, aber alle Ausgabedateien sind .gitindored. Es kann im Modus "Diskrepanzen überschreiben" oder im Modus "Warnung vor Diskrepanzen" ausgeführt werden, wenn Sie die endgültige Vorlage (z. B. web.config) verwenden möchten, um die entsprechende Vorlage zu aktualisieren. – Tao