Ein häufiges Szenario bei der Entwicklung ist, dass die Codebasis mehrere Konfigurationsdateien enthält, für die maschinenspezifische Einstellungen erforderlich sind. Diese Dateien werden in Git eingecheckt und andere Entwickler checken sie immer versehentlich wieder ein und brechen die Konfiguration eines anderen.
Eine einfache Lösung hierfür wäre, sie einfach nicht in Git einzuchecken oder zusätzlich einen .gitignore-Eintrag für sie hinzuzufügen. Ich finde es jedoch viel eleganter, einige sinnvolle Standardeinstellungen in der Datei zu haben, die der Entwickler an seine Bedürfnisse anpassen kann.
Gibt es eine elegante Möglichkeit, Git mit solchen Dateien gut spielen zu lassen? Ich möchte in der Lage sein, eine maschinenspezifische Konfigurationsdatei zu ändern und dann "git commit -a" ausführen zu können, ohne diese Datei einzuchecken.
quelle
Antworten:
Lassen Sie Ihr Programm zwei Konfigurationsdateien für die Einstellungen lesen. Zunächst sollte eine
config.defaults
Datei gelesen werden, die im Repository enthalten sein würde. Dann sollte es eineconfig.local
Datei lesen , die in aufgelistet sein sollte.gitignore
Mit dieser Anordnung werden neue Einstellungen in der Standarddatei angezeigt und wirksam, sobald sie aktualisiert werden. Sie variieren nur auf bestimmten Systemen, wenn sie überschrieben werden.
Als Variation davon könnten Sie nur eine allgemeine
config
Datei haben, die Sie in der Versionskontrolle versenden, und sie so etwas wieinclude config.local
die maschinenspezifischen Werte einbringen lassen. Dies führt einen allgemeineren Mechanismus (im Vergleich zu Richtlinien) in Ihren Code ein und ermöglicht folglich kompliziertere Konfigurationen (falls dies für Ihre Anwendung wünschenswert ist). Die beliebte Erweiterung davon, die in vielen großen Open-Source-Programmen zu finden ist, ist toinclude conf.d
, die die Konfiguration aus allen Dateien in einem Verzeichnis liest.Auch sieht meine Antwort auf eine ähnliche Frage.
quelle
Sie können es versuchen
git update-index --skip-worktree filename
. Dadurch wird git angewiesen, so zu tun, als ob lokale Änderungen am Dateinamen nicht vorhanden wären, undgit commit -a
wird daher ignoriert. Es hat den zusätzlichen Vorteilgit reset --hard
, dass Sie auch Widerstand leisten können , damit Sie Ihre lokalen Änderungen nicht versehentlich verlieren. Außerdem schlagen automatische Zusammenführungen ordnungsgemäß fehl, wenn die Datei vorgelagert geändert wird (es sei denn, die Arbeitsverzeichniskopie stimmt mit der Indexkopie überein. In diesem Fall wird sie automatisch aktualisiert). Der Nachteil ist, dass der Befehl auf allen beteiligten Computern ausgeführt werden muss, und es ist schwierig, dies automatisch zu tun. Siehe auchgit update-index --assume-unchanged
für eine subtil andere Version dieser Idee. Details zu beiden finden Sie mitgit help update-index
.quelle
--skip-worktree
in diesem Fall möchten .Ein anderer Ansatz besteht darin, lokale Änderungen an allgemeinen Konfigurationsdateien in einem anderen privaten Zweig beizubehalten. Ich mache dies für einige Projekte, die mehrere lokale Änderungen erfordern. Diese Technik ist möglicherweise nicht in allen Situationen anwendbar, funktioniert jedoch in einigen Fällen bei mir.
Zuerst erstelle ich einen neuen Zweig basierend auf dem Master-Zweig (in diesem speziellen Fall verwende ich git-svn, also muss ich mich vom Master verpflichten, aber das ist hier nicht besonders wichtig):
Ändern Sie nun die Konfigurationsdatei (en) nach Bedarf und schreiben Sie sie fest. Normalerweise füge ich der Commit-Nachricht etwas Besonderes hinzu, wie "NOCOMMIT" oder "PRIVATE" (dies wird später nützlich sein). Zu diesem Zeitpunkt können Sie mit Ihrer eigenen Konfigurationsdatei an Ihrem privaten Zweig arbeiten.
Wenn Sie Ihre Arbeit wieder in den Vordergrund stellen möchten, wählen Sie jede Änderung von Ihrem
work
Zweig zum Master aus. Ich habe ein Skript, das dabei hilft und ungefähr so aussieht:Dies überprüft zuerst, ob ich in der
master
Filiale bin (Sanity Check). Anschließend werden alle Commitswork
aufgelistet, diejenigen herausgefiltert, die das Schlüsselwort NOCOMMIT erwähnen, die Reihenfolge umgekehrt und schließlich jedes Commit (jetzt vom ältesten zuerst) ausgewähltmaster
.Nachdem ich die Änderungen im Master in den Upstream
work
verschoben habe, wechsle ich zurück zu :Git wendet jedes Commit in der
work
Verzweigung erneut an und überspringt effektiv die Commits , die bereitsmaster
durch das Kirschpflücken angewendet wurden . Was Ihnen übrig bleiben sollte, sind nur die lokalen NOCOMMIT-Commits.Diese Technik macht den Push-Prozess etwas zeitaufwändiger, hat aber ein Problem für mich gelöst, sodass ich dachte, ich würde es teilen.
quelle
git commit -a
sorglos in der Welt läuft ?git rebase --onto
und verwendengit fetch
, um dasselbe zu tunEine Möglichkeit besteht darin, die tatsächlichen Dateien in Ihrem .gitignore zu haben, aber Standardkonfigurationen mit einer anderen Erweiterung einzuchecken. Ein typisches Beispiel für eine Rails-App ist die Datei config / database.yml. Wir würden config / database.yml.sample einchecken und jeder Entwickler erstellt seine eigene config / database.yml, die bereits .gitignored ist.
quelle
Checken Sie eine Standardkonfiguration mit einer anderen Erweiterung ein (z. B. .default), verwenden Sie einen Symlink, um den Standard mit dem richtigen Speicherort zu verknüpfen, fügen Sie den richtigen Speicherort zu .gitignore hinzu und fügen Sie alles andere, was mit der Konfiguration zu tun hat, zu .gitignore hinzu (also den einzigen Das, was eingecheckt wird, ist config.default.
Schreiben Sie außerdem ein Schnellinstallationsskript, mit dem die Symlinks für Ihre gesamte Anwendung eingerichtet werden.
Bei einem früheren Unternehmen haben wir einen ähnlichen Ansatz gewählt. Das Installationsskript erkannte automatisch, in welcher Umgebung Sie ausgeführt wurden (Sandbox, Entwicklung, Qualitätssicherung, Produktion) und tat automatisch das Richtige. Wenn Sie eine config.sandbox-Datei hätten und von der Sandbox aus ausgeführt würden, würde dies verknüpft (andernfalls würde nur die .defaults-Datei verknüpft). Das übliche Verfahren bestand darin, .defaults zu kopieren und die Einstellungen nach Bedarf zu ändern.
Das Schreiben des Installationsskripts ist einfacher als Sie sich vorstellen können und bietet Ihnen viel Flexibilität.
quelle
Ich stimme der besten Antwort zu, möchte aber auch etwas hinzufügen. Ich verwende ein ANT-Skript, um Dateien aus dem GIT-Repo zu entfernen und zu ändern, sodass ich sicher bin, dass keine Produktionsdateien überschrieben werden. In ANT gibt es eine nette Option, um Java-Eigenschaftendateien zu ändern. Dies bedeutet, dass Sie Ihre lokalen Testvariablen in eine Eigenschaftendatei im Java-Stil einfügen und Code hinzufügen, um sie zu verarbeiten. Sie haben jedoch die Möglichkeit, die Erstellung Ihrer Site zu automatisieren, bevor Sie sie online per FTP übertragen. Normalerweise fügen Sie Ihre Produktionsinformationen in die Datei site.default.properties ein und lassen ANT die Einstellungen verwalten. Ihre lokalen Einstellungen befinden sich in den site.local.properties.
dann benutze es:
Ihre site.default.properties würde folgendermaßen aussehen:
und Ihre site.local.properties würden folgendermaßen aussehen (beachten Sie die unterschiedliche Umgebung und die aktivierten Module):
Und Ihre ANT-Anweisungen: ($ d {deploy} ist Ihr Bereitstellungszielverzeichnis)
quelle
Heutzutage (2019) verwende ich ENV-Vars zum Beispiel in Python / Django. Sie können ihnen auch Standardeinstellungen hinzufügen. Im Kontext von Docker kann ich die ENV-Variablen in einer Datei docker-compose.yml oder einer zusätzlichen Datei speichern, die in der Versionskontrolle ignoriert wird.
quelle
Die einfachste Lösung besteht darin, die Datei auf die Standardeinstellungen zu bearbeiten, sie festzuschreiben und dann zu Ihrer Datei hinzuzufügen
.gitignore
. Auf diese Weise werden Entwickler es nicht versehentlich festschreibengit commit -a
, aber sie können es dennoch in dem (vermutlich seltenen) Fall festschreiben, mit dem Sie Ihre Standardeinstellungen ändern möchtengit add --force
.Allerdings ist eine mit
.default
und.local
Datei config ist letztlich die beste Lösung, da dies jemand mit einer maschinenspezifische Konfiguration ermöglicht die Standardeinstellung zu ändern, ohne dass sie ihre eigene Konfiguration zu brechen.quelle
.gitignore
Änderungen weiterhin nachverfolgt.Ich mache es so, wie es hier mit Standard- und lokalen Konfigurationsdateien empfohlen wird. Um meine lokalen Konfigurationsdateien zu verwalten, die sich in den Projekten befinden
.gitignore
, habe ich ein Git-Repo erstellt~/settings
. Dort verwalte ich alle meine lokalen Einstellungen aus allen Projekten. Sie erstellen beispielsweise einen Ordnerproject1
in~/settings
und legen alle lokalen Konfigurationsdaten für dieses Projekt darin ab. Danach können Sie diese Dateien / Ordner mit Ihrem Symlink verknüpfenproject1
.Mit diesem Ansatz können Sie Ihre lokalen Konfigurationsdateien verfolgen und nicht in das normale Quellcode-Repository stellen.
quelle
Aufbauend auf der Antwort von @Greg Hewgill können Sie Ihren lokalen Änderungen ein bestimmtes Commit hinzufügen und es als localchange kennzeichnen:
Fügen Sie dann die Commits Ihrer Funktion hinzu. Nach Abschluss der Arbeit können Sie diesen Zweig ohne das lokale Änderungs-Commit wieder zum Master zusammenführen, indem Sie Folgendes tun:
Diese Befehle werden:
1) Setzen Sie Ihren Feature-Zweig auf Master um und ignorieren Sie das Localchange-Commit. 2) Schneller Vorlauf des Masters, ohne den Feature-Zweig zu verlassen. 3) Fügen Sie das Localchange-Commit wieder oben im Feature-Zweig hinzu, damit Sie weiter daran arbeiten können. Sie können dies für jeden anderen Zweig tun, an dem Sie weiterarbeiten möchten. 4) Setzen Sie das localchange-Tag auf dieses von Kirschen ausgewählte Commit zurück, damit wir es
rebase --onto
auf die gleiche Weise wieder verwenden können.Dies soll nicht die akzeptierte Antwort als beste allgemeine Lösung ersetzen, sondern als eine Möglichkeit, über das Problem hinauszudenken. Sie vermeiden grundsätzlich versehentlich lokale Änderungen an Master Verschmelzung von nur von Rebasing
localchange
zufeature
und schnellen Vorlauf - Master.quelle