2.4 Git Server

Im Kapitel 2 haben wir git init bereits kennengelernt. Um ein Git Repository zur Kollaboration anzulegen, sind weitere Schritte nötig. Dies behandelt dieses Kapitel. Voraussetzung für dieses Kapitel ist SSH Zugriff inkl. Root Berechtigung auf ein beliebiges Linux System.

Git Protokolle

Um auf ein entferntes Git Repository zuzugreifen, gibt es in der Regel zwei Varianten:

  • HTTPS
  • SSH

Beide Protokolle bieten standardmässig Verschlüsselung, Authentifizierung und Komprimierung.

Git über HTTPS

Kurze Wiederholung: Um ein Repository über HTTPS zu klonen verwendet man

1
$ git clone https://github.com/kelseyhightower/nocode.git

Dies ist die einfachste Variante um Code schnell herunterzuladen und lokal im eigenen Editor zu betrachten.

Vorteile:

  • Anonymer Zugriff möglich
  • Zugriff für Systeme, auf denen SSH weniger verbreitet ist
  • HTTPS ist auf vielen Corporate Firewalls standardmässig offen…

Nachteile:

  • Zwischenspeicherung der Anmeldedaten weniger benutzerfreundlich als mit SSH Keys
  • Konfiguration des Webservers etwas komplizierter als die von SSH

Git über SSH

Um ein Repository mit SSH zu klonen, kommt folgender Befehl zum Einsatz:

1
$ git clone git@github.com:cajotafer/10xengineers.git

Für die meisten Anwendungsfälle ist dies der bevorzugte Weg um entfernte Git Repositories zu verwenden.

Vorteile:

  • SSH ist auf jedem Linux System bereits vorinstalliert (server- wie clientseitig)
  • SSH Server sind sehr einfach zu konfigurieren
  • Der Zugriff via SSH ist sehr sicher

Nachteile:

  • Bietet keinen anonymen Zugriff

Weitere Möglichkeiten

  • File
    • Die wohl einfachste Möglichkeit um ein Git Repository mit anderen zusammen zu nutzen
    • Repository kann z.B. auf einem gemeinsam genutzen NFS Share liegen, von dem man danach lokal das Repository klont
  • Git Protokoll
    • Unterstützt keine Authentifizierung
    • Wird deswegen sinnvollerweise nur für Pull Operationen benutzt, wenn viel Traffic für ein Projekt erwartet wird

Git auf einem Server einrichten

Entfernte Git Repositories werden in einem Ordner mit der Endung .git angelegt. Dies als eindeutige Kennzeichnung, dass es sich um ein “Bare Repo” handelt. Ein Bare Repository enthält kein Arbeitsverzeichnis. Dies bedeutet, dass auf der obersten Dateisystemebene des Repositories keine ausgecheckten Inhalte vorhanden sind. Aber sehen wir uns das gleich anhand eines Beispiels an.

Git Repository auf einem Server erstellen und lokal klonen

Hinweis: Bitte den Hostnamen “zwiseliserver42” in den Commands jeweils durch den eigenen Server ersetzen.

Wir erstellen wie folgt ein Repository auf einem Server unserer Wahl:

1
2
3
4
[root@zwiseliserver42 ~] mkdir /opt/repository.git
[root@zwiseliserver42 ~] cd /opt/repository.git
[root@zwiseliserver42 repository.git] git init --bare --shared
Initialized empty shared Git repository in /opt/repository.git

Beachte die Optionen von git init! Lies kurz in der Manpage nach was diese genau bewirken

