Git Server einrichten Git Repositories gemeinsam nutzen
Sobald man im Team arbeitet, will man eigentlich immer gemeinsam an einem Datenbestand arbeiten. Git kann auf dem Server so eingerichtet werden, dass alle Team Mitglieder auf ein oder mehrere Repositories zugreifen können. Hier zeige ich auf, was am Server installiert und konfiguriert werden muss, damit diese Vorgehensweise funktioniert.
Was muss das Repository für Teamarbeit erfüllen?
- Zugriff von allen Team-Mitglieder sollte immer möglich sein
Ein Server muss zum Einsatz kommen, der 24h erreichbar ist. Dazu kann ein öffentlicher Server, ein firmen-interner Server verwendet werden. - Authentifizierung
Jedes Team-Mitglied benötigt eine eigene Kennung, damit nachvollziehbar ist, wer welche Änderungen durchgeführt hat. Zusätzlich ist es dadurch auch möglich den Zugriff auf das Repository nur für Team-Mitglieder freizugeben - alle anderen haben entweder gar keinen Zugriff oder nur Lesezugriff. - Ein zentraler Server
Git ist zwar ein dezentrales Versionierungssystem, aber was hält einen davon ab ein "Hauptrepository" zu bestimmen, welches gemeinsam von allen Team-Mitgliedern verwendet wird. Auf dieses Repository werden dann von allen Projektteilnehmern push und pull ausgeführt.

