Produnis uninteressant – aber wahr

9. Februar 2017

git poor man’s time machine

Filed under: Arch,Jean Pütz,Professor Hastig,ubuntuusers — produnis @ 23:48

Eine etwas exotischere Verwendungsweise von git ist die einer Time Machine. Das Prinzip einer Time Machine ist, dass für einen Ordner, zB dem eigenen Dokumentenordner, regelmäßige Schnappschüsse erstellt werden. Das Feature ist dann, dass man „durch die Zeit“ blättern kann, um alte Versionen oder gelöschte Dateien zu finden.
Mit git kann man sich soetwas recht einfach erstellen:

Im Terminal wechselt man in das gewünschte Verzeichnis:

cd /Pfad/zum/Verzeichnis

Dort erstellt man ein git-Repository:

git init

Und fügt alle Dateien dem Repository hinzu:

git add *
git commit -m "initial commit"

Jetzt benötigen wir ein Script, welches per Cronjob in den Intervallen ausgeführt wird, die wir gerne für unsere Time Machine Snapshots hätten. Mögliche Cronjobs wären zB.

crontab -e
@hourly /pfad/zu/script.sh
@daily /pfad/zu/script.sh

Die Datei script.sh müssen wir erstellen und ausführbar machen, und ihr folgenden Inhalt geben:

#!/bin/bash
DATE=`date +"%Y-%m-%d_%H-%M-%S"`
cd /path/to/your/folder       # Change to your settings
git checkout -b $DATE
git checkout $DATE
git add *
git commit -m "snapshot of $DATE"
git checkout master
git rebase $DATE

Das Script erstellt einen neuen Branch DATE und führt einen commit auf alle Änderungen im Verzeichnis durch.
Anschließend wird ein rebase des commit auf den Branch „master“ ausgeführt.
Die Änderungen liegen also im Branch DATE als auch im Branch master.

Der Branch DATE wird nicht gelöscht. Er ist der Landepunkt für unsere Zeitmaschine.

Um nun durch die Zeit zu reisen wechselt man im Terminal in das Verzeichnis und gibt ein:

git checkout DATE

wobei DATE ein Zeitstempel ist.
Welche Zeitstempel verfügbar sind zeigt der Befehl

git branch

Der Befehl versetzt euer Verzeichnis in den Zustand, in dem es sich zum Zeitpunkt DATE befunden hat.

Um wieder in die Gegenwart zu wechseln verwendet man den Befehl:

git checkout master

Weblinks

6 Comments »

  1. Warum so kompliziert? Einfach alles auf dem Master machen. Git muss so kein einziges File bewegen.

    git add *; git commit -m ; git branch

    Kommentar by Rene S — 10. Februar 2017 @ 11:50

  2. Ok… da kamen nicht alle Daten mit… hier nochmal.

    Warum so kompliziert? Einfach alles auf dem Master machen. Git muss so kein einziges File bewegen.
    git add *; git commit -m KOMMENTAR; git branch NAME

    Kommentar by Rene S — 10. Februar 2017 @ 11:51

  3. jau stimmt, ist wesentlich einfacher…danke!

    Kommentar by produnis — 10. Februar 2017 @ 11:53

  4. Nur mal 2 Alternativen mit rsync:
    Mit GUI: https://github.com/bit-team/backintime
    CLI: http://rsnapshot.org/

    Kommentar by Tim — 10. Februar 2017 @ 13:18

  5. Wenn wir schon mal bei Alternativen sind… ich mache es mit BTRFS und Snapshots.

    Kommentar by Rene S — 10. Februar 2017 @ 13:30

  6. Nur mal zu dem Script oben: Wenn du gerade am „Browsen“ bist, während das Script ausgeführt wird, entsteht doch ein Branch vom Branch, oder?

    Dann sollte im Script als erstes ein checkout von master passieren, oder?

    Kommentar by Sebastian G — 17. Februar 2017 @ 16:01

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by WordPress