2010-09-16 11 views
40

Wir haben eine Website, die alle ihre PHP/HTML/JS/CSS/etc-Dateien in einem Git-Repository gespeichert hat.Git Push-to-Live-Server

Wir haben derzeit 3 ​​Arten von Computern (oder Anwendungsfälle) für das Repository.

  • Lokale Entwickler: neueste Änderungen ziehen, Änderungen vornehmen zu lokaler Repo verpflichten, Push-to-Master-Server
  • Master-Server: zentrales Repository, erhalten alle Änderungen an den Master-Server
  • Web-Server geschoben: Änderungen sind vom Master-Server nach unten gezogen, wenn die Website

So zur Zeit den Einsatz wir:

local: git push origin master 
local: password: ******** 
local: ssh [email protected] 
webserver: password: ******** 
webserver: cd ~/domain.com/ 
webserver: git pull origin master 

Meine Frage ist also: Gibt es einen Weg, den ich von meinem lokalen Computer direkt auf den Webserver schieben kann?

dh.

local: git push origin master 
local: password: ******** 
local: git push webserver master 
local: password: ******** 
+0

möglich Duplikat [Bereitstellen eines Projekts mit Git Push ] (http://stackoverflow.com/questions/279169/deploy-a-project-using-git-push). Eine gute Möglichkeit ist [git config receive.denyCurrentBranch updateInstead] (http://stackoverflow.com/a/28381235/895245) auf der Fernbedienung. –

Antwort

10

Blick auf die git urls Teil http://www.kernel.org/pub/software/scm/git/docs/v1.6.0.6/git-push.html

so würden Sie versuchen:

git push ssh://[email protected]/~admin/domain.com/ master 

ZUSÄTZLICH: Ich denke, ein Teil von dem, was Sie fordern, wie mehrere Remote-Repositories haben .

git remote add webserver ssh://[email protected]/~admin/domain.com/ 

, die Sie ausführen können:

git push origin master 
    git push webserver master 
+1

Das Problem ist, dass Push und Pull nicht austauschbar sind. Wenn Sie zu einem Repo wechseln, wird der Arbeitszweig nicht geändert. – cmcginty

+0

@Casey, wenn Sie die Frage lesen, fragt er nur, wie man drückt, er erwähnt nicht, den Arbeitsbaum zu aktualisieren. Sie haben wahrscheinlich recht, was er vorhat, aber die Abstimmung nach unten scheint ein bisschen hart zu sein, um seine Frage bare Münze zu nehmen. –

+0

In der Frage ist sein aktueller Workflow "git pull origin master" – cmcginty

4

Ich denke, die Funktion die Sie suchen, hier beschrieben wird: http://debuggable.com/posts/git-tip-auto-update-working-tree-via-post-receive-hook:49551efe-6414-4e86-aec6-544f4834cda3

Von local Sie den Webserver als Remote hinzufügen können, wie Sie würden jeden anderen tun:

git remote add webserver [email protected]:/path/to/repo.git/ 
# push only master branch by default 
git config remote.webserver.push master 

Jetzt, wenn Sie lesen y drücken Sie können einfach tun:

git push webserver 
33

Ja, Sie drücken direkt auf Ihren Webserver kann, aber ich würde es nicht empfehlen, da Sie nur auf Repositorys geklont mit dem --bare Argument schieben sollte. Ich würde das Git-Hook-System verwenden, damit das Haupt-Repository das Repo auf dem Webserver automatisch aktualisiert. Schauen Sie sich die Post-Update Haken in:

http://git-scm.com/docs/githooks

Dieses Skript könnte wiederum die Anmeldung am Web-Server via ssh und tun

cd ~/domain.com/ 
git checkout master 
git pull origin master 

So kann man nur darauf konzentrieren, müssen drängen zum zentralen Server und müssen sich nicht um den Webserver kümmern, wird es immer aktualisiert, sobald ein Druck gemacht worden ist.Wenn Sie etwas automatisieren können, dann automatisieren Sie es :)

Ich fand sogar einen netten Artikel über Sie über ssh in einem Skript anmelden (wenn Sie ein Passwort verwenden müssen, ist dies trivial, wenn ein SSH-Schlüssel eingerichtet wurde) :

http://bash.cyberciti.biz/security/expect-ssh-login-script/

hoffe, das hilft!

28

Ich hatte die gleiche Abfrage und nicht mit der derzeit am besten bewerteten Antwort zufrieden, endete nach git-website-howto, die den Prozess ziemlich gut umreißt und IMO ist ein viel sauberer und schneller Ansatz.

TL; DR, git init --bare um ein neues Repo auf Ihrem Webserver zu erstellen, wo Sie Ihre Änderungen von Ihrem Dev-Computer übertragen werden. Wenn das Web-Repo Ihre Änderungen empfängt, wird der Post-Receive-Hook ausgelöst, der die Dateien dann in Ihren Web-Root kopiert.

Ich mag diesen Ansatz, weil der Post-Receive-Hook die Arbeit auf Ihrem Server erledigt, damit Ihre lokale Maschine viel schneller pushen und sich befreien kann. Dies macht es auch sehr einfach, das Remote-Tracking für einen bestimmten Zweig einzurichten. Du könntest also einen Zweig namens production haben, um deinen Webserver zu aktualisieren, während dein Master weiterhin für die Entwicklung und den Link zu deinem Git Repo woanders ist.

Hinweis: Sie müssen git config receive.denycurrentbranch ignore auf Ihrem Webserver-Repo ausführen, um eine Warnung auf Ihrer lokalen Dev-Box zu unterdrücken, wenn Sie drücken.

+0

das howto hat super funktioniert für mich. Da ich in einem Verzeichnis des Servers zu einem anderen gearbeitet habe, musste ich einen Benutzer in der 'post-receive'-Datei sudo machen. 'sudo -u -H sh -c" GIT_WORK_TREE =/pfad/zu/live git checkout -f "' –

0

Überprüfen Sie vor dem Bereitstellen der lokalen Änderungen, ob sich auf dem Zielserver etwas geändert hat.

zu Deployment-Skript hinzufügen nichts um sicherzustellen, dass auf dem Server geändert:

$ git ls-files -dmo --exclude-standard 

leer sein wird, wenn es unverändert Dateien sind einfacher als git status Parsen