öffnen Tags

öffnen Kategorien

Vom WebReader vorlesen lassen

Oh my Git!

23. Aug 2009, 02:04

Bisher habe ich die Ãœbungsaufgaben, die im Semester so anfallen, mit Subversion verwaltet. Ich kann mich eigentlich nicht beklagen, hatte nie Probleme damit, wollte aber nach dem Post von Ronny ein verteiltes System probieren.
Meine Entscheidung viel auf Git, aus dem einfach Grund, dass ich eins wählen musste.

Jetzt stand ich aber vor einem Problem. Ich nutze das SVN nicht allein. Da Git nun aber eine dezentrale Versionsverwaltung ist, verlaufen viele Suchanfragen zur Installation in die verschiedensten Richtungen, nur nicht zur Einrichtung einer zentralen Sammlung (wie man sie dann nutzt ist leicht zu erfahren). Also hab ich mich eben selbst auf den Weg durch die Dokus gemacht, hier meine kleine Anleitung (natürlich für Debian) wie es Funktioniert:

Einrichten des Servers

Wie immer müssen wir ein wenig Software dazu installieren:

1
aptitude install git git-core gitosis

gitosis ist der Schlüssel, es verwaltet die verschiedenen User und Repositories. Es wird auch ein neuer User mit dem Namen gitosis angelegt, dessen Home-Directory von Haus aus in /srv/gitosis landet. Da ich aber solche Sachen gern in /home liegen habe, wurde kurzer Hand die /etc/passwd angepasst, jetzt bewohnt gitosis das Verzeichnis /home/git.

Jetzt können wir auch schon das erste Repository initialisieren. Da Git's Kommunikation auf SSH beruht, managed gitosis die Connections via SSH-Keys. Wer sich also bis Dato noch keinen erstellt hat, sollte dies jetzt tun und den Key des Clients dann auf den Server schieben (meiner lagert unter /tmp/id_rsa.pub). Diesen brauchen wir nun zum initialisieren (er authentifiziert uns später als admin):

1
2
3
4
5
6
7
binfalse /home # su - gitosis
gitosis@binfalse:~$ pwd
/home/git
gitosis@binfalse:~$ gitosis-init < /tmp/id_rsa.pub
Initialized empty Git repository in /home/git/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /home/git/repositories/gitosis-admin.git/
gitosis@binfalse:~$ exit

Als Benutzer gitosis wurde nun das erste und auch wichtigste Repository /home/git/repositories/gitosis-admin.git/ angelegt. Mit ihm werden alle weiteren Repositories und Benutzer und Zugriffsrechte verwaltet.

Das war es eigentlich schon auf dem Server!

Einrichten des ersten Clients

Hier benötigen wir natürlich auch Git:

1
aptitude install git

Nun checken wir das Konfigurationsrepository aus. Dies geht ohne Passwort, denn gitosis hat oben unseren SSH-Key bekommen und kann uns damit identifizieren:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
esmz-designz@abakus ~ $ mkdir git
esmz-designz@abakus ~ $ cd git/
esmz-designz@abakus ~/git $ git clone gitosis@binfalse.de:gitosis-admin.git
Initialized empty Git repository in /home/esmz-designz/git/gitosis-admin/.git/
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 1), reused 5 (delta 1)
Receiving objects: 100% (5/5), done.
Resolving deltas: 100% (1/1), done.
esmz-designz@abakus ~/git $ l
total 12K
drwxr-xr-x 3 esmz-designz 4.0K 2009-08-23 01:19 ./
drwxr-xr-x 21 esmz-designz 4.0K 2009-08-23 01:14 ../
drwxr-xr-x 4 esmz-designz 4.0K 2009-08-23 01:19 gitosis-admin/
esmz-designz@abakus ~/git $ cd gitosis-admin/
esmz-designz@abakus ~/git/gitosis-admin $ l
total 20K
drwxr-xr-x 4 esmz-designz 4.0K 2009-08-23 01:19 ./
drwxr-xr-x 3 esmz-designz 4.0K 2009-08-23 01:19 ../
drwxr-xr-x 8 esmz-designz 4.0K 2009-08-23 01:19 .git/
-rw-r--r-- 1 esmz-designz 89 2009-08-23 01:19 gitosis.conf
drwxr-xr-x 2 esmz-designz 4.0K 2009-08-23 01:19 keydir/

Im Ordner keydir werden alle SSH-Keys der Mitbenutzer gesammelt, aktuell ist nur mein Key Namens esmz-designz@abakus.pub enthalten.
Die Datei gitosis.conf ist sozusagen das Kontrollzentrum. Hier werden Projekte und Benutzer verwaltet.
Im Auslieferungszustand ist die Datei noch recht leer:

