Git Server einrichten

Aus cmoser Wiki
Zur Navigation springen Zur Suche springen

Versionskontrollsysteme wie Git sind in der modernen Softwareentwicklung für die "Best Practices" nicht mehr wegzudenken. Sie erlauben es, Änderungen der Software auf Quelltextebene mitzuverfolgen. Git erlaubt zudem frühere Versionen der Software wieder herzustellen und mit Zweigen (branches) unterschiedliche Versionen von Dateien und Verzeichnissen zu erstellen.

Viele Softwareprojekte setzen auf Services wie Github, GitLab oder Bitbucket um ihre Software zu versionieren und diese zu verteilen. Wir werden uns aber in diesem Tutorial unseren eigenen Git-Server unter Ubuntu 22.04 bzw. FreeBSD installieren, da man nicht jedes Projekt im Internet finden soll. Das gilt vor allem dann, wenn man seine eigenen Konfigurationsdateien mit Git versioniert.

Installation von Git

Zuerst sollte man überprüfen, ob Git bereits installiert ist.

git --version

Wird dieser Befehl mit einem Fehler quittiert, ist Git nicht installiert und muss noch dem System hinzugefügt werden.
Unter Ubuntu geht das wie folgt:

$ sudo apt update && sudo apt install -y git

Und unter FreeBSD:

# pkg pkg install -y git

Ein erneutes git --version gibt dann die installierte Git-Version aus. Für den Git-Server haben wir somit die benötigte Software installiert.

Git-Nutzer anlegen

Als Nächstes müssen wir noch einen Git-Nutzer, unter dem der Server laufen soll, anlegen. Dieser Nutzer hostet die ganzen Git-Repositorien und macht sie im Netzwerk verfügbar. Über SecureShell werden die Repositorien den angelegt und verwaltet. Die Repositorien befinden sich im Verzeichnis /srv/git/repositories. Ein .ssh Verzeichnis, in dem sich in der Datei authorized_keys befindet, welche die zur Anmeldung erlaubten öffentlichen Schlüssel der Nutzer enthält, muss, mit den entsprechenden Berechtigungen, auch noch angelegt werden.
Unter Ubunto geht das wie folgt:

$ sudo useradd --comment "Git Nutzer" --home-dir /home/git --create-home --password PASSWORD --uid 10000 --user-group
$ sudo -u git mkdir /home/git/{repositories,.ssh} && sudo -u git chmod 0700 /home/git/.ssh
$ sudo -u git touch /home/git/.ssh/authorized_keys && chmod 0600 /home/git/.ssh/authorized_keys

Und unter FreeBSD:

# pw useradd git -c "GIT Nutzer" -d /home/git -g git -s /bin/sh -u 10000
# mkdir -p /home/git/repositories /home/git.ssh
# chown git:git /home/git/repositories
# chown git:git /home/git/.ssh && chmod 0700 /home/git/.ssh
# touch /home/git/.ssh/authorized_keys \ 
    && chown git:git /home/git/.ssh/authorized_keys \
    && chmod 0600 /home/git/.ssh/authorized_keys

Jetzt müssen noch die Schlüssel der Benutzer in die Datei eingefügt werden. Wenn die Nutzer noch kein ssh-Schlüsselpaar haben, lässt sich selbiges mit dem Befehl ssh-keygen anlegen. Mit cat ~/.ssh/id_rsa.pub lässt sich der öffentliche Schlüssel anzeigen.

Mit ssh-copy-id lassen sich die Schlüssel dann am Server eintragen.

$ ssh-copy-id -i ~/.ssh/id_rsa.pub git@git-server

Oder man kopiert die öffentlichen Schlüssel auf den Git-Server und hängt sie der Datei ~/.ssh/authorized_keys an.

$ users="chris anna patrick udo"

# Kopieren der Nutzer auf den Server
$ for i in $users; do
>     sudo scp /home/${i}/.ssh/id_rsa.pub git@gitserver:/tmp/git.${i}.ssh-key
> done

# Anmelden am gitserver mit dem Nutzer "git"
$ ssh git@gitserver

# Anhängen der öffentlichen Schlüssel an ~/.ssh/authorized_keys
git@gitserver$ for i in /tmp/git.*.ssh-key; do
git@gitserver>    cat $i >> ~/.ssh/authorized_keys && rm $i
git@gitserver> done

# Abmelden am Server 
git@gitserver$ exit

Hat man den eigenen Schlüssel auf dem Git-Server übertragen, sollte man versuchen, sich als git am Server anzumelden. Kann man sich ohne Passworteingabe anmelden, hat man alles richtig gemacht.

Test Repository erstellen

Als Nächstes erstellen wir ein Test-Repository, um unseren Server zu testen. Wir erstellen ein bare Repository, da wir am Server keine Commits machen, sondern nur push und pull Operationen durchführen, außer wir legen ein neues Repository an.

git@gitserver$ mkdir -p repositories/test.git
git@gitserver$ cd repositories/test.git
git@gitserver$ git init --bare

Jetzt können wir am Client ein Repository anlegen und selbiges an den Server übertragen.

$ mkdir test.git
$ cd test.git
$ git init
$ echo "Das ist ein Test" >> test.txt
$ git add .
$ git commit -m "Initial Commit"
$ git remote add origin git@gitserver:repositories/test.git
$ git push origin master

Ab jetzt können Sie das Repository klonen und daran Änderungen vornehmen.

$ git clone git@gitserver:repositories/test.git
$ cd test
$ nano README
$ git add .
$ git commit -am "README hinzugefügt"
$ git push origin master

Mit dieser Methode können Sie einen Read/Write-Git-Server für mehrere Entwickler in Betrieb nehmen.

Shellzugriff einschränken

TODO

Git über das git Protokoll verteilen

Der git-daemon eignet sich für den unautorisierten Zugriff auf Git-Repositorien. Diese sind für alle Teilnehmer in einem Netzwerk verfügbar. Sollte sich der Git-Server im Internet befinden, werden alle freigegebenen Repositorien für jeden verfügbar gemacht, befindet sich der Git-Server hinter einer Firewall, werden die freigegebenen Repositorien für jeden im selben Netzwerk abrufbar. Das eignet sich für öffentliche Repositorien bzw. Repositorien, die von jedem sich im selben Netzwerk befindenden, abgerufen können sollen.

Um ein Repository freizugeben, muss sich im Hauptverzeichnis des Repositorys eine leere Datei mit dem Namen git-daemon-export-ok befinden. Diese Datei teilt dem Git-Daemon mit, dass dieses Repository mit der Welt geteilt werden darf. Also legen wir eine leere Datei mit dem vorher genannten Namen in unserem Test-Repository an, um den Daemon zu testen.

git@gitserver$ touch /home/git/repositories/test.git/git-daemon-export-ok

TODO

Git über http

TODO