git-annex – Dateiverwaltung mit git

git-annexgit ist eine Software zur Versionsverwaltung von Dateien, man benutzt Software dieser Art vor allem um Quellcode zu verwalten, wenn beispielsweise mehrere Entwickler an einem Projekt arbeiten. Git arbeitet jedoch nur im Zusammenhang mit Textdateien effizient, da nur die jeweiligen Änderungen speichert werden. Bei Binärdateien wie Musik und Videos speichert git hingegen jedesmal die komplette Datei neu ab, was zu einem erhöhten Speicherplatzverbrauch führt. Deshalb wurde git-annex neben GitMedia und boar entwickelt, welche das selbe Ziel verfolgen. Weitere Informationen bezüglich git findet ihr auf Wikipedia sowie der offiziellen Homepage.

git-annex ist ein sehr interessantes Tool um Binärdateien zu verwalten, dabei speichert es in git nur Metainformationen. Die Dateien sind in einem Backend gespeichert. Wenn man auf zwei Datenträgern ein sogenanntes „Annex“ anlegt, dann werden die Daten auch nicht automatisch doppelt gespeichert sondern nur Links angelegt. git-annex verwaltet wo die Dateien gespeichert sind, der Nutzer kann auch explizit definieren, wo die Datei gespeichert sein soll und wie viele Kopien es von einer Datei geben soll. Aktuell ist die Bedienung leider noch etwas unkomfortabel, da es sich gegenwärtig nur über die Kommandozeile steuern lässt. Jedoch hat das Projekt auf Kickstarter Spenden organisiert um einen Assistenten für git-annex zu realisieren, damit das Programm auch für den Normalanwender benutzbar wird. Der Entwickler plant damit, als erstes eine Synchronisierung, äquivalent zu der von Dropbox, umzusetzen, welche bereits teilweise implementiert ist und in diesem Zusammenhang gut funktioniert. Als weiterer Punkt steht der Support für Webapp, Android und Windows auf dem Plan, dies soll alles innerhalb eines Jahres entwickelt werden. Das Projekt wird aktuell von einem einzelnen Entwickler vorangetrieben, der jedoch sehr aktiv ist und täglich in seinem Entwicklerblog postet.

Aktuell kann man git-annex lokal und auf Servern mit git Repositorien sowie mit sogenannten “Special Remotes”, was von einem USB Stick bis hin zur Amazon S3 Cloud alles sein kann, benutzen. Um Datensicherheit und Privatsphäre in der Cloud zu gewährleisten unterstützt git-annex Verschlüsselung mit GPG und das Hashen der Dateinamen. Wie man die verschiedenen Funktionen von git-annex benutzt wird hier beschrieben.

Demonstration

Hier eine kurze Demonstration wie man git-annex auf einem Laptop und einer externen Festplatte bedient, dazu muss git-annex jedoch schon installiert sein, für einige populäre Distributionen, wie Debian, Ubuntu, Arch Linux und weitere, gibt es schon vorgebaute Pakete in den Repositorien. Zuerst initialisieren ich auf dem Laptop mein Homeverzeichnis.

% mkdir annex
% cd annex
% git init
Initialisierte leeres Git-Projektarchiv in /home/thorsten/annex/.git/

Dann initialisiere ich git-annex.

% git annex init “Laptop”

Danach werden die Dateien hinzugefügt. Hier kann man das Backend auswählen, in welchem die Daten gespeichert werden. Standardmäßig ist WORM ausgewählt, mit der Option –backend=BACKEND kann dies geändert werden.

% git annex add .

Das kann etwas länger dauern, falls viele Dateien in dem Verzeichnis sind. Danach führen wir einen Commit durch, die Daten werden dadurch persistiert.

% git commit –am “Erste Version im Annex”

Jetzt ist der Annex auf dem Laptop aufgesetzt. Jetzt kann man den Annex auf die USB Festplatte klonen, indem man auf der Festplatte folgendes ausführt.

% cd /media/usb
% git clone ~/annex
% cd annex
% git annex init "USB Festplatte"
% git remote add laptop ~
% cd ~/annex
% git remote add usbdrive /media/usb/annex

Um den Ordnernamen auf der USB Festplatte zu ändern muss der gewünschte Name einfach hinter den clone Befehl geschrieben werden zum Beispiel so:

% git clone ~/annex Laptop

Bisher wurden Verlinkungen auf die Festplatte geschrieben, die Dateien können auf die USB Festplatte kopiert werden indem man sie per “get” holt.

% git annex get “Testdatei”

Mit dem Befehl können einzelne Dateien oder ganze Ordner kopiert werden. Herausfinden wo die Dateien liegen funktioniert so:

% git annex whereis