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!