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:
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:
--bare
Git repo auf der Fernbedienung (damit ich von überall darauf zugreifen kann) master (HEAD)
scp -r
Kopiere den --bare
git Repo vom Remote-Server in meine Remote-Live-Domain stage.example.com
origin/stage
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.
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:
staging
") oder live (Zweig " live
") staging
oder den live
Zweig 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:
#!/usr/bin/env ruby
, 'git ...'
, wie in diesem Skript , 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), 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'
. Tags und Links git git-remote git-add git-push