1
2
3
4
5
[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members = esmz-designz@abakus

Die Syntax ist recht intuitiv:

1
2
3
4
5
6
[gitosis]

[group GRUPPENNAME]
members = MEMBER1 MEMBER2 ETC
writable = REPOSTITORY1 REPOSTITORY2
readonly = REPOSTITORY3 ETC

Um eine neue Gruppe zu erstellen wird also einfach eine weitere group Direktive erstellt. So entsteht zum Beipiel ein neues Repository test:

1
2
3
[group dev]
writable = test
members = esmz-designz@abakus

Damit bin ich in der Grupper dev, die Schreibrechte auf das Repository test hat. Das ganze wird gespeichert und eingecheckt:

1
2
3
4
esmz-designz@abakus ~/git/gitosis-admin $ git commit -a
[master 51cdf92] Created repository test.
1 files changed, 4 insertions(+), 0 deletions(-)
esmz-designz@abakus ~/git/gitosis-admin $ git push

Nach dem push öffnet sich der Editor eures Vertrauens und ihr dürft noch ein Kommentar hinterlassen. Alternativ kann man dies auch mit -m über die Kommandozeile tun.

Damit hab ich als "esmz-designz@abakus" Zugriff auf das neue Repository "gitosis@binfalse.de:test.git". Das Repository selbst gibt es so aber noch nicht, das können wir nun erstellen:

1
2
3
4
5
6
esmz-designz@abakus ~/git/gitosis-admin $ cd ..
esmz-designz@abakus ~/git $ mkdir test
esmz-designz@abakus ~/git $ cd test/
esmz-designz@abakus ~/git/test $ git init
Initialized empty Git repository in /home/esmz-designz/git/test/.git/
esmz-designz@abakus ~/git/test $ git remote add origin gitosis@binfalse.de:test.git

Wenn schon eine solches Arbeitsverzeichnis existieren sollte (eventuell ein altes SVN), braucht, kann man darin auch direkt ein init absetzen.
Nun probieren wir eine Datei hinzuzufügen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
esmz-designz@abakus ~/git/test $ echo "Usain Bolt" > WM_BERLIN
esmz-designz@abakus ~/git/test $ git add WM_BERLIN
esmz-designz@abakus ~/git/test $ git commit -m "Start der ersten Revision"
[master (root-commit) 444915d] Start der ersten Revision
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 WM_BERLIN
esmz-designz@abakus ~/git/test $ git push origin master:refs/heads/master
Initialized empty Git repository in /home/git/repositories/test.git/
Counting objects: 3, done.
Writing objects: 100% (3/3), 245 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To gitosis@binfalse.de:test.git
* [new branch] master -> master
esmz-designz@abakus ~/git/test $

Mit dem push-Befehl wurde das Repository nun angelegt.

Benutzer hinzufügen

Um weitere User an den Projekten mitwirken zu lassen, recht es ihre SSH-Keys zu bekommen. Diese müssen dann in [...]/gitosis-admin/keydir/USERNAME@CLIENT.pub gespeichert werden. Um ihnen dann die nötigen Rechte zu erteilen, werden sie einfach in der gitosis.conf korrekt platziert. Bekomm ich also einen Key von rumpel am Rechner rumpelkammer, kopier ich ihn:

1
cp ~/Download/rumpel@rumpelkammer ~/git/gitosis-admin/keydir/rumpel@rumpelkammer.pub

und gebe ihm Schreibrechte am Repository test

1
2
3
[group dev]
writable = test
members = esmz-designz@abakus rumpel@rumpelkammer

Und natürlich nicht vergessen, das Config-Repo wieder einzuchecken!

Repository veröffentlichen

Das Repository können bisher nur Benutzer auschecken, die mir ihren SSH-Key überlassen haben. Möchte man die Arbeit aber veröffentlichen ist diese Prozedur recht aufwendig! Hierfür gibt es einen kleinen Trick bei Git. Man lege einfach die Datei git-daemon-export-ok auf dem Server in die Repositories, die frei zugänglich sein sollen, also in meinem Fall:

1
touch /home/git/repositories/test.git/git-daemon-export-ok

Nun kommen die Leute von aussen immer noch nicht dran. Man muss entweder den Apache konfigurieren, damit er die git-Repos ausliefert oder man benutzt den git-daemon. Dieser lauscht gewöhnlich am Port 9418 (Firewall beachten) und wartet, dass jemand zum auschecken kommt.
Ich habe ihn unter dem User gitosis laufen:

1
2
3
4
5
binfalse /home # sudo -u gitosis git-daemon --base-path=/home/git/repositories/ --verbose --detach
binfalse /home # ps -ef | grep git
gitosis 3216 1 0 00:57 ? 00:00:00 git-daemon --base-path=/home/git/repositories/ --verbose --detach
root 3242 16141 0 00:58 pts/8 00:00:00 grep --color=auto git
binfalse /home #

Und da ein solcher Daemon im allgemeinen auch mal die Hufe hebt, hab ich gleich einen Cronjob eingerichtet, der überprüft ob noch alles läuft:

1
*/5 * * * * if [ -z `pidof git-daemon` ]; then sudo -u gitosis git-daemon --base-path=/home/git/repositories/ --verbose --detach; fi

Jetzt kann es jedermann auschecken:

1
git clone git://binfalse.de/test.git

Na also, gar kein Problem! Jetzt weiß ich auch warum es dafür kaum Tutorials gibt, die ganze Geschichte ist ja doch recht intuitiv. Unterwegs sind mir noch zwei Seiten untergekommen, die ich euch natürlich auch ans Herz legen muss:
Git-Cheats und Git -vs- SVN

Also viel Git!

Tags: Git Software SSH SVN

Kategorien: Software

© 2009-2018 by Martin Scharm