Dotfiles mit fresh verwalten

Meine Systemkonfiguration - überall sofort :-)

Das kennt vermutlich jeder Linux-Nerd (und wahrscheinlich auch noch eine ganze Reihe „normalerer“ Leute): Da hat man sein System behutsam zurechtkonfiguriert, Shell-Aliase eingerichtet, einen hübschen Shell-Prompt zusammengezimmert, seine bevorzugten Standardeinstellungen für git (und sicher viele weitere Programme) hergerichtet – und dann bekommt man einen Account auf einer neuen Maschine, loggt sich dort ein und versucht zu arbeiten… und der erste Wutschrei, der durch das Zimmer hallt, ist „AAAH! It’s all so completely wrong!“.

Dann beginnt das mühsame Kopieren von Konfigurationsdateien, verbunden mit möglicherweise nötigen Anpassungen… und wenn man sich 6 Monate später wieder anmeldet, stellt man fest, daß die eigene Lieblingskonfiguration von der damals Kopierten deutlich divergiert ist: „AAAAH! It’s all so…“

github macht seit längerem Werbung dafür, seine Konfiguration in einem git-Repo zu verwalten, und gibt Tips für Tools, welche einem hier das Leben leichter machen. Ich habe mich dafür entschieden, meine Konfiguration mit fresh zu verwalten. Just add water, do not stir: So muß das funktionieren :-)

Just add water…

fresh bietet die Möglichkeit, Dateien oder Verzeichnisse per symbolischem Link an die gewünschte Stelle zu platzieren. Die Daten können etweder direkt aus dem .dotfiles-Verzeichnis stammen oder aus einem git-Repository referenziert werden. Eine weitere praktische Eigenschaft von fresh: Wird als Ziel mehrfach dieselbe Datei angegeben, so wird diese nicht überschrieben, sondern die Daten aneinander angehängt. So ist es möglich, umfangreiche Konfigurationen (z.B. zsh oder vim) der besseren Übersichtlichkeit halber in Einzeldateien aufzusplitten.

Damit hatte ich eigentlich schon fast alles, was ich für meine Verwaltung wollte: Aufgeräumte Config-Daten an einer zentralen Stelle, automatisches Importieren von fertigen Pakten wie oh my zsh, etc. Verbleibendes Ärgernis: Auf diversen Systemen ist die Software in unterschiedlichen Versonen installiert, so daß die ältere sich über von mir verwendete (unbekannte) Parameter beschwerte.

Berücksichtigung unterschiedlicher Versionen

In meinem Fall ärgerte mich git: Die Konfiguration push.default=simple ist erst ab git 1.8 bekannt. Die Lösung war glücklicherweise einfach umzusetzen: Auch die fresh-Konfigurationsdatei ist nur ein Shellskript! Zusammen mit der Merge-Funktionalität von fresh habe ich meine git-Konfiguration in einen allgemeinen und einen versions-spezifischen Teil aufgeteilt:

# Nur ausführen, wenn git im Pfad vorhanden
if command -v git >/dev/null ; then
  # Generische git-Config
  fresh 'git/*' --file=~/.gitconfig
  # Versionsnummer von git auslesen
  VERSION=`git --version | sed "s/^.* //"`
  # Am Punkt in einen Array aufsplitten
  V=(${VERSION//./ })
  # Datei mit name git-major.minor mergen
  fresh git-${V[0]}.${V[1]} --file=~/.gitconfig --ignore-missing
fi

Ist git 1.8 auf dem System installiert, wird die Datei git-1.8 zur Konfiguration hinzugefügt, bei Version 1.7 die Datei git-1.7.

Mit einem seelenverwandten Kniff deaktiviere ich die vim-Erweiterung „you complete me“ – hier allerdings nicht auf fresh/shell-Basis, sondern direkt in der vim-Konfiguration:

if v:version > 703
  Bundle 'Valloric/YouCompleteMe'
endif

Mit dieser Konfiguration bekomme ich auf jedem System meine gewohnte Umgebung, und das sogar unter Berücksichtigung lokaler Umstände wie der verfügbaren Softwareversionen. Ich bin zufrieden und kann’s nur empfehlen!