GIT-Server für kleine Entwicklergruppen aufsetzen einrichten (Debian basiert)

Git-logoIn diesem Beitrag möchte ich erklären, wie man einen GIT-Server auf einem Debian basierten Server für kleinere Entwicklergruppen einrichtet.
Irgendwelche feingranularen Rechteverwaltungen sind damit nicht möglich, jeder hat Schreib- und Leserechte auf die Repositories.
Im Prinzip wird ein dedizierter GIT-User angelegt, über den alle Entwickler via ssh Zugriff auf die Repositories haben. Die Authentisierung beim Server erfolgt über ssh-public-keys.

Voraussetzung ist ein Linux-Server mit ssh-Zugang und vorhandenen root-Rechten.

Git installieren: Als erstes sollte man auf dem Server git an sich installieren:

root@server:~# aptitude install git-core -y

Git-User anlegen: Danach wird der git-User angelegt und in dessen Home-Verzeichnis gewechselt:

root@server:~# adduser git
root@server:~# cd /home/git



Als nächstes loggt man sich als der git-User ein:

root@server:/home/git# su git

Public-Key-Authentisierung einrichten: Legt den .ssh-Ordner und die Datei mit den authorisierten Keys an:

git@server:~$ mkdir .ssh
git@server:~$ touch .ssh/authorized_keys
git@server:~$ chmod 600 .ssh/authorized_keys

Als nächstes kopiert man den eigenen Public-Key auf den Server. Ich benutze dazu immer das kleine Tool ssh-copy-id, man kann es natürlich auch manuell machen, da das authorized_keys-File nur eine Textdatei ist. Den eigenen Public-Key findet man normalerweise im eigenen home-Verzeichnis im Ordner “.shh“. Er trägt den Namen “id_rsa.pub

user@host:/home/user$ ssh-copy-id -i $PFAD-ZUM-.SSH-VERZEICHNIS/id_rsa.pub git@$IP-DES-SERVERS

Obigen Befehl führt man auf dem eigenen Rechner aus und nicht auf dem Server.
Hat man noch keinen Public-Key kann man sich einen mit ssh-keygen generieren (Manpage lesen).
Leeres Git-Repository erstellen: Jetzt können wir auf dem Server eine leeres git-Repository erstellen:

git@server:~$ mkdir testrepo.git
git@server:~$ cd testrepo.git
git@server:~$ git --bare init

Folgende Meldung sollte erscheinen:

Initialized empty Git repository in /home/git/testrepo.git

Erster Commit: So auf dem Server sind wir jetzt fast fertig. Vor der letzten Änderung auf dem Server testen wir noch, ob alles wie gewünscht funktioniert, indem wir einen ersten commit in das Repository machen. Auf dem eigenen Rechner:

user@host:~$ git clone ssh://git@$IP-ADRESSE/~/testrepo.git
Initialized empty Git repository in /home/user/testrepo/.git/
warning: You appear to have cloned an empty repository.

Für diese Anleitung erstelle ich jetzt einfach eine kleine Textdatei und commite diese und pushe die Änderungen dann auf den Server:

user@home:~/testrepo$ echo "Das wird der erste Commit" > testdatei
user@home:~/testrepo$ git add testdatei
user@home:~/testrepo$ git commit -am "Erster Commit"
[master (root-commit) c6b03a5] Erster Commit
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 testdatei
user@home:~/testrepo$ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 243 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://git@$IP-ADRESSE/~/testrepo.git
* [new branch] master -> master

So damit läuft der Server :mrgreen:
Jeder, der Zugriff auf das Repo habe will, muss euch jetzt sein Public-Key zuschicken, damit ihr ihn an das authorized_keys-File anhängen könnt.
Login-Shell des git-Users deaktivieren: Damit das nicht Missbraucht wird, verhindern wir jetzt noch, dass man über den git-User auf dem Server eine Login-Shell bekommt. Hierzu loggt man sich zuerst als root auf dem Server ein.

Roland hat angemerkt, dass man das ganze auch sehr komfortabel mit usermod erledigen kann:

root@server:~# usermod -s /usr/bin/git-shell git

Hier trotzdem noch der manuelle Weg:
Hierzu loggt man sich als root auf dem Server ein und öffnet die /etc/passwd:

