Git Server-Konfiguration

Aus Thomas-Krenn-Wiki
Zur Navigation springen Zur Suche springen

Der folgende Artikel erklärt die Installation und Konfiguration eines Git-Servers für die Verwaltung eines Repos. Es wird dazu ein öffentliches Git-Repository geben, welches über http "geklont" (git clone) oder via gitweb durchforstet werden kann. Da auf dieses Repo nur lesend zugegriffen werden kann, dient es rein dazu, den Nutzern den aktuellen Stand der Applikation zur Verfügung zu stellen. Ein Entwickler kann jedoch - vorausgesetzt er besitzt am Server einen SSH-Zugang - die getätigten Änderungen seiner lokalen Working Copy ins öffentliche Repo pushen. Dadurch erhalten die Nutzer etwaige Aktualisierungen. Die in diesem Artikel gezeigten Beispiele und Konfigurationen wurden auf einem Debian-Server "squeeze" durchgeführt.

Installation

Im ersten Schritt werden am Server die Pakete git und gitweb installiert:

apt-get install git gitweb

Sollte ein Webserver noch nicht vorhanden sein, so wird bei der Installation von gitweb automatisch Apache installiert.

Einrichten des öffentlichen Repos

Es folgen nun die Konfigurations-Schritte, die nötig sind, um ein Repository über http freizugeben und via gitweb erreichen zu können. Im ersten Schritt wird ein Verzeichnis erstellt, in dem sich das Repo befindet. Da es sich um ein öffentliches Repo handeln soll, wird ein bare-Repository angelegt:

:~/repos$ mkdir repos/pub
:~/repos$ mkdir repos/pub/stable
:~/repos$ cd pub/stable/
:~/repos/pub/stable$ git --bare init
Initialized empty Git repository in /home/tktest/repos/pub/stable/
:~/repos/pub/stable$ ls
branches  config  description  HEAD  hooks  info  objects  refs

Wie oben in der Ausgabe des ls-Befehls ersichtlich gleicht ein bare-Repo nicht einer herkömmlichen Working-Copy. Die Dateien, die sich normalerweise im .git Ordner befinden, sind hier direkt ersichtlich. Die "normalen" Dateien jedoch (an denen gearbeitet wird) befinden sich nicht direkt im Repo, sind aber natürlich über die verwaltete Historie des Repos zugänglich. Bare-Repos sind speziell für die Veröffentlichung von Repos gedacht, da durch sie immer der letzte Stand des Repos geklont und in das Repo auch gefahrlos gepusht werden kann, da keine Working Copy vorhanden ist.[1][2]

Veröffentlichung über http

Im nächsten Schritt wird der Apache-Webserver so konfiguriert, dass das Verzeichnis des public-Repositories zugänglich wird. Daraufhin können alle, die mit dem aktuellen Stand des Repos arbeiten wollen, diesen über "git clone" auf die eigene Maschine holen. Zunächst wird ein eigener Vhost für Apache erstellt (für die Konfiguration von Apache werden root-Rechte benötigt):[3]

:~# vi /etc/apache2/sites-available/stable.conf

In dieser Datei wird der Zugriff auf das Verzeichnis des Repos geregelt. Da auf dem verwendeten Test-Server keine Host-Names konfiguriert sind, werden unterschiedliche Ports für die verschiedenen Dienste verwendet. Über den Port 81 kann anschließend auf das öffentliche Repo zugegriffen werden:

Listen 81
<VirtualHost *:81>
    Alias /stable "/home/tktest/repos/pub/stable"
    <Location stable>
        Allow from all
    </Location>
</VirtualHost>
Directory Listing des öffentlichen Repos "stable".

Anschließend wird die erstellte Webseite aktiviert und die Apache-Konfiguration neu geladen:

:~# a2ensite stable.conf
Enabling site stable.
Run '/etc/init.d/apache2 reload' to activate new configuration!
:~# /etc/init.d/apache2 reload

Nach diesen Konfigurations-Schritten ist das Repo bereits über http://SERVER-IP:81/stable im Web-Browser erreichbar (SERVER-IP muss entsprechend mit der konfigurierten IP des Web-Servers ersetzt werden). Da gitweb noch nicht konfiguriert wurde, erscheint ein einfaches Directory Listing im Browser (vlgl. Abbildung). Bevor dieses Verzeichnis jedoch über git geklont werden kann, muss noch der Befehl git update-server-info abgesetzt werden, der die Info-Dateien des Repos aktualisiert (im Verzeichnis des Repos "/home/tktest/repos/pub/stable" am Server):

