Push-Git verzweigt sich direkt in ein Live-Server-Verzeichnis, so dass Dateien live gesehen werden

9

Wie kann ich Remote-Verzeichnisse in Git einrichten, wo ich lokal einen Stage-Zweig an die Remote-Station senden kann und die Live-Änderungen auf einem Staging-Server wie stage.example.com sehen kann?

Die Vorstellung, die ich habe (ein Teil davon, warum ich mich von SVN fortbewege) ist, dass ich (lokal) drei verschiedene Hauptzweige wie folgt beibehalten kann:

  • Master - verwendet für lokale Entwicklung, Arbeitsverzeichnis
  • stage - sollte synchron mit dem Staging-Server-Verzeichnis (remote) sein
  • live - dies sollte die öffentlich zugängliche Website (remote) sein

Die Idee, die ich habe (und was andere behaupten, ist möglich), ist, dass ich diese Remote- "Sites" von meinem lokalen Computer aus verwalten kann, ohne mich ständig in meine Remote-Server-Shell einloggen zu müssen und svn update (in meinem aktuellen svn-Workflow) auszuführen Ich muss dies die ganze Zeit tun ...) oder natürlich in meinem Git-Workflow git pull auf der Fernbedienung ausführen.

Wie kann ich die Remote-Verzeichnisse so einrichten, dass ich meinen stage -Zweig lokal an das staging remote server weitergeben kann und die Änderungen direkt auf (zum Beispiel) sehen kann stage.example.com ?

Dann, wenn die stage alles in Ordnung und getestet ist, wäre ich nur lokal in der Lage, push an die live remote, um diese Änderungen, die ich auf der stage getestet habe, auf der Live-Website vorzunehmen.

Kann das überhaupt gemacht werden oder bekomme ich hier verrückte Ideen, die einfach nicht mit Git gemacht werden sollen?

Falls dies wichtig ist, hier ein paar Statistiken über meine lokalen und Remote-Server:

%Vor%

Außerdem habe ich bisher erfolglos den folgenden Workflow versucht:

  1. Erstelle ein --bare Git repo auf der Fernbedienung (damit ich von überall darauf zugreifen kann)
  2. Klonen Sie dieses Remote Repo auf ein lokales Verzeichnis und verwenden Sie die Git Tower App, um es zu verwalten
  3. Arbeite lokal in master (HEAD)
  4. scp -r Kopiere den --bare git Repo vom Remote-Server in meine Remote-Live-Domain stage.example.com
  5. Fügen Sie remote der lokalen Arbeitskopie hinzu und versuchen Sie dann, zu origin/stage
  6. zu gelangen

Natürlich funktioniert das nicht, aber ich weiß nicht warum oder wie es besser geht.

Da ich aus einem SVN-Hintergrund komme, bin ich neu bei Git, habe aber schon viele Tutorials gesehen (Peepcode und ThinkVitamin) , kann aber immer noch nicht herausfinden, wie ich das einrichten soll.

    
Jannis 02.04.2011, 00:08
quelle

1 Antwort

4

Der einzige Gedanke, den man mit einem DVCS ("Distributed" VCS, wie Git oder Mercurial) realisieren sollte, ist, dass das Begriff der Veröffentlichung (Push / Pull) auf den Begriff der Verzweigung.
Ein CVCS ("Zentralisiertes" VCS, wie SVN) hat nur Verzweigungen (und ein zentrales Repo, um auf einen Server zu drücken).

In Ihrem Fall sind Staging oder Live Veröffentlichungsschritte, d. h. unterschiedliche Git Repos, die bereit sind, die Änderungen zu erhalten, die Sie im Staging oder in einer Live-Umgebung sehen möchten.

Das würde bedeuten:

Der Unterschied zwischen einem post-receive und einem post-update Hook besteht darin, dass die post-update one für jeden geänderten Zweig einmal ausgeführt wird:
Siehe " Git Hook, um verschiedene Web-Ordner zu aktualisieren, basierend auf dem Zweig, der an den Remote-Server gesendet wird " SO Frage.

Beim ersten Drücken wird ein " git push --all origin " ausgeführt und alle Zweige werden auf dem entfernten, leeren Repo erstellt.

Die Idee ist, dass kein Ziehen serverseitig beteiligt sein sollte: Nur ein git --work-tree=/path/to/your/live/files/ checkout live oder git --work-tree=/path/to/your/staging/files/ checkout staging , abhängig von den Parametern des Post-Update-Hooks: Sie checken nur die Dateien des bare Repos in diese Ordner 'auf dem Server.

Wenn Sie ein Ruby-Skript für Ihren Hook erstellen, stellen Sie sicher, dass:

  • Benutze den rechten Shebang : #!/usr/bin/env ruby ,
  • Umgeben Sie Ihren Git-Befehl mit Backtick sollte genug sein: 'git ...' , wie in diesem Skript ,
  • Verwenden Sie ENV['HOME'] , um das Homedir des aktuellen Benutzers in diesem Skript anzugeben, wenn Sie möchten, dass Befehle wie 'cd ~/stagedomain.com' oder '--work-tree=~/stagedomain.com' funktionieren (wobei '~' auf den richtigen Pfad gesetzt ist),
  • Wenn Sie git pull , unset GIT_DIR in derselben Zeile als die anderen Befehle ausgewählt haben wie in Ihrer anderen Frage : 'cd ~/stage.mydomain.com && unset GIT_DIR && git pull core stage' .
VonC 02.04.2011, 06:01
quelle

Tags und Links