root@server:~# vi /etc/passwd

Dort ändern wir die Shell des git-Users von /bin/bash auf /usr/bin/git-shell:

git:x:1001:1001:,,,:/home/git:/bin/bash

wird zu:

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

Versucht man sich mit dem git-User per ssh einzuloggen erscheint folgende

Meldung: "fatal: What do you think I am? A shell?"

Ob man anstatt der git-shell auch wie üblich einfach /bin/false verwenden kann habe ich nicht ausprobiert. EDIT: Inzwischen weiß ich, dass die git-shell nur die Befehle git push und git pull  durchlässt, den Rest allerdings filtert. Es ist also zwingend notwendig /usr/bin/git-shell zu verwenden.

Obwohl jeder, der Zugriff auf des Repository hat, über den git-User auf den Server geht, sind die Commits übrigens nicht immer vom gleichen User, sondern werden wie gewohnt durch die user-option von git festgelegt. Diese Optionen kann man global durch eine Datei mit dem Namen “.gitconfig” im eigenen Home-Verzeichnis ferstlegen. Mehr dazu hier.

Ja und jetzt kann man anfangen mit Git zu arbeiten! Man wird nie wieder SVN, CVS oder ähnliches verwenden wollen! Git ist toll! Love Siehe auch “Warum git besser als X ist

Meine Quellen: Pro-Git Kapitel 4 und Bradley Wrigths Blogpost

11 thoughts on “GIT-Server für kleine Entwicklergruppen aufsetzen einrichten (Debian basiert)”

  1. To avoid following error message:

    fatal: Interactive git shell is not enabled.
    hint: ~/git-shell-commands should exist and have read and execute access.

    Following should be done on the server:

    git@server:~$ mkdir git-shell-commands
    git@server:~$ cd git-shell-commands
    git@server:~/git-shell-commands$ cat > help <<EOF
    #!/bin/sh
    if tty -s
    then
    echo
    echo "fatal: What do you think I am? A shell?"
    echo "type 'exit' to leave."
    fi
    EOF
    git@server:~/git-shell-commands$ chmod u+x help

  2. The error message occured on a Debian Wheezy machine with ‘git version 1.7.10.4’.

  3. Habe alles so gemacht, wie es oben steht, jeodch kann ich noch immer per SSH (Putty) auf den angelegten Gitbenutzer zugreifen.

    Ist das normal oder gilt die Meldung nur über die Git Bash?

    Falls noch nen Service neugestartet werden muss, bitte diesen nennen, danke ;).

  4. Schade, keine Editierfunktion, dann halt noch nen Kommentar:

    Ich werde jedes mal nach dem PW vom angelegten Gituser auf dem Server gefragt (laut dem Tut wäre das Git).

    Nur beim klonen wurde nach meinem PC-User gefragt, was allerdings nicht sein darf, da ich mich doch normalerweise nicht über den Shell-User authentifiziere.

    Also entweder läuft unter Debian 7 etwas schief oder unter Win8 Pro (64bit) mit Tortoise GIT läuft etwas schief, bitte da um Hilfe.

  5. Wenn du die Loginshell auf /usr/bin/git-shell umgestellt hast, sollten eigentlich nur noch die Befehle git push und git pull durchgehen.

    Falls du nach einem Passwort gefragt wirst, ist das immer ein Zeichen dafür, dass dein Public-Key nicht korrekt in die .shh/authorized_hosts eingetragen ist. Du müsstest dann beim pullen oder pushen korrekterweise nach dem Passwort für dein Publickey gefragt werden und nicht nach dem Passwort des Git-Users.

  6. Danke für das Tuto!
    Anmerkung: Um die Datei /etc/passwd nicht von Hand bearbeiten zu müssen geht’s auch wie folgt:

    root@server:~# usermod -s /usr/bin/git-shell git

  7. @Roland
    Danke für den Hinweis, das ist in der Tat komfortabler. Ich habe den Tipp mit in den Beitrag eingefügt!

  8. Hi,
    herzlichen Dank fuer diese coole Beschreibung. Von den ganzen oberschlauen im Internet, dies ist die Beste. Es funktioniert auf Anhieb. In der Kürze liegt die Würze….;=)

    LG

    Paul

Leave a Reply

Your email address will not be published. Required fields are marked *