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?

12voto

VonC Punkte 1117238

Update Feb. 2021: Git selbst ist immer noch nicht gut geeignet, aber GitHub Action-Umgebung könnte helfen .

2009: Ich bin mir nicht sicher, ob Git für diese Art der Verwendung gedacht ist.

Zunächst eine kurze Linus-Ratschläge , immer "bunt" und informativ ;)

Git très verfolgt grundsätzlich den Projektstatus, nicht den Dateistatus. Das bedeutet, dass Sie auf keinen Fall versuchen können, eine Datei zusammenzuführen. Es ist eine sinnlose Operation in Git, und in der Tat ist jedes SCM, das dies erlaubt, dazu verdammt, ein totales Stück Scheiße zu sein (*).

(*) Und das sage ich nicht nur, weil Git das nicht tut. Es ist viel grundlegender als das. Sobald man anfängt, pro Datei zu verzweigen und zusammenzuführen, hat man sich im Grunde selbst in die Pfanne gehauen und wird nie mehr in der Lage sein, an dem Projekt als "ganzes Projekt" zu arbeiten - man hat keine wohldefinierte Geschichte mehr, die tatsächlich die Geschichte des ganzen Projekts ist.


Dort.

Das heißt, Sie könnten:

  • diese Konfigurations-/Doku-Dateien in einem separaten Git-Unterprojekt verwalten (Anmerkung: die Die Verwendung von Untermodulen wurde hier erörtert )
  • oder eine teilweise Zusammenführung aufzeichnen (mit der Strategie "unsere" für Dateien, die wir nicht zusammenführen wollen), dann --ändern.

Andere Lösungen in diesem Thread beinhalten die Arbeit an einer "serverspezifischen" Verzweigung auf Ihrem Bereitstellungsserver

Development        Deployment

#origin/master:
x--x               $ git clone

                   # master
                   x--x

                   $ git checkout -b deployment origin/master

                   x--x
                       \ 
                        -- #deployment

                   $ .... #makes changes for config files
                          #or other specific deployment files

                   x--x
                       \
                        --d1--d2 # no need to push that branch ever.

#new developments
x--x--x--x

                   $ git pull --rebase #pull origin/master and 
                                       #replay current branch on top of it
                   x--x--x--x
                             \
                              --d1'--d2' #SHA1 rewritten in deployment branch
                                         #not important since this branch 
                                         #is not pushed (published)

5voto

elliot42 Punkte 3536

Ich mache ein paar dumme Tricks wie:

  • Die Anwendung soll die Datei lesen config
  • hinzufügen config.development y config.production aber nicht config zum Repository
  • Ihr Bereitstellungsskript soll nicht nur das Repository klonen, sondern auch cp config.production config

Ergibt das einen Sinn?

Für mich funktioniert es gut.

5voto

arbales Punkte 5205

Das funktioniert bei mir, und ich nehme nur geringfügige Konfigurationsänderungen für die Bereitstellung vor (3 Zeilen in den Konfigurationsdateien).

  1. Klonen Sie Ihr Repository von GitHub oder wo immer Sie es aufbewahren. dorthin, wo Sie es bereitstellen möchten.

  2. ausführen. git checkout -b deployment origin/master .

  3. Nehmen Sie Ihre Änderungen vor (und verschieben Sie sie, wenn Sie möchten).

  4. Wann immer Ihr Master (oder der Zweig, von dem aus Sie die Verteilung vorgenommen haben) Änderungen enthält, die Sie verteilen möchten, können Sie einfach git pull --rebase .

Es ist eine einfache Lösung, die bei mir funktioniert. Ich kann nicht sagen, ob es dadurch "scheiße" wird, wie andere behaupten, aber für unsere Zwecke ist es sicherlich sehr nützlich.

3voto

Keltia Punkte 14251

Die schnelle Antwort lautet: Führen Sie die Zweige niemals zusammen. Tatsächlich müssen Sie sie überhaupt nicht zusammenführen, sondern nur von der Entwicklung (auch bekannt als "Master") zur Bereitstellung zusammenführen, um Korrekturen und allgemeine Änderungen zusammenzuführen.

3voto

Pieter Punkte 3950

Wenn Sie Ihre Historie übersichtlich halten wollen, können Sie die Deployment-Dateien in einigen Commits über Ihrem sauberen Zweig aufbewahren. Wenn es dann an der Zeit ist, eine neue Version bereitzustellen, checken Sie den Bereitstellungszweig aus und "git rebase master", um diese Commits über den ursprünglichen Zweig zu legen.

Auf diese Weise können Sie auch einfach Änderungen an den Konfigurationsdateien vornehmen und den obersten Commit mit "git commit --amend" ändern.

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