git update-server-info

Um dieses Update nicht immer händisch durchführen zu müssen, gibt es sogenannte Hook-Scripts. Diese Skripte werden bei bestimmten Aktion automatisch ausgeführt. Im Ordner ".git/hooks" bringt git einige Beispiel-Scripts mit, die, wenn man sie umbenennt, aktiviert werden:

:~/repos/pub/stable$ cd hooks/
:~/repos/pub/stable/hooks$ mv post-update.sample post-update

Nach erfolgreicher Aktivierung wird der Update-Befehl jedes Mal automatisch ausgeführt, wenn neue Änderungen ins Repo gepusht wurden.

Konfiguration von gitweb

Gitweb bietet eine komfortable Web-Oberfläche für die Auflistung und Durchsuchung von Git-Repos. Für die Bereitstellung des Stable-Repos am Server, wird die zentrale Konfigurations-Datei

vi /etc/gitweb.conf

wie folgt editiert:

# path to git projects (<project>.git)
$projectroot = "/home/tktest/repos/pub";

Für den Apache Server wird wiederum ein eigener virtueller Host erstellt:

vi /etc/apache2/sites-available/gitweb

In dieser Datei wird der Zugriff von gitweb auf die Repos konfiguriert:

Listen 82
<VirtualHost *:82>
        DocumentRoot /var/cache/git
        SetEnv GITWEB_CONFIG /etc/gitweb.conf
        Alias /gitweb.css /usr/share/gitweb/gitweb.css
        Alias /gitweb.js /usr/share/gitweb/gitweb.js
        Alias /git-favicon.png /usr/share/gitweb/git-favicon.png
        Alias /git-logo.png /usr/share/gitweb/git-logo.png
        ScriptAlias /gitweb.cgi /usr/lib/cgi-bin/gitweb.cgi
        DirectoryIndex gitweb.cgi
</VirtualHost>

Im nächsten Schritt kann die Webseite wieder aktiviert und die Apache-Config neu geladen werden:

:~# a2ensite gitweb
:~# /etc/init.d/apache2 reload

Nach dem Aufruf des Web-Servers auf Port 82 erscheint die Oberfläche von gitweb:

Gitweb.png

Git über ssh

Der einfachste Weg um schreibend auf den Server vom Client aus zuzugreifen ist über SSH. Existiert am Server ein SSH-Zugang so kann direkt gepusht werden:

:~/Repos/stable$ touch erste_datei_im_repo
:~/Repos/stable$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	erste_datei_im_repo
nothing added to commit but untracked files present (use "git add" to track)
:~/Repos/stable$ git add erste_datei_im_repo
:~/Repos/stable$ git commit -m "Erste Datei ins Repo"
[master (root-commit) 4500243] Erste Datei ins Repo
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 erste_datei_im_repo
:~/Repos/stable$ git status
# On branch master
nothing to commit (working directory clean)
:~/Repos/stable$ git push ssh://tktest@SERVER-IP/home/tktest/repos/pub/stable master
tktest@SERVER-IP's password: 
Counting objects: 3, done.
Writing objects: 100% (3/3), 232 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://tktest@SERVER-IP/home/tktest/repos/pub/stable
 * [new branch]      master -> master

Mittels "git push" werden die Änderungen vom Repo am Client ins öffentliche Repo am Server gepusht. Die gitweb-Anzeige sollte daraufhin den Inhalt des Stable-Repos aktualisieren und nicht mehr leer sein. Was die oben angeführten Befehle im Detail bedeuten, wird im Artikel Git Grundbefehle genauer erläutert.

Einzelnachweise


Foto Georg Schönberger.jpg

Autor: Georg Schönberger

Georg Schönberger, Abteilung DevOps bei der XORTEX eBusiness GmbH, absolvierte an der FH OÖ am Campus Hagenberg sein Studium zum Bachelor Computer- und Mediensicherheit, Studium Master Sichere Informationssysteme. Seit 2015 ist Georg bei XORTEX beschäftigt und arbeitet sehr lösungsorientiert und hat keine Angst vor schwierigen Aufgaben. Zu seinen Hobbys zählt neben Linux auch Tennis, Klettern und Reisen.


Das könnte Sie auch interessieren

Git Commits mit rebase zusammenführen
Git-annex Archiv mit git-annex assistant
Git-annex Repository auf externer Festplatte