Server Konfiguration
Auf dem Server muss natürlich auch erst einmal Git installiert werden. Es gibt keine spezielle Version von Git für den Server (oder den Client), da jeder pull aus einem Repository das komplette Repository dupliziert, kann jedes Team-Mitglieder einen Server bereit stellen.
Hinweis: In der Beschreibung werde ich die Server Installation auf ein Debian System beziehen. Wird Ubuntu eingesetzt, muss man ein sudo vor den Anweisungen stellen, da diese Root-Rechte benötigen. Auch auf andere Linux Distributionen sollte die Anleitung leicht zu übertragen sein.
Für Debian:
Für Ubuntu:
Für Centos und Fedora:
Für Gentoo:
Die Python Setuptools werden für gitosis benötigt (siehe weiter unten).
Authentifizierung
Das bekannte Version Control System bietet mehrere Möglichkeiten zur Authentifizierung an:
- das eigene Git Protokoll - öffentlich (eigentlich keine Authentifizierung)
- Webserver Authentifizierung (Apache)
- SSH (Secure Shell)
Im folgenden wird die Authentifizierung über SSH beschrieben: Alle Teammitglieder werden auf ein Repository mit Schreibrechten Zugriff haben, alle anderen haben keinen Zugriff.
Wir setzen das Python Script gitosis für die Verwaltung der SSH Zugänge ein. Das besondere an gitosis ist, dass alle Zugänge nur einen einzigen Systemaccount benötigen. Ein Shell-Login über diesen globalen Account wird den Team-Mitgliedern auf dem Server selbst nicht möglich sein, sondern nur der Zugriff auf das GIT-Repository (dies wird über die command= Anweisung in der authorized_keys erreicht). Um dies zu bewerkstelligen verwendet gitosis einen genialen Trick: die Authentifizierung findet über den Namen des öffentlichen SSH Schlüssels statt. Jeder Benutzer sendet seinen öffentlichen Schlüssel an Verwalter des gemeinsamen Repositories. Die öffentlichen Schlüssel werden dann von gitosis automatisch in die Datei authorized_keys übernommen, welche den SSH Zugriff so für mehrere Benutzer möglich macht. Die Unterscheidung zwischen den einzelnen Mitgliedern wird über den Dateinamen des öffentlichen Schlüssels ermöglicht.
Zuerst holen wir uns den Quellcode mit:
git clone git://eagain.net/gitosis
Nun installiert man gitosis mit:
python setup.py install
Danach legen wir den Benutzer git an (es kann ein beliebiger Name sein; falls Du einen anderen verwenden willst, musst Du dies in der weiteren Anleitung berücksichtigen), über den alle Zugriff auf die GIT Repositories erfolgen:
--shell /bin/sh \
--gecos 'git version control' \
--ingroup 'www-data' \
--disabled-password \
--home /srv/git \
git
Es ist wichtig, dass ein Shell angegeben wird, da sonst der SSH Zugang nicht funktionieren wird. Als Gruppe wird hier www-data verwendet, damit auch die Verwendung von gitweb möglich ist. Will man gitweb nicht verwenden, sollte man den Benutzer mit folgendem Befehl anlegen:
--system
--shell /bin/sh \
--gecos 'git version control' \
--group \
--disabled-password \
--home /srv/git \
git
Das Home-Verzeichnis des Benutzers git ist /srv/git. Darin befinden sich alle SSH Schlüssel zur Authentifizierung und auch alle Repositories, die man verwendet. Es sollte also viel Festplattenplatz für dieses Verzeichnis vorhanden sein (viele Projekte mit großen Repostiories benötigen viel Platz ;)).
Um gitosis zu initialisieren, wird ein SSH Schlüssel benötigt, den man auf seinen lokalen Arbeitsplatz anlegt.
Dieser Befehl legt die Dateien ./ssh/id_rsa (privater Schlüssel) und ./ssh/id_rsa.pub (öffentlicher Schlüssel) an. Falls schon Schlüssel vorhanden sind, können selbstverständliche auch diese verwendet werden.
Den öffentlichen Schlüssel überträgt man nun auf den Git Server ins Verzeichnis /tmp (dies ist die Voraussetzung für den nächsten Schritt; der öffentliche Schlüssel wird unter dem Pfad /tmp/benutzername.pub erwartet!)
Die Übertragung des Schlüssels kann z.B. mit scp erfolgen:
Hinweis: Der private SSH Schlüssel sollte niemals aus der Hand gegeben und auch nicht übers Netz übertragen werden.
Es empfiehlt sich die SSH Konfiguration für den Git Server (mit Git Server meine ich immer den Server, der als zentraler Teamserver verwendet werden soll) in die lokale ./ssh/config Datei aufzunehmen:
User git
# falls man einen anderen Port verwendet, muss dieser hier gesetzt werden
# Port 22
IdentityFile ~/.ssh/id_rsa
Dadurch erspart man sich den Benutzer bei jeder Kommunikation mit dem GIT Server mit anzugeben. Auch kann man durch diese Konfigurationsdatei den Ort des privaten SSH Schlüssels angeben (falls dieser von dem Standard Schlüssel abweicht).
Nun kann gitosis initialisiert werden:
sudo chmod +x /srv/git/repositories/gitosis-admin.git/hooks/post-update # muss ausführbar sein!
Wenn alles glatt läuft, werden folgende Meldungen ausgegeben:
Initialized empty Git repository in ./
Die weiteren Arbeitsschritte werden auf dem lokalen Rechner durchgeführt (nicht auf dem Server).
Zuerst holt man sich das Repository gitosis-admin mit:
git clone git@mein-git-server.de:gitosis-admin.git
Hierbei ist zu beachten, dass der Benutzername git immer verwendet wird, für alle Benutzer! gitosis unterscheidet die Benutzer durch den Dateinamen des öffentlichen SSH Schlüssels, welcher verwendet wird.
Es sollte folgende Meldung zu sehen sein:
remote: Counting objects: 146, done.
remote: Compressing objects: 100% (145/145), done.
remote: Total 146 (delta 43), reused 4 (delta 0)
Receiving objects: 100% (146/146), 17.18 KiB, done.
Resolving deltas: 100% (43/43), done.
"The hard part is over", wie es in Kill Bill so schön heißt. Was jetzt noch fehlt ist die Konfiguration der einzelnen Repositories und die Zugriffsrechte dazu.
Testen des SSH Zugangs
Mit folgendem Test kannst Du verifizieren, ob der SSH Zugang für den Benutzer git richtig konfiguriert ist.
Der Befehl:
ERROR:gitosis.serve.main:Need SSH_ORIGINAL_COMMAND in environment.
Connection to mein-git-server.de closed.
Sieht man folgende Fehlermeldung, stimmt etwas mit dem SSH Zugang nicht:
Mögliche Ursachen für diesen Fehler können sein:
- Login wurde für den Benutzer git gesperrt (z.B. ungültige Shell in /etc/passwd eingetragen)
- Öffentlicher Schlüssel des Benutzers wurde nicht hinterlegt
- Fehlerhafte Konfiguration in gitosis.conf
- Privater Schlüssel wurde nicht verwendet (oder vielleicht ein falscher Schlüssel)
- Privater Schlüssel wurde anstelle des öffentlichen Schlüssels auf Server hinterlegt (dies ist leider auch schon aufgetreten, Namen nenne ich keine ;))
- Ein Team-Mitglied benutzt nicht den Benutzernamen git für die SSH Authentifizierung
Des weiteren ist es ratsam einen Blick in die Datei /var/log/auth.log zu werfen (darin werden Authentifizierungsmeldungen protokolliert).
System absichern
Das Verzeichnis /srv/git sollte nur durch den Owner und den Gruppenmitgliedern eingesehen werden können. Dies erreicht man mit:
chown git:www-data /srv/git
Da die SSH Authentifizierung über Schlüssel verwendet wird, sollte die Kennwort-Authentifizierung deaktiviert werden. Dazu ändert man in der Datei /etc/ssh/sshd_config die Zeile:
Wichtig: Bevor mal die SSH Kennwortauthentifizierung abschaltet, unbedingt vorher SSH Schlüssel für die System-Accounts einrichten, über die weiterhin ein SSH Login erforderlich ist.
Verwaltung der GIT Repositories
Die Verwaltung der Repositories erfolgt über das Repository gitosis-admin. Im Unterverzeichnis keydir werden alle öffentlichen Schlüssel der Benutzer abgelegt, die auf Repositories Zugriff haben. Der Dateiname stellt den Benutzernamen dar.
Hier ein Beispiel:
alex.pub
andi.pub
claudi.pub
flobruit.pub
reinhard.pub
Die Konfiguration von Benutzergruppen und wer auf welches Repository zugreifen darf, erfolgt in der Datei gitosis.conf:
[gitosis]
# team gitosis-admin, Administrators for repositories
[group gitosis-admin]
writable = gitosis-admin
members = alex
# team squatlabs
[group squatlabs]
writable = repos1 repos2 # repositories repos1 and repos2
members = alex claudi
# team devdays
[group devdays]
writable = devdays # repository devdays
members = flobruit andi reinhard @squatlabs
In dem Beispiel werden 3 Benutzergruppen definiert: gitosis-admin, squatlabs und devdays. Die Mitglieder der Benutzergruppe gitosis-admin haben Schreibzugriff auf das Repository gitosis-admin, welches die öffentlichen SSH Schlüssel und die gitosis.conf enthält. Die Benutzer in dieser Gruppe können somit die Verwaltung aller Repositories durchführen.
Die Gruppe squatlabs hat Zugriff auf die beiden Repositories repos1 und repos2. Mitglieder dieser Gruppe sind die Benutzer alex und claudi (es müssen also die beiden öffentlichen Schlüssel alex.pub und claudi.pub im Verzeichnis keydir vorhanden sein).
Die dritte Gruppe devdays hat Zugrif auf das Repository devdays. Es haben die 3 Benutzer flobruit, andi und reinhard Schreibrechte. Weiterhin haben auch alle Benutzer der Gruppe squatlabs Schreibrechte auf das Repository devdays.
Neues Repository anlegen
In der Datei gitosis.conf wird das neue Repository zu den gewünschten Benutzergruppen hinzugefügt. Sofort nach dem Commit dieser, kann von den Benutzern der Benutzergruppen mit Schreibrechten das neue Repository angelegt werden. Hierzu werden folgende Kommandos ausgeführt (auf dem Arbeitsplatzrechnern, nicht auf dem Server!):
cd mein_projekt
git init
touch dummy.txt && git add dummy.txt && git commit -m 'dummy file'
git remote add origin git@mein-git-server.de:mein_projekt.git
git push origin master:refs/heads/master
Wichtig ist dabei, dass mindestens ein Commit durchgeführt wurde, bevor man den push ausführt (anderfalls wird eine Fehlermeldung erzeugt). Anstelle der dummy.txt Datei können natürlich auch bestehende Dateien in das Verzeichnis kopiert werden, die ins Repository übernommen werden sollen.
Hier im Beispiel wird als Repository-Name mein_projekt verwendet, welches mit dem gleichen Namen in der gitosis.conf als writable für den Benutzer eingetragen sein muss.
Nach dem Push ist auf dem Git Server das Verzeichnis /srv/git/repositories/mein_projekt vorhanden.
Das Repository kann jetzt von allen Team Mitglieder mit folgenden Befehl verwendet werden:
Wichtig: alle Team-Mitglieder müssen als Benutzername "git" verwenden (und nicht den Benutzernamen, der für den öffentlichen Schlüssel verwendet wurde).
Repository entfernen
Will man ein Repository entfernen, müssen alle Verweise auf dieses Repository aus der Datei gitosis.conf enfernt werden. Das Repository selbst kann nur auf dem Git Server gelöscht werden. Dazu löscht man das komplette Verzeichnis /srv/git/repositories/MEIN-REPOSITORY.git
Neues Team-Mitglied aufnehmen
In der Datei gitosis.conf den Benutzer in die gewünschten Gruppen hinzufügen, auf der dieser Zugriff bekommen soll. Weiterhin ist es erforderlich einen öffentlichen SSH Schlüssel im Verzeichnis keydir abzulegen, dessen Dateiname mit dem Benutzernamen übereinstimmt.
Beispiel: für Benutzer alex muss eine Key mit dem Namen keydir/alex.pub existieren.
Team-Mitglied entfernen
In der Datei gitosis.conf den Benutzer aus der gewünschten Gruppe entfernen. Ist der Benutzer in keiner Gruppe mehr vorhanden, kann auch sein öffentlicher Schlüssel aus dem Verzeichnis keydir gelöscht werden.
Webfront zu den Repositories
Es gibt viele Webfronts für GIT, eines davon ist gitweb und wird mit Git ausgeliefert. Dieses werden wir nun so einrichtet, dass damit alle Repositories eingesehen werden können.
Folgender vhost muss dazu angelegt werden, z.B. in der Datei /etc/apache2/sites-available/git:
DocumentRoot /srv/git/repositories
ServerName mein-git-server.de
ErrorLog /var/log/apache2/git_error.log
CustomLog /var/log/apache2/git_access.log combined
Alias /gitweb.css /usr/share/gitweb/gitweb.css
Alias /git-logo.png /usr/share/gitweb/git-logo.png
Alias /git-favicon.png /usr/share/gitweb/favicon.ico
<Directory /srv/git/repositories>
AuthType Basic
AuthName "Projekt Team"
AuthUserFile /srv/git/.htpasswd
AllowOverride None
Order allow,deny
Allow from all
Require valid-user
AddHandler cgi-script cgi
DirectoryIndex gitweb.cgi
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.</em> /gitweb.cgi/$0 [L,PT]
</Directory>
</VirtualHost>
Nun muss noch ein Benutzer angelegt werden, der Zugriff auf das Webfrontend bekommt:
Der Benutzer 'benutzer' hat nun Zugriff aus das Webfrontend und kann ALLE Repositories einsehen. Falls ein Benutzer nur ein bestimmtes Repository einsehen darf, müssen dafür eigene Directory Anweisungen in der vhost Konfigurationsdatei gesetzt werden.
Beachte: Wenn vertrauliche Daten in den Repositories vorhanden sind ist sehr genau darauf zu achten, wer Zugriff über das Webfrontend erhält, da standardmäßig alle Repositories eingesehen werden können.
Die Konfiguration für gitweb wird in der Datei /etc/gitweb.conf festgelegt. Hier ist es wichtig, dass folgende Zeile geändert wird:
Als letzter Arbeitsschritt muss nun noch der vhost aktiv geschaltet werden und der Webserver neu gestartet werde:
invoke-rc.d apache2 restart
Nun sollte im Webbrower unter dem verwendeten Hostname (im Beispiel mein-git-server.de) das Webfrontend aufzufinden sein.
Weitere Informationen
- gitosis README
- Hosting Git repositories, The Easy (and Secure) Way
- gitolite, als Alternative zu gitosis
Projektmanagement Services, Consulting und Coaching
Unser Projektmanagement Team aus München ist hervorragend ausgebildet und verfügt über die nötige Expertise, Erfahrung und das Augenmaß, wenn es darum geht in Kundenprojekten die richtigen Tools einzuführen, zu konfigurieren und bestehende Prozesse zu optimieren. Unser Ziel ist es für einen reibungslosen Projektverlauf zu sorgen. Kontaktieren Sie uns unverbindlich.
Disclaimer
Ungeachtet der Sorgfalt, die auf die Erstellung von Text, Abbildung und Programmen verwendet wurde, kann der Autor für mögliche Fehler und deren Folgen keine juristische Verantwortung oder irgendeine Haftung übernehmen.
Der Artikel enthält eventuell Links zu anderen Seiten im Internet auf deren Inhalt und Design wir keinen Einfluss haben. Der Autor erklärt hiermit ausdrücklich, dass zum Zeitpunkt der Linksetzung keine illegalen Inhalte auf den zu verlinkenden Seiten erkennbar waren. Auf die aktuelle und zukünftige Gestaltung, die Inhalte oder die Urheberschaft der verlinkten/verknüpften Seiten hat der Autor keinerlei Einfluss. Deshalb distanziert er sich hiermit ausdrücklich von allen Inhalten aller verlinkten /verknüpften Seiten, die nach der Linksetzung verändert wurden.
Falls Sie an unseren Leistungen interessiert sind, kontaktieren Sie uns. © Copyright, AlphaNodes GmbH - alle Rechte vorbehalten.



