22 Stimmen

Wie man einen Verteilungszweig in Git realisiert

Ich verwende Git für ein PHP-Projekt, ich finde es sehr praktisch. Es gibt eine Sache, die großartig wäre, wenn ich es zum Laufen bekomme.

Ich habe einen Zweig erstellt, der für die Bereitstellung gedacht ist. Er hat einige Unterschiede, wie unterschiedliche Konfigurationsdateien und Dokumentation.

Ich kann sie nicht einfach ignorieren, denn dann bleiben sie in beiden Zweigen, während ich sie gerne in beiden Zweigen unterschiedlich halten würde.

Das Problem ist, dass beim Zusammenführen der Zweige auch die Dateien zusammengeführt werden, die anders sein sollen.

Gibt es eine bequeme Möglichkeit, so etwas zu erreichen? Wie wird das normalerweise gemacht?

1voto

Tim Abell Punkte 10006

Ich habe bereits Patch-Dateien erwähnt. Ich bin jetzt davon abgekommen und pflege stattdessen Entwicklungszweige.

D.h. ich verzweige von master mit einem neuen Zweig namens 'master-deployed' und nehme Änderungen an diesem Zweig vor, die ich nur in der Testversion auf dem Build-Server benötige (z.B. Hinzufügen einer Warnung, dass dies nicht die Live-Version ist, und eines anderen Datenbank-Servers in web.config).

Wenn der Build-Server die Bleeding-Edge-Version erstellt, prüft er master-deployed und stellt es auf origin/master um, bevor er den üblichen Build durchführt. Wenn niemand irgendwelche widersprüchlichen Änderungen vorgenommen hat, ist alles in Ordnung. Falls doch, kann ich mir nicht vorstellen, dass ein System dies ohne manuellen Eingriff bewältigen kann.

Das Gleiche gilt für die Spitze von qa, die einen Zweig 'qa-deployed' hat.

Ich verwende das --onto Flag, um sicherzustellen, dass, wenn ein ganzer Zweig neu geschrieben wird, der Patch nicht alle alten Commits mitnimmt.

Auf dem Build-Server sieht der QA-Build also etwa so aus

git reset --hard
git clean -xfd
git checkout -f qa-deployed
git rebase --onto qa HEAD^ qa-deployed
build-script

1voto

apinstein Punkte 4895

Ich hatte ein ähnliches Problem und habe ein kleines Projekt namens config-magic erstellt, um dieses Problem zu lösen.

Mit Config-magic können Sie Vorlagen für Conf-Dateien erstellen und dann Datenprofile für Dev/Taging/Production. Sie führen dann "cfg dev" aus, um die "dev"-Konfigurationsdateien zu erzeugen, "cfg staging", um die Staging-Konfiguration zu erzeugen, usw.

Ich habe dann diese mit Skripten verdrahtet, so dass, wenn ich bereitstellen, um Staging, ich lokal ausführen "cfg Staging" dann scp über alle Konfigurationsdateien nach der Aktualisierung der Codebase von Git.

Die "eigentlichen" Konfigurationsdateien werden von Git ignoriert. Das hat bei mir bisher sehr gut funktioniert.

https://github.com/apinstein/config-magic/tree

1voto

kzap Punkte 1301

Ich habe über all diese Lösungen für meine Situation nachgedacht, aber keine von ihnen scheint zuzutreffen. Ich bearbeite sowohl auf meinen Live- als auch auf meinen Entwicklungsservern. Rebase funktioniert gut, wenn Sie den Zweig nicht neu veröffentlichen müssen, aber ich nehme Änderungen an meinem Entwicklungszweig vor und veröffentliche diese zurück im Hauptrepository. Die Submodul-Methode funktioniert nur, wenn die Dateien in einem separaten Unterverzeichnis liegen, meine Konfigurationsdateien befinden sich an mehreren Stellen. Die "merge ours"-Methode würde auch nicht so gut funktionieren, da ich zuerst diesen Zweig und dann den großen Zweig ziehen müsste. Vielleicht würde es funktionieren, wenn es noch einen merge theirs-Zweig gäbe und ich bei Bedarf den richtigen Konfigurationszweig ziehen könnte. Im Moment funktioniert ein .gitignore und ich lade die Dateien einfach manuell hoch.

Nachdem ich mehr Forschung habe ich meine Lösung gefunden, um nicht ein Git Repo auf der Live-Site, sondern verwenden Sie eine Staging-Site, um die neuesten Änderungen in meinem Zweig mit der Staging/Live-Konfigurationsdateien zu ziehen. und dann durch Git-Archiv und Extrahieren der Dateien auf meine Live-Site bereitstellen.

1voto

David Punkte 11

Cherry-pick scheint in diesem Fall zu funktionieren (auf Kosten der Verschmutzung der Protokolle ein wenig).

git checkout -b testing Änderungen vornehmen und übertragen git checkout master git checkout -b deploy Änderungen vornehmen und übertragen git checkout master

alles unter Kontrolle haben und git cherry-pick testing oder git cherry-pick deploy, um die Diffs anzuwenden, die für den Wechsel vom aktuellen System zur Test- oder Einsatzversion erforderlich sind.

0voto

Tim Abell Punkte 10006

Derzeit habe ich einige Patch-Dateien eingecheckt, und der Build-Server wendet diese Patches für die entsprechenden Versionen an. Allerdings habe ich im Moment Zweifel daran

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X