Die Verzeichnisstruktur auf dem Server sieht danach wie folgt aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[root@zwiseliserver42 repository.git] ls -alht
total 44K
drwxrwsr-x. 7 root root 4.0K Jun  3 13:37 .
-rw-rw-r--. 1 root root  126 Jun  3 13:37 config
drwxrwsr-x. 4 root root 4.0K Jun  3 13:37 objects
-rw-rw-r--. 1 root root   23 Jun  3 13:37 HEAD
drwxrwsr-x. 4 root root 4.0K Jun  3 13:37 refs
drwxrwsr-x. 2 root root 4.0K Jun  3 13:37 hooks
drwxrwsr-x. 2 root root 4.0K Jun  3 13:37 branches
-rw-rw-r--. 1 root root   73 Jun  3 13:37 description
drwxrwsr-x. 2 root root 4.0K Jun  3 13:37 info
dr-xr-x---. 6 root root 4.0K Jun  3 13:37 ..

Klonen wir dieses Repo nun lokal auf unseren Client, sieht dies folgendermassen aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[zwiseli@kompiuter ~] git clone root@zwiseliserver42:/opt/repository.git
Cloning into 'repository'...
warning: You appear to have cloned an empty repository.
[zwiseli@kompiuter ~] cd repository
[zwiseli@kompiuter repository] ls -alht
ls -alht
total 0
drwxrwxrwt. 26 root    root    740 Jun  3 13:37 ..
drwxrwxr-x.  7 zwiseli zwiseli 200 Jun  3 13:37 .git
drwxrwxr-x.  3 zwiseli zwiseli  60 Jun  3 13:37 .

Wir haben das aktuell noch leere Repository erfolgreich geklont. Die auf dem Server vorhandenen Files liegen nun im Verzeichnis .git. Es wäre schön, wenn wir nun mit anderen Zwiselis zusammen etwas schönes entwickeln könnten. Dafür erstellen wir den User “rubeli” und das Directory .ssh, um einen authorized Key für diesen Benutzer einzutragen:

1
2
3
[root@zwiseliserver42 repository.git] adduser rubeli
[root@zwiseliserver42 repository.git] su - rubeli
[root@zwiseliserver42 repository.git] mkdir .ssh

Im untenstehenden Command übungshalber durch den eigenen Public Key ersetzen, und noch die korrekten Berechtigungen auf dem File setzen:

1
2
[root@zwiseliserver42 repository.git] echo "<PUBKEY>" > /home/rubeli/.ssh/authorized_keys
[root@zwiseliserver42 repository.git] chmod 600 /home/rubeli/.ssh/authorized_keys

Somit haben wir (hoffentlich) eine funktionsfähige SSH Verbindung für den Benutzer rubeli. Ob diese funktioniert, sehen wir sofort, wenn wir probieren mit rubeli das Repository auszuchecken:

1
2
3
[zwiseli@kompiuter ~] git clone rubeli@zwiseliserver42:/opt/repository.git rubelirepository
Cloning into 'rubelirepository'...
warning: You appear to have cloned an empty repository.

Somit wird klar, dass es für ein einfaches Repository zur Kollaboration Git-seitig absolut keine Einstellungen benötigt. Dies ist eine grosse Stärke von Git.

Hooks

Hooks sind eine praktische Möglichkeit, bei gewissen Aktionen in Git Scripts auszuführen die das Leben ungemein erleichtern. Der Einsatz von Hooks macht tendenziell nur mit entfernten Repositories Sinn. Soll zum Beispiel vor einem Commit die Syntax des Codes überprüft werden, ist dies mit einem lokalen Pre-Commit Hook möglich. In lokal ausgecheckten Repositories finden sich im Verzeichnis .git/hooks/ Beispiele für alle möglichen Anwendungsfälle. Ebenfalls besteht die Möglichkeit, Hooks auf Serverseite zu konfigurieren. Mehr Infos zu Hooks gibt es hier

Git Server Software

Natürlich kommt man in der komplizierten Welt der IT mit den Bordmitteln von Linux und Git irgendwann mal an die Grenzen, und wünscht sich beispielsweise granularere Berechtigungsvergabe oder sogar ein webbasiertes UI. Hier eine (nicht abschliessende) Liste mit verfügbaren Tools, um sich das Leben bei der Verwaltung von Git Repositories vielleicht ein Bisschen einfacher zu machen:

Zuletzt geändert September 19, 2023: small typo fixes (c7eae56)