Git-Server mit Raspberry Pi OS

Dieses Thema wird in vielen Tutorien, Blogs und Videos behandelt. Ich will hier nur eine Kurzanleitung anführen, damit ich mir das alles nicht immer wieder zusammensuchen muss.

Im Speziellen geht es um das Aufsetzen von Git auf dem Raspberry Pi der ersten Generation, dessen Installation mit Raspberry Pi OS ich schon beschrieben habe.

Ein wichtiges Thema ist die Anmeldung mit einem ssh-Schlüssel, um bei Git-Operationen nicht immer ein Passwort eingeben zu müssen.

Git und ein passendes Verzeichnis einrichten

Zunächst muss erstmal git selbst installiert werden, mit den üblichen Vorbereitungen.

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install git

Dann gilt es eine Gruppe und einen Benutzer namens "git" anzulegen.
Der erste Befehl erstellt den neuen Benutzer, dann wird sein Passwort gesetzt. Als nächstes wird die neue Gruppe "git" erstellt, dann dieser der Benutzer "git" hinzugefügt und schließlich diesem die Gruppe "git" als Standardgruppe zugewiesen.

$ sudo useradd -m -g users -s /bin/bash git
$ sudo passwd git
$ sudo groupadd git
$ sudo usermod -a -G git git
$ sudo usermod -g git git

Die git-Repositories hätte ich gerne auf einer eigenen Partition. Dort sollen sie so sicher gegen versehentliche Zugriffe geschützt wie möglich liegen, aber auch so einfach wie möglich benutzbar sein.
Dazu habe ich mir das Basisverzeichnis "/srv" angelegt.

In diesem Verzeichnis wird ein Unterverzeichnis namens "repositories" erzeugt. Das geht nur mit "sudo", weil nur der Benutzer "root" Schreibrechte auf "/srv" hat.
Der Benutzer "git" wird als Eigentümer von "repositories" eingetragen.

$ cd /srv/
$ sudo mkdir repositories
$ sudo chown -R git:git repositories/

Zugriff mit ssh einrichten

Auf dem RaspPi meldet man sich jetzt als Benutzer "git" mit dem vorher vergebenen Passwort an.

Dann gilt es ein Verzeichnis für SSH zu erstellen und für den Zugriff mit einem passenden Schlüssel vorzubereiten.

$ mkdir .ssh
$ chmod 700 .ssh
$ touch .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys

Dann geht es auf dem Rechner weiter, von dem aus man den Git-Server benutzen will. Hier ist die Voraussetzung, daß bereits ein ssh-Schlüsselpaar erzeugt wurde.
Ich verwende überall IP-Adressen statt Rechnernamen, weil in meinem Netz die Namensauflösung (noch) nicht klappt (aber das ist ein anderes Thema).

Das erste Kommando ist nötig, falls schon mal eine ssh-Verbindung zu einem anderen Rechner mit der jetzt zu verwendenden IP-Adresse eingerichtet wurde. Das nächste Kommando macht unseren öffentlichen Schlüssel dem RaspPi bekannt. Schließlich kann amn den Erfolg der Sache noch testen.

$ ssh-keygen -f "/home/uja/.ssh/known_hosts" -R "<IP-Adresse>"
$ ssh-copy-id git@<IP-Adresse>
$ ssh git@<IP-Adresse>
Linux raspberrypi 6.1.21+ #1642 Mon Apr  3 17:19:14 BST 2023 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Apr 25 08:46:20 2023 from <andere IP-Adresse>
git@raspberrypi:~ $ exit
Abgemeldet
Connection to <IP-Adresse> closed.
$

Git-Repository einrichten und verwenden

Ich gehe hier davon aus, daß das Arbeitsrepository schon eingerichtet und in Verwendung ist.

Man meldet sich also wieder auf dem RaspPi als "git" an. Dazu braucht man jetzt kein Passwort mehr, es geht automatisch mit dem eben eingetragenen Schlüssel.

Zuerst wechselt man in das Git-Server-Repo-Verzeichnis. Dort legt man ein neues Verzeichnis an, in dem später die Daten aus dem Arbeitsrepository abgelegt werden sollen (hier als <Repo> bezeichnet). Dieses initialisiert man als leeres Git-Reporitory (bare). Das wars schon auf dem RaspPi.

$ cd /srv/repositories
$ mkdir <Repo>.git
$ cd <Repo>.git
$ git init --bare
Hinweis: Als Name für den initialen Branch wurde 'master' benutzt. Dieser
Hinweis: Standard-Branchname kann sich ändern. Um den Namen des initialen Branches
Hinweis: zu konfigurieren, der in allen neuen Repositories verwendet werden soll und
Hinweis: um diese Warnung zu unterdrücken, führen Sie aus:
Hinweis:
Hinweis:        git config --global init.defaultBranch <Name>
Hinweis:
Hinweis: Häufig gewählte Namen statt 'master' sind 'main', 'trunk' und
Hinweis: 'development'. Der gerade erstellte Branch kann mit diesem Befehl
Hinweis: umbenannt werden:
Hinweis:
Hinweis:        git branch -m <Name>
Leeres Git-Repository in /srv/repositories/<Repo>.git/ initialisiert
$

Nun gehts wieder auf dem Arbeitsrechner weiter.

Im Arbeitsrepository wird die Verbindung zum Server eingerichtet und der erste "push" durchgeführt. Alle weiteren Zugriffe könne dann mit dem gewohnten push/pull erfolgen.

$ git remote add origin git@<IP-Adresse>:/srv/repositories/<Repo>.git
$ git push --set-upstream origin master
Objekte aufzählen: 18, fertig.
Zähle Objekte: 100% (18/18), fertig.
Delta-Kompression verwendet bis zu 8 Threads.
Komprimiere Objekte: 100% (15/15), fertig.
Schreibe Objekte: 100% (18/18), 16.24 KiB | 5.41 MiB/s, fertig.
Gesamt 18 (Delta 4), Wiederverwendet 0 (Delta 0), Pack wiederverwendet 0
To <IP-Adresse>:/srv/repositories/<Repo>.git
* [new branch]      master -> master
Branch 'master' folgt nun Remote-Branch 'master' von 'origin'.
$

Fazit

Das sieht erstmal nach viel Auswand aus.
Aber im Grunde sind es, einmal eingerichtet, für jedes neue Repository nur sechs Kommandos.

© Uwe Jantzen 17.08.23