Ist es möglich, eine Website mit bereitzustellen git push
? Ich habe eine Ahnung, dass es etwas mit der Verwendung von Git-Hooks zu tun hat , um eine git reset --hard
auf der Serverseite durchzuführen , aber wie würde ich vorgehen, um dies zu erreichen?
git
deployment
webserver
githooks
Kyle Cronin
quelle
quelle
Antworten:
Ich habe dieses Skript auf dieser Seite gefunden und es scheint ziemlich gut zu funktionieren.
Ändern Sie auf Ihrer lokalen Kopie Ihre .git / config-Datei und fügen Sie Ihren Webserver als Remote hinzu:
Ersetzen Sie auf dem Server .git / hooks / post-update durch diese Datei (in der Antwort unten).
Fügen Sie den Ausführungszugriff auf die Datei hinzu (erneut auf dem Server):
Drücken Sie jetzt einfach lokal auf Ihren Webserver und die Arbeitskopie sollte automatisch aktualisiert werden:
quelle
Verwenden Sie die folgende Post-Update- Datei:
Ändern Sie auf Ihrer lokalen Kopie Ihre .git / config-Datei und fügen Sie Ihren Webserver als Remote hinzu:
Ersetzen Sie auf dem Server .git / hooks / post-update durch die folgende Datei
Fügen Sie den Ausführungszugriff auf die Datei hinzu (erneut auf dem Server):
Drücken Sie jetzt einfach lokal auf Ihren Webserver und die Arbeitskopie sollte automatisch aktualisiert werden:
quelle
Nach vielen Fehlstarts und Sackgassen kann ich dank dieses Artikels endlich Website-Code mit nur "git push remote " bereitstellen .
Das Post-Update-Skript des Autors ist nur eine Zeile lang und seine Lösung erfordert keine .htaccess-Konfiguration, um das Git-Repo wie einige andere auszublenden.
Ein paar Stolpersteine, wenn Sie dies auf einer Amazon EC2-Instanz bereitstellen.
1) Wenn Sie sudo verwenden, um das reine Ziel-Repository zu erstellen, müssen Sie den Eigentümer des Repos in ec2-user ändern, da sonst der Push fehlschlägt. (Versuchen Sie "chown ec2-user: ec2-user repo ".)
2) Der Push schlägt fehl, wenn Sie den Speicherort Ihres amazon-private-key .pem nicht vorkonfigurieren, entweder in / etc / ssh / ssh_config als IdentityFile-Parameter oder in ~ / .ssh / config mit "[ Host] - Hostname - IdentityFile - Benutzer "Layout hier beschrieben ...
... JEDOCH, wenn Host in ~ / .ssh / config konfiguriert ist und sich von HostName unterscheidet, schlägt der Git-Push fehl. (Das ist wahrscheinlich ein Git-Bug)
quelle
Installieren Sie git nicht auf einem Server und kopieren Sie den .git-Ordner dort nicht. Um einen Server von einem Git-Klon zu aktualisieren, können Sie den folgenden Befehl verwenden:
Möglicherweise müssen Sie Dateien löschen, die aus dem Projekt entfernt wurden.
Dadurch werden alle eingecheckten Dateien kopiert. rsync verwendet ssh, das sowieso auf einem Server installiert ist.
Je weniger Software Sie auf einem Server installiert haben, desto sicherer ist er und desto einfacher ist es, die Konfiguration zu verwalten und zu dokumentieren. Es ist auch nicht erforderlich, einen vollständigen Git-Klon auf dem Server zu behalten. es macht es nur komplexer, alles richtig zu sichern.
quelle
Im Wesentlichen müssen Sie nur Folgendes tun:
Ich habe diese Zeilen in meiner Anwendung als ausführbare Datei aufgerufen
deploy
.Wenn ich also eine Bereitstellung durchführen möchte, gebe ich ein
./deploy myserver mybranch
.quelle
ssh -A ...
git pull
sollte für automatisierte Bereitstellungen vermieden werden, da der Zusammenführungsteil bei Konflikten eine manuelle Bereinigung erfordern kann.So wie ich es mache, habe ich ein nacktes Git-Repository auf meinem Bereitstellungsserver, auf dem ich Änderungen pushe. Dann melde ich mich beim Bereitstellungsserver an, wechsle zum eigentlichen Verzeichnis der Webserver-Dokumente und mache einen Git-Pull. Ich benutze keine Haken, um dies automatisch zu versuchen, das scheint mehr Ärger zu sein, als es wert ist.
quelle
git reset
zwischen den neuesten Änderungen zurückkehren (alle Festschreibungen, nicht nur der gesamte Pull). Wenn Sie etwas Bestimmtes zurücksetzen müssen, das nicht das letzte Commit ist, können Sie es verwendengit revert
, das jedoch wahrscheinlich nur in Notfällen verwendet werden sollte (git revert
erstellt ein neues Commit, das die Auswirkungen eines vorherigen Commits rückgängig macht).git config --local receive.denyCurrentBranch updateInstead
In Git 2.3 hinzugefügt, könnte dies eine gute Möglichkeit sein: https://github.com/git/git/blob/v2.3.0/Documentation/config.txt#L2155
Sie legen es im Server-Repository fest und es aktualisiert auch den Arbeitsbaum, wenn er sauber ist.
In 2.4 wurden weitere Verbesserungen hinsichtlich des
push-to-checkout
Hakens und der Handhabung ungeborener Äste vorgenommen .Beispielnutzung:
Ausgabe:
Dies hat die folgenden Mängel, die in der GitHub-Ankündigung erwähnt werden :
Aber all diese Punkte liegen außerhalb des Geltungsbereichs von Git und müssen durch externen Code erledigt werden. In diesem Sinne ist dies zusammen mit Git-Hooks die ultimative Lösung.
quelle
Update: Ich verwende jetzt die Lloyd Moore- Lösung mit dem Schlüsselagenten
ssh -A ...
. Das Drücken auf ein Haupt-Repo und das parallele Ziehen von allen Ihren Maschinen ist etwas schneller und erfordert weniger Setup auf diesen Maschinen.Ich sehe diese Lösung hier nicht. Drücken Sie einfach über SSH, wenn Git auf dem Server installiert ist.
Sie benötigen den folgenden Eintrag in Ihrer lokalen .git / config
Aber hey, womit ist das
amazon:
? In Ihrer lokalen ~ / .ssh / config müssen Sie den folgenden Eintrag hinzufügen:Jetzt können Sie anrufen
(Übrigens: /path/to/project.git unterscheidet sich vom tatsächlichen Arbeitsverzeichnis / path / to / project)
quelle
Für das Bereitstellungsszenario
In unserem Szenario speichern wir den Code auf github / bitbucket und möchten ihn auf Live-Servern bereitstellen. In diesem Fall funktioniert die folgende Kombination für uns (das ist ein Remix der hoch bewerteten Antworten hier) :
.git
Verzeichnis auf Ihren Webservergit remote add live ssh://user@host:port/folder
git config receive.denyCurrentBranch ignore
Auf der Fernbedienung:
nano .git/hooks/post-receive
und fügen Sie diesen Inhalt hinzu:#!/bin/sh GIT_WORK_TREE=/var/www/vhosts/example.org git checkout -f
Auf der Fernbedienung:
chmod +x .git/hooks/post-receive
git push live
Anmerkungen
Wenn sich Ihr
.git
Ordner im Dokumentstamm befindet, stellen Sie sicher, dass Sie ihn von außen ausblenden, indem Sie ihn zu.htaccess
( Quelle ) hinzufügen :RedirectMatch 404 /\..*$
quelle
Wir verwenden Capistrano für die Verwaltung der Bereitstellung. Wir erstellen capistrano für die Bereitstellung auf einem Staging-Server und führen dann eine rsync mit allen unseren Servern aus.
Mit capistrano können wir im Fehlerfall ein einfaches Rollback durchführen
quelle
Giddyup sind sprachunabhängige Just-Add-Water Git-Hooks, die um die Bereitstellung per Git-Push zu automatisieren. Außerdem können Sie benutzerdefinierte Start / Stopp-Hooks zum Neustarten des Webservers, zum Aufwärmen des Caches usw. verwenden.
https://github.com/mpalmer/giddyup
Schauen Sie sich Beispiele an .
quelle
Klingt so, als ob Sie zwei Kopien auf Ihrem Server haben sollten. Eine bloße Kopie, von der Sie pushen / ziehen können, von der Sie Ihre Änderungen pushen würden, wenn Sie fertig sind, und die Sie dann in Ihr Webverzeichnis klonen und einen Cronjob einrichten würden, um Git Pull jeden Tag oder aus Ihrem Webverzeichnis zu aktualisieren damit.
quelle
Es ist denkbar, dass Sie einen Git-Hook einrichten, der die Änderungen abruft und auf die PHP-Site anwendet, wenn beispielsweise ein Commit für den "stabilen" Zweig ausgeführt wird. Der große Nachteil ist, dass Sie nicht viel Kontrolle haben, wenn etwas schief geht, und dass dies mehr Zeit für Ihre Tests benötigt. Sie können sich jedoch ein Bild davon machen, wie viel Arbeit erforderlich ist, wenn Sie Ihren Stammzweig in den stabilen Zweig zusammenführen, um dies zu wissen Wie viele Konflikte können auftreten ? Es ist wichtig, alle standortspezifischen Dateien (z. B. Konfigurationsdateien) im Auge zu behalten, es sei denn, Sie möchten nur die eine Site ausführen.
Haben Sie alternativ versucht, die Änderung stattdessen auf die Website zu übertragen?
Informationen zu Git-Hooks finden Sie in der Dokumentation zu Githooks .
quelle
Meine Einstellung zur Lösung der Christen .
quelle
Ich verwende die folgende Lösung von toroid.org , die ein einfacheres Hook-Skript hat.
auf dem Server:
und installieren Sie den Hook auf dem Server:
auf Ihrem Kunden:
Zum Veröffentlichen geben Sie einfach ein
Eine vollständige Beschreibung finden Sie auf der Website: http://toroid.org/ams/git-website-howto
quelle
git push web +master:refs/heads/master
statt nurgit push web master
?Als ergänzende Antwort möchte ich eine Alternative anbieten. Ich benutze Git-FTP und es funktioniert gut.
https://github.com/git-ftp/git-ftp
Einfach zu bedienen, nur Typ:
und git lädt automatisch Projektdateien hoch.
Grüße
quelle
In einer Umgebung, in der mehrere Entwickler auf dasselbe Repository zugreifen, können die folgenden Richtlinien hilfreich sein.
Stellen Sie sicher, dass Sie eine Unix-Gruppe haben, zu der alle Entwickler gehören, und geben Sie dieser Gruppe das Eigentum am .git-Repository.
Setzen Sie in der .git / config des Server-Repositorys sharedrepository = true. (Dies weist git an, mehrere Benutzer zuzulassen, was für Commits und die Bereitstellung erforderlich ist.
Stellen Sie die Umask jedes Benutzers in seinen bashrc-Dateien auf gleich ein - 002 ist ein guter Anfang
quelle
Am Ende habe ich mein eigenes rudimentäres Bereitstellungstool erstellt, das automatisch neue Updates aus dem Repo abruft - https://github.com/jesalg/SlimJim - Grundsätzlich hört es auf den Github-Post-Receive-Hook und verwendet einen Proxy, um einen auszulösen Skript aktualisieren.
quelle
Ich verwende zwei Lösungen für den Post-Receive-Hook:
LÖSUNG VERWENDEN 1
LÖSUNG VERWENDEN 2
Beide Lösungen basieren auf früheren Lösungen, die in diesem Thread verfügbar sind.
Beachten Sie, dass BRANCH_REGEX = '^ $ {GIT_BRANCH1}. $ 'filtert nach den Zweignamen, die mit der Zeichenfolge "master " oder "dev *" übereinstimmen , und stellt den Arbeitsbaum bereit, wenn der gepusste Zweig übereinstimmt. Dies ermöglicht die Bereitstellung einer Entwicklungsversion und einer Masterversion an verschiedenen Orten.
DEPLOY SOLUTION 1 entfernt nur Dateien, die Teil des Repos sind und durch ein Commit entfernt wurden. Es ist schneller als Deployment Solution 2.
DEPLOY SOLUTION 2 hat den Vorteil, dass alle neuen Dateien aus dem Produktionsverzeichnis entfernt werden, das auf der Serverseite hinzugefügt wurde, unabhängig davon, ob sie dem Repo hinzugefügt wurden oder nicht. Es wird immer ein sauberer Betrüger des Repos sein. Es ist langsamer als Deployment Solution 1.
quelle