Archiv der Kategorie: git

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)

Git: Python mit pycodestyle als pre-commit hook

Python Skripe können über das Pythonmodul pycodestyle vor dem Commit auf syntaktische Fehler geprüft werden.

Dazu muss pycodestyle (Nachfolger von pep8) installiert sein:
python -m pip install pycodestyle

Danach kann im .git-Verzeichnis der pre-commit hook angelegt werden:

.git/hooks/pre-commit:

#!/bin/sh
FILES=$(git diff --cached --name-only --diff-filter=ACMR)
python -m pycodestyle ${FILES}

Damit würde im Fall eines Fehlers der Commit NICHT durchgeführt werden.Der diff-filter-Parameter greift bei folgenden Typen:

Der diff-filter – Parameter greift bei folgenden Typen:

  • A=Added (hinzugefügt)
  • C=Copied (kopiert)
  • M=Modified (geändert)
  • R=Renamed (umbenannt)

Git: Stashes löschen und alle löschen

Änderungen, die später aufgegriffen werden sollen, aber noch nicht in einen Commit wandern, die kann man mit „git stash“ erst einmal zwischenspeichern. Oft wird danach ein „git pull“ ausgeführt und vielleicht die Änderung mit „git stash apply“ wieder zurückgeholt.

Will man den stash löschen, geht das via „git stash drop“. Will man alle Stash-Einträge löschen: „git stash clear“.

Git: Kaputtes Repo neu aufbauen/reparieren

Defektes Filesystem und git pull funktioniert nicht richtig? Dann kann das Repo kaputt sein (Bezug zu parent-Einträgen nicht mehr möglich oder …) Ein meinem Fall kam nach einem git pull der ominöse Hinweis, dass das Repo aus Performance-Gründen optimiert werden sollte. Ein git gc brachte dann Fehlermeldungen. Das Repo war beschädigt.

mv -v .git .git_old &&            # (1)
git init &&                       # (2)
git remote add origin "git@gitlab.infosys.de:etacs/etacs_production.git" && # (3)
git fetch &&                      # (4)
git reset origin/master --mixed   # (5)
git pull                          # (6)
git branch --set-upstream-to=origin/master master # (7)
  1. Altes Repo sichern
  2. Neues Repo initialisieren
  3. Repo mit Remote-Repo verbinden (die URL steht in .git/config – oder nach Sichern .git_old/config))
  4. Repo aktualisieren
  5. Master Branch resetten
  6. Inhalte runterladen (wenn Git sich jetzt beschwert, dann den Upstream setzen -> 7)
  7. Upstream setzen

Apache: Git-Ordner und Dateien mit führendem Punkt nicht anzeigen

Deploy eines Projektes via Git (git pull) hinterlässt den .git-Ordner, der ungewollt viele Informationen preisgeben kann. Ebenso Dateien mit führendem Punkt, die als Temporär-Datei oder Config-Datei sensible Informationen enthalten können.
Um das zu vermeiden folgendes Snippet für die apache2.conf:

<Directorymatch "^/.*/\.git/">
    Order deny,allow
    Deny from all
</Directorymatch>
<FilesMatch "^\.">
    Order allow,deny
    Deny from all
</FilesMatch>
<FilesMatch "(^#.*#|\.(bak|conf|dist|fla|in[ci]|log|orig|psd|sh|sql|sw[op])|~)$">
    Order allow,deny
    Deny from all
</FilesMatch>