git archive
Ein weiteres nettes Feature von git sind die Möglichkeiten, die git archive bietet. So läßt sich der Inhalt eines git-Repositories leicht in ein tar-File packen, bspw. für ein Release.
Voraussetzung dafür ist beim Zugriff über git-daemon, daß der entsprechende Service aktiviert ist; für das Debian-Paket bedeutet das die Erweiterung des Aufrufs in /etc/sv/git-daemon/run um den Parameter "--enable=upload-archive".
Dann aber kann mit einem Aufruf wie
git archive --format=tar --remote=git://git.domain.example/$REPO.git --prefix=$PREFIX/ $TAG | gzip > $REPO.tar.gz
aus dem Repository $REPO.git dessen Inhalt bei Commit (oder an der Spitze des Branches, oder an dem Tag) $TAG in eine .tar.gz-Datei gepackt werden, wobei die Dateien ein $PREFIX vorangestellt bekommen.
git archive --format=tar --remote=git://git.domain.example/myprog.git --prefix=myprog-2.17/ 2.17 | gzip > myprog-2.17.tar.gz
erzeugt also aus dem Repository myprog.git in der mit "2.17" getaggten Version eine Datei myprog-2.17.tar.gz, die alle im Repository enthaltenen Dateien mit dem Verzeichnis-Präfix "myprog-2.17/" enthält.
Das ganze läßt sich noch etwas aufpeppen, wenn man bspw. bestimmte Dateien (.gitignore, ...) aus dem Repository nicht im Tarball haben möchte und/oder noch andere Änderungen vornehmen will, wie bspw. die Erzeugung eines README aus der eingebetteten POD-Dokumentation:
- #! /bin/bash
- # do a release of myprog
- # $1: version number
- # make tempdir
- tempdir=`mktemp -td myprog-XXXXX`
- git archive --format=tar --remote=git://git.domain.example/myprog.git --prefix=myprog-$1/ $1 | (cd $tempdir && tar xf -)
- cd $tempdir/myprog-$1/
- pod2text -l myprog.pl README
- rm .gitignore
- cd $tempdir
- tar -czf /var/www/myprog/download/myprog-$1.tar.gz myprog-$1/
- rm -r $tempdir
Und schließlich kann man auf diese Weise auch nur eine einzelne Datei aus dem Repository extrahieren:
git archive --format=tar --remote=git://git.domain.example/repository.git master beispiel.txt | tar xf -
extrahiert die Datei beispiel.txt aus der Spitze des Branches master des Repositorys repository.git.
Ich finde das alles ausgesprochen praktisch.