Git Server für mehrere Benutzer einrichten

Wie man Git auf einem Ubuntuserver aufsetzt hatte ich vor einiger Zeit in einem Artikel beschrieben. Nachteil der vorgestellten Methode ist, das sie sich nur für einen Nutzer eignet. Natürlich kann man mit dieser Methode auch mehrere Nutzer zu dem Repositories verbinden, hat damit aber keine Möglichkeit mehr Zugriffsberechtigungen für die Repositories zu setzen.

Als Lösung für das Problem wird Gitolite für die Nutzer und Rechteverwaltung genutzt. Im ersten Schritt werden auf dem Server die notwendigen Pakete installiert:

sudo apt-get install git openssh-server perl

Als nächster Schritt wird der Nutzer angelegt, in welchem Gitolite läuft und in diesen gewechselt:

sudo useradd -m git
sudo su git

Danach geht es auch schon an die Installation von Gitolite:

cd ~
git clone git://github.com/sitaramc/gitolite
mkdir bin
cd gitolite
./install -ln

Anschließend muss der öffentliche SSH Schlüssel von dem Rechner mit welchem auf das System zugriffen werden soll in den Home Ordner des „git“ Nutzers kopiert werden. Anschließend kann das Setup abgeschlossen werden:

cd ~/bin
./gitolite setup -pk $HOME/seeseekey.pub

Damit ist das Setup abgeschlossen und es kann an die Konfiguration gehen. Dazu wird vom Rechner dessen Public Key beim Setup benutzt wurde das entsprechende administrative Repository geklont:

git clone git@192.168.1.128:gitolite-admin

Die Dateistruktur des Repositories sieht dabei wie folgt aus:

conf
  gitolite.conf
keydir
  seeseekey.pub

In dem Verzeichnis „keydir“ sind die SSH Schlüssel enthalten. Um einen Nutzer hinzuzufügen reicht es einfach einen neuen öffentlichen Schlüssel in das Verzeichnis zu legen und das ganze ins Git Repository einzubringen. Die eigentliche Konfiguration der Repositories erfolgt in der „gitolite.conf“ Datei. Diese sieht nach der Erzeugung so aus:

repo gitolite-admin
    RW+     =   seeseekey

repo testing
    RW+     =        @all

Das bedeutet das es zwei Repositores gibt, eines trägt den Namen „gitolite-admin“ und dient der Verwaltung. Das zweite Repository ist „testing“ auf das alle Nutzer zugreifen dürfen. Benötigt man nun ein neues Repository, so fügt man einen neuen „repo“ Abschnitt mit dem Namen und den entsprechenden Rechten hinzu. Sobald das ganze commitet und gepusht wurde, legt Gitolite das neue Repository an. Wenn man bei den Schlüsseln mehrere SSH Schlüssel pro Nutzer wünscht, so legt man dafür am besten eine Verzeichnisstruktur an:

keydir
  seeseekey
    rechner1
      seeseekey.pub
    rechner2
      seeseekey.pub

Möchte man ein Repository löschen so entfernt man es aus der „gitolite.conf“ und löscht es anschließend auch vom Server. Damit hat man eine Lösung für Git Server mit mehren Nutzern und und entsprechender Verwaltung.

Firmware des Raspberry Pi updaten

Während das Linux auf einem Raspberry Pi ohne Probleme geupdatet werden kann, sieht dies bei der Firmware etwas anders aus. Hier ist Handarbeit gefragt. Dazu wird im ersten Schritt Git installiert:

sudo apt-get install git

Damit das Update der Firmware nicht in Arbeit ausartet, sollte man „rpi-update“ nutzen, welches unter https://github.com/Hexxeh/rpi-update/ zu finden ist. Mittels:

sudo wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update && sudo chmod +x /usr/bin/rpi-update

wird das ganze auf dem Raspberry Pi installiert. Nun kann das Firmware Update mit:

sudo rpi-update

angestoßen werden. Die Dauer eines Updates beträgt etwa fünf Minuten. Nach dem erfolgreichen Update muss der Raspberry Pi neugestartet werden.

Git auf dem Server

Möchte man auf einem Ubuntusystem einen Git Server aufsetzen, so ist dies relativ schnell erledigt. Zuerst muss dafür „git“ mittels:

apt-get install git

installiert werden. Danach wird der passende Nutzer für die Git Repositories angelegt:

adduser git

Nun kann man ein bestehendes Repository zu diesem Server hochladen. Auf dem Server wird in den Kontext des Nutzers „git“ gewechselt und dort ein passender Ordner sowie ein „rohes“ Git Repository angelegt:

su git
mkdir testproject.git
cd testproject.git
git init --bare

Dem lokalen Git Repository wird mittels:

git remote add origin :testproject.git

ein neuer Remote zugewiesen. Sollte bereits ein „remote“ für „origin“ existieren, so wird dieser mit:

git remote rm origin

entfernt. Anschließend kann das lokale Repository an den Server übertragen werden und auf Updates überprüft werden:

git push origin master
git pull origin master

Wenn gewünscht kann man nun noch verhindern das man sich mittels des „git“ Accounts auf dem Server anmelden kann. Dazu muss die Datei „/etc/passwd“ editiert werden. Für den Nutzer „git“ wird die Shell dabei von „/bin/bash“ in „/usr/bin/git-shell“ geändert. Anschließend kann man sich mit dem Account nicht mehr an der Shell anmelden.

Lokale Revision eines Git Repositories ermitteln

Möchte man die lokale Revision eines Git Repositories ermitteln so reicht es in der Konsole:

git log -n 1

einzugeben. Das ganze sieht auf dem Terminal dann so aus:

commit 1c40074d28676ec996ec91f1719cff43077f15f6
Author: Example <>
Date:   Tue Jan 3 09:52:23 2013 +0800

    Bugfixes in example function.

Soll nur der Hash ausgeben werden so muss die Kommandozeile wie folgt aussehen:

git log -n 1 --pretty=format:"%H"

Damit bekommt man dann nur den entsprechenden Hashwert ausgegeben.

Bashskript zur Aktualisierung von Repositories

Bei mir auf der Festplatte liegen einige Quelltext in Form von Subversion und Git Repositories. Da es mühsam wäre jedes einzelne Repository zu aktualisieren, habe ich mir ein kleines Skript geschrieben, welches diese Aufgabe abnimmt:

#bash

#Update repositories script
#Copyright (c) 2012 by seeseekey <>
#
#This program is free software: you can redistribute it and/or modify
#it under the terms of the GNU General Public License as published by
#the Free Software Foundation, either version 3 of the License, or
#(at your option) any later version.
#
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#GNU General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with this program.  If not, see <http://www.gnu.org/licenses/>.

SCRIPTPATH=$(pwd);

#Git
for directory in `find $SCRIPTPATH -name ".git" -type d`;
do
  echo $directory;
  cd $directory/..;
  git pull;
done

#Subversion
for directory in `find $SCRIPTPATH -name ".svn" -type d`;
do
  echo $directory;
  cd $directory/..;
  svn update;
done

#Pfad zurücksetzen
cd $SCRIPTPATH;

Das Skript selbst steht dabei unter GPLv3 und kann auch direkt auf Github unter https://github.com/seeseekey/archive/blob/master/Bash/Git/updateRepositories.sh gefunden werden.