noqqe


blog | sammelsurium | projects | about

Mirroring gitolite

2013-02-17 @ administration, debian, devops, git, gitolite, mirror, shell, slave

gitolite hat einen eingebauten Mechanismus sich selbst zu replizieren. Finde aber unschön dass ich dafür einen zweiten gitolite betreiben und neue Repos auf beiden Systemen anlegen muss.

Wie also das Backup realisieren. rsync für git ist in an so vielen Stellen eine Verschwendung von Ressourcen, Zeit und Funktionalität. Macht einfach keinen Sinn.

Wer sich schonmal mit

ssh git@git.example.com

auf seinen Server verbunden hat weiss aber, dass bei vorhandenem Public Key alle für diesen User verfügbaren Repositories ausgespuckt werden. Mit diesem Feature kann man sich den Slave einfach selber bauen.

#!/bin/bash

MASTER="git@git.example.com"
BASEDIR="/data/gitslave/"

for repo in $(ssh $MASTER | grep '^ R' | awk '{print $3}') ; do
  if [ -d $BASEDIR/$repo ]; then
    cd $BASEDIR/$repo
    for rbranch in $(git branch -a | grep -v '^*\ master\|HEAD\ -' | awk -F/ '{print $3}'); do
      git checkout $rbranch
      git pull origin $rbranch
    done
    cd -
  else
    git clone $MASTER:$repo $BASEDIR/$repo
  fi
done  &>/dev/null

Das Skript clont eigenständig alle Remote Branches und neue Repositories. Relativ pragmatischer Ansatz. Der Übersichtlichkeit halber, habe ich die logger Commands jetzt weggelassen.

Wems gefällt darfs behalten.

Comments (2)

spion on 2013-02-17T21:38:48
das ganze mit logger gibts wo? ;)

Ranlvor on 2013-02-18T15:12:25
soweit ich weiß kannst du die Schleife, die über alle Branches iteriert weglassen und dafür git fetch origin benutzen, das sollte alle Branches laden und mit Namen nach dem Muster origin/<name> verfügbar machen. Wenn du wirklich alle Branches direkt im Hauptnamespace haben willst kannst du auch einmal mit git fetch origin alle Branches laden und mit git checkout $rbranch; git merge origin/$rbranch die merges durchführen, dann musst du für jedes Repository nur eine SSH Verbindung und nicht eine pro Branch aufbauen.</name>