freeload4u
 

Versionsverwaltung: Eigenen Git-Server betreiben

Das folgende Tutorial beschreibt die Installation und Konfiguration eines Git-Servers für die Verwaltung von Repositories. Ganz ohne GitHub. Eine Versionsverwaltung (VCS) ist ein System, das zur Erfassung von Änderungen an Dokumenten oder Dateien verwendet wird. Alle Versionen werden in einem Archiv mit Zeitstempel und Benutzerkennung gesichert und können später wiederhergestellt werden.


Ausgangspunkt

  1. Debian >= 8
  2. Standard-Systemwerkzeuge
  3. SSH server
  4. Apache >= 2.4

Ziel


1. Benutzer anlegen
Als erstes legen wir auf unserem Git-Server einen neuen Benutzer mit Homeverzeichnis an. Dieser bekommt den Namen git.
        
            su
        
    
        
            useradd -m -G users -s /bin/bash git
        
    
Passwort vergeben
        
            passwd git
        
    

2. Passwortlosen Zugang (ssh pubkey) einrichten
Da wir später von unserem Client aus bequem Dateien auf unseren Server schieben möchten, empfielt es sich die Authentifizierung ohne Passwort zu gestalten. Dies geschieht über den id_rsa.pub key.

Dazu führen wir folgenden Befehl als Benutzer auf unserem Client aus. Für die RSA-Schlüssel wird eine Bitlänge von 4096 Bit ausgewählt:
        
            ssh-keygen -b 4096
        
    

Die Frage nach dem Speicherort standardmäßig in /home/username/.ssh/id_rsa sowie die Frage nach passphrase, können wir leer lassen und einfach mit [ENTER] 2x bestätigen.

Wir übertragen jetzt den id_rsa.pub key auf unseren Git-Server für den Benutzer git.
        
            ssh-copy-id -i .ssh/id_rsa.pub git@serverip
        
    
Es wird nach dem Passwort für Benutzer git gefragt. Dies haben wir beim anlegen festgelegt.

Anschließend wird auf dem Server im Homeverzeichnis des Benutzers eine Datei im Ordner .ssh/authorized_keys erstellt. Diese hat nun den Inhalt unseres Keys bekommen. Es besteht auch die Möglichkeit diese Datei selbst anzulegen und den Inhalt reinzukopieren. Ganz ohne ssh-copy-id.

Testen
Wenn wir uns jetzt über ssh am Server anmelden, dann wird nicht mehr nach dem Passwort gefragt und wir gelangen direkt zum Benutzer
        
            ssh git@serverip
        
    

3. Git auf Server installieren
        
            apt-get install git gitweb
        
    
Falls kein Apache installiert ist, wird er auch gleich automatisch mitinstalliert. Ich beziehe mich jetzt auf folgendes Tutorial. Dort habe ich bereits beschrieben wie er installiert und konfiguriert wird. Wichtig ist hierbei die Version >= 2.4 sonst wird es evtl. später Probleme bei der Konfiguration der VirtualHosts geben.

4. Git Repository erstellen
Als nächstes wechseln wir in das Homeverzeichnis des git Benutzers und legen dort ein repository an.
        
            cd /home/git/
        
    

Verzeichnis erstellen
        
            mkdir -p repos/pub/projekt.git
        
    
        
            cd repos/pub/projekt.git
        
    

Repository anlegen (leer)
        
            git init --bare
        
    

Ausgabe:
Initialisierte leeres Git-Repository in /home/git/repos/pub/projekt.git/
"ls" ergibt folgenden Inhalt
        
            ls
        
    
        
            branches  config  description  HEAD  hooks  info  objects  refs
        
    

5. Gitweb konfigurieren
Dazu wird das Apache - CGI Modul benötigt.
        
            a2enmod cgi
        
    

Gitweb befindet sich nach der Installation unter /usr/share/gitweb Also konfigurieren wir unseren vhost dementsprechend. Die Konfigurationsdatei /etc/apache2/sites-available/example.com.conf haben wir bereits hier zuvor angelegt und aktiviert. Wir fügen einen weiteren Vhost hinzu:
        
            vi /etc/apache2/sites-available/example.com.conf
        
    
        
            <VirtualHost *:80>
                ServerName gitweb.example.com
                DocumentRoot /usr/share/gitweb
                Options ExecCGI FollowSymLinks
                AddHandler cgi-script cgi
            </VirtualHost>
        
    

Die Konfigurationsdatei von gitweb ist unter /etc/gitweb.conf zu finden. Diese öffnen wir und passen den $projectroot an.
        
            vi /etc/gitweb.conf
        
    
Pfad zu den Repos:
        
            $projectroot = "/home/git/repos/pub";
        
    
speichern.

Apache neustarten
        
            /etc/init.d/apache2 restart
        
    

Im Browser kann jetzt http://gitweb.example.com aufgerufen werden. Das Webinterface sollte zu sehen sein.

6. Git konfiguration (Clone über HTTP)
Es ist nun an der Zeit unseren VirtualHost für git clone einzurichten (über HTTP). Dieser Befehl klont ein komplettes Repository und legt einen neuen Ordner an.
        
            vi /etc/apache2/sites-available/example.com.conf
        
    

Wir fügen folgenden Inhalt hinzu:
        
            <VirtualHost *:80>
                ServerName git.example.com
                DocumentRoot /home/git/repos/pub/
                AddHandler cgi-script cgi
                    <Directory "/home/git/repos/pub">
                        Require all granted
                        Options +ExecCGI
                        AllowOverride All
                        DirectoryIndex disabled
                        Options Indexes
                    </Directory>
                SetEnv GIT_PROJECT_ROOT /home/git/repos/pub/
                SetEnv GIT_HTTP_EXPORT_ALL
                ScriptAlias /git/ /usr/lib/git-core/git-http-backend/
            </VirtualHost>
        
    
Ggf. müssen die Pfade zu den Repos angepasst werden sowie der Domainname.
Testen
Wenn wir nun http://git.example.com im Browser aufrufen, sollten wir einen Ordner projekt.git vorfinden. Ist dies der Fall wechseln wir zum Client und rufen git clone auf.
        
            git clone http://git.example.com/projekt.git
        
    
Ist dies erfolgreich:
        
            Cloning into 'projekt'...
            Checking connectivity... done.
        
    
Es wurde nun ein Ordner projekt angelegt. Da unser Repo noch leer ist, befindet sich auch nichts in diesem Ordner.

Für den Fall, dass das Cloning fehlschlägt z.B. mit der Meldung
        
            Cloning into 'projekt'...
            fatal: repository 'http://git.example.com/projekt.git/' not found
        
    

... müssen wir auf dem Server folgenden Befehl (der die Info-Dateien des Repos aktualisiert) ausführen:
        
            cd /home/git/repos/pub/projekt.git && git update-server-info
        
    
Jetzt probieren wir nochmal das Clonen...

Hook-Scripts
Um dieses Update nicht immer händisch durchführen zu müssen, gibt es sogenannte Hook-Scripts. Diese Skripte werden bei bestimmten Aktionen automatisch ausgeführt. Im Ordner /home/git/repos/pub/projekt.git/hooks bringt git einige Beispiel-Scripts mit.
        
            cd /home/git/repos/pub/projekt.git/hooks
        
    

Um die Scripte zu aktivieren müssen sie lediglich umbenannt werden.
        
            mv post-update.sample post-update
        
    
Jetzt wird der Update-Befehl jedes Mal automatisch ausgeführt, wenn neue Änderungen ins Repo gepusht wurden.

7. Client - Konfiguration (Verbindungsaufbau zum Git-Server über SSH)

Wir erstellen auf unserem Client einen Projektordner mit dem wir arbeiten möchten. Git muss natürlich auch auf dem Client vorher installiert werden.
        
            cd /home/user
        
    
z.B.
        
            mkdir projekt
        
    
        
            cd projekt
        
    
Anschließend führen wir ein git init aus:
        
            git init
        
    
Jetzt wurde im Ordner /home/user/projekt/ ein .git/ Verzeichnis erstellt. Dort befindet sich u.a. die Config.

Danach fügen wir die Adresse zum Remote Repository hinzu.
        
            git remote add origin ssh://git@server-ip/home/git/repos/pub/projekt.git
        
    

8. Absender (Identität)
Was wir nicht vergessen sollten, ist der Absender, der hinter unseren Commits stehen wird (Name, Email). Dies ist relativ einfach zu gestalten.
        
            git config --global user.name "Peter Mueller"
        
    
        
            git config --global user.email pm@example.com
        
    

Die komplette Config lässt sich so anzeigen:
        
            git config --list
        
    
fertig :-)

Wir sind nun in der Lage vollständig mit Git zu arbeiten. Zum testen legen wir einfach mal eine neue Datei an.
        
            cd /home/user/projekt/
        
    
        
            echo 'test' > testfile.txt
        
    

Datei hinzufügen
        
            git add testfile.txt
        
    
Datei(en) committen:
        
            git commit -m "first commit"
        
    
Pushen:
        
            git push origin master
        
    
Den Commit sollte man nun auch unter http://gitweb.example.com einsehen können.

Sicherheit
Es muss beachtet werden, dass die Repos mit der aktuellen Konfiguration von außen sichtbar sind. Passwörter sollten daher also nicht committed werden. Es gibt die Möglichkeit auch Dateien und Verzeichnisse auszuschließen. .gitignore oder z.B. gitweb mit einer .htaccess zu schützen.

GUI Clients
1. GitX (Mac)
2. Cycligent git-tool (Mac, Linux, Windows)