Git: Deploy Repo auf Webserver ohne .git-Files

Wer sein Projekt in einem Git-Repository verwaltet, kann Git nutzen, um die Dateien via Git auf den Webserver zu übertragen. Wird ein einfaches „git clone“ genutzt, dann befinden sich die Meta-Dateien von Git auf dem Webserver (.git-Verzeichnis) und geben Hackern & Co. Angriffsvektoren.

Wer jetzt nicht Tools wie Jenkins etc einsetzen will, kann mit Git aber trotzdem ein sicheres Deployen ermöglichen. Dazu wird auf dem Webserver ein „bare“ Repo (nacktes Repo) angelegt und über einen post-receive-Hook festgelegt, wo die Dateien ausgecheckt werden sollen.

Lokaler Rechner = Workstation zum Entwickeln, Remote Server = Webserver, wo die Dateien ausgecheckt werden sollen (im DOCUMENT_ROOT).

Annahme: Das „bare“-Repo soll in einem Homeverzeichnis untergebracht werden (/home/user/production.git). Die Pfadendung .git soll hier anzeigen, dass sich in diesem Ordner das Repo befindet. Es könnte auch in einem Ordner ausserhalb des DOCUMENT_ROOT liegen (zB /var/repo). Der Webserver DOCUMENT_ROOT soll /var/www/production sein. Der Name des Webserver-Users ist „user“, die Gruppe „users“.

Remote (myserver.de):

$ mkdir production.git
$ cd production.git
$ git init --bare
$ cd hooks
$ nano post-receive

#!/bin/sh
git –work-tree=/var/www/production –git-dir=/home/user/production.git checkout -f master

Dateiinhalt: /home/user/production.git/hooks/post-receive
$ chmod +x post-receive
# Der Hook muss ausführbar sein.
$ mkdir  /var/www/production
$ chown -R user:users /var/www/production
# Das Verzeichnis muss von dem User beschrieben werden können.

Lokal (Workstation, mit existierendem Repo „production“):

$ cd /home/localuser/production
$ git remote add web ssh://myserver.de/home/user/production.git

„web“ ist in diesem Fall der frei gewählte Name des remote Repos. Mit „git push web master“ wird nun eine Änderung in den Master-Branch des „web“-Repos gepusht. D.h in myserver.de/home/user/production.git befinden sich die Dateien für Git (vergleichbar dem lokalen Ordner /home/localuser/production/.git/) – aber nicht die Verzeichnisstruktur für den Webserver. Diese Dateien werden nach dem Push über den Git-Hook „post-receive“ in den Work-Tree kopiert (/var/www/production)