Dotfiles mit fresh verwalten

Meine Systemkonfiguration - überall sofort :-)

Das kennt ver­mut­lich jeder Li­nux-Nerd (und wahr­schein­lich auch noch eine ganze Reihe „nor­ma­le­rer“ Leute): Da hat man sein Sys­tem be­hut­sam zu­recht­kon­fi­gu­riert, Shell-Alia­se ein­ge­rich­tet, einen hüb­schen Shell-Prompt zu­sam­men­ge­zim­mert, seine be­vor­zug­ten Stan­dard­ein­stel­lun­gen für git (und si­cher viele wei­te­re Pro­gram­me) her­ge­rich­tet – und dann be­kommt man einen Ac­count auf einer neuen Ma­schi­ne, loggt sich dort ein und ver­sucht zu ar­bei­ten… und der erste Wut­schrei, der durch das Zim­mer hallt, ist „AAAH! It’s all so com­ple­te­ly wrong!“.

Dann be­ginnt das müh­sa­me Ko­pie­ren von Kon­fi­gu­ra­ti­ons­da­tei­en, ver­bun­den mit mög­li­cher­wei­se nö­ti­gen An­pas­sun­gen… und wenn man sich 6 Mo­na­te spä­ter wie­der an­mel­det, stellt man fest, daß die ei­ge­ne Lieb­lings­kon­fi­gu­ra­ti­on von der da­mals Ko­pier­ten deut­lich di­ver­giert ist: „AAAAH! It’s all so…“

git­hub macht seit län­ge­rem Wer­bung dafür, seine Kon­fi­gu­ra­ti­on in einem git-Re­po zu ver­wal­ten, und gibt Tips für Tools, wel­che einem hier das Leben leich­ter ma­chen. Ich habe mich dafür ent­schie­den, meine Kon­fi­gu­ra­ti­on mit fresh zu ver­wal­ten. Just add water, do not stir: So muß das funk­tio­nie­ren :-)

Just add water…

fresh bie­tet die Mög­lich­keit, Da­tei­en oder Ver­zeich­nis­se per sym­bo­li­schem Link an die ge­wünsch­te Stel­le zu plat­zie­ren. Die Daten kön­nen et­we­der di­rekt aus dem .dotfiles-Ver­zeich­nis stam­men oder aus einem git-Re­po­si­to­ry re­fe­ren­ziert wer­den. Eine wei­te­re prak­ti­sche Ei­gen­schaft von fresh: Wird als Ziel mehr­fach die­sel­be Datei an­ge­ge­ben, so wird diese nicht über­schrie­ben, son­dern die Daten an­ein­an­der an­ge­hängt. So ist es mög­lich, um­fang­rei­che Kon­fi­gu­ra­tio­nen (z.B. zsh oder vim) der bes­se­ren Über­sicht­lich­keit hal­ber in Ein­zel­da­tei­en auf­zu­split­ten.

Damit hatte ich ei­gent­lich schon fast alles, was ich für meine Ver­wal­tung woll­te: Auf­ge­räum­te Con­fig-Da­ten an einer zen­tra­len Stel­le, au­to­ma­ti­sches Im­por­tie­ren von fer­ti­gen Pak­ten wie oh my zsh, etc. Ver­blei­ben­des Är­ger­nis: Auf di­ver­sen Sys­te­men ist die Soft­ware in un­ter­schied­li­chen Ver­so­nen in­stal­liert, so daß die äl­te­re sich über von mir ver­wen­de­te (un­be­kann­te) Pa­ra­me­ter be­schwer­te.

Be­rück­sich­ti­gung un­ter­schied­li­cher Ver­sio­nen

In mei­nem Fall är­ger­te mich git: Die Kon­fi­gu­ra­ti­on push.default=simple ist erst ab git 1.8 be­kannt. Die Lö­sung war glück­li­cher­wei­se ein­fach um­zu­set­zen: Auch die fresh-Kon­fi­gu­ra­ti­ons­da­tei ist nur ein Shell­skript! Zu­sam­men mit der Mer­ge-Funk­tio­na­li­tät von fresh habe ich meine git-Kon­fi­gu­ra­ti­on in einen all­ge­mei­nen und einen ver­si­ons-spe­zi­fi­schen Teil auf­ge­teilt:

# 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 Sys­tem in­stal­liert, wird die Datei git-1.8 zur Kon­fi­gu­ra­ti­on hin­zu­ge­fügt, bei Ver­si­on 1.7 die Datei git-1.7.

Mit einem see­len­ver­wand­ten Kniff de­ak­ti­vie­re ich die vim-Er­wei­te­rung „you com­ple­te me“ – hier al­ler­dings nicht auf fresh/shell-Ba­sis, son­dern di­rekt in der vim-Kon­fi­gu­ra­ti­on:

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

Mit die­ser Kon­fi­gu­ra­ti­on be­kom­me ich auf jedem Sys­tem meine ge­wohn­te Um­ge­bung, und das sogar unter Be­rück­sich­ti­gung lo­ka­ler Um­stän­de wie der ver­füg­ba­ren Soft­ware­ver­sio­nen. Ich bin zu­frie­den und kann’s nur emp­feh­len!