Artikel
3 Kommentare

Dotfiles (bashrc, vimrc,…) mit GitHub synchronisieren und aktuell halten

CC-BY 2.0 by http://www.flickr.com/photos/othree/

Wer kennt das nicht? Die schönen aliase oder die vimrc mal wieder nicht auf dem Server/PC/Notebook/Raspberry Pi vorhanden. Gerade wenn man öfter mal was auf X Rechnern testet, bekommt man häufig von der Shell gesagt, dass es den Befehl gar nicht gibt… eben weil die ganzen Dotfiles fehlen und der Mensch ein Gewohnheitstier ist (‚ll‘ tippt sich einfach schneller als ‚ls -l‘). Mir ging es immer so, dass ich pro Maschine zusammengeschusterte Dotfiles hatte. Und es fehlt immer etwas. Eben auch, weil das passende zentrale Management fehlt.

GitHub does dotfiles

GitHub hat als Einführung eine eigene Seite für die „Punktfiles“ online. Hier finden sich verschiedene Tools, Bootstraps und Beispiele, wie man seine Dotfiles verwalten kann. Unter anderem seien genannt: homesick, fresh,… Was mich abschreckte ist die Komplexität, die für eine relativ einfache Sache benötigt wird. Ja: die Tools können echt viel, aber ich hole mir viel Code ins Boot.

Mit ein paar Zeilen Code immer up to date bleiben

Zum Glück fand ich einen Blogeintrag von Michael Smalley, der sehr übersichtlich und verständlich erklärt, wie man sein eigenes Skript und GitHub-Repository aufsetzen kann. Aufbauend auf diese Anleitung habe ich mir zwei Shellskripts unter ~/.dotfiles angelegt.

#!/bin/bash
############################
# Init-Script
# This script creates symlinks from the home directory to any desired dotfiles in ~/.dotfiles
############################

########## Variables

dir=~/.dotfiles                    # dotfiles directory
olddir=~/.dotfiles_old             # old dotfiles backup directory
files=`ls -1 $dir/__*`    # list of files/folders to symlink in homedir

##########

# create dotfiles_old in homedir
echo "Creating $olddir for backup of any existing dotfiles in ~"
mkdir -p $olddir
echo "...done"

# change to the dotfiles directory
echo "Changing to the $dir directory"
cd $dir
echo "...done"

# move any existing dotfiles in homedir to dotfiles_old directory, then create symlinks 
for file in $files; do
    basename=`basename $file`
    targetname=`echo $basename | sed 's/__//'`
    echo "Moving any existing dotfiles from ~ to $olddir"
    mv ~/.$targetname $olddir/
    echo "Creating symlink to $file in home directory."
    ln -s $dir/$basename ~/.$targetname
done

Dieses Skript erledigt das Backup von „alten“ Dotfiles auf einer neuen Maschine und verlinkt jeweils die im Verzeichnis liegenden Dateien (jeweils mit Prefix „__“). Ich habe mich für diese Variante entschieden, da man relativ einfach neue Dateien integrieren kann. Mit einem „git init“ und dem Hinzufügen der Dateien per „git add $filename“ baut man sich ziemlich schnell sein „dotfiles“-Repository zusammen. Zu dem init-Skript habe ich mir noch ein Skript angelegt, dass nur die lokale Verlinkung übernimmt.

#!/bin/bash
############################
# 
# This script creates symlinks from the home directory to any desired dotfiles in ~/.dotfiles
############################

########## Variables

dir=~/.dotfiles                    # dotfiles directory
files=`ls -1 $dir/__*`    # list of files/folders to symlink in homedir

##########
# change to the dotfiles directory

# move any existing dotfiles in homedir to dotfiles_old directory, then create symlinks 
for file in $files; do
    basename=`basename $file`
    targetname=`echo $basename | sed 's/__//'`
    echo "Creating symlink to $file in home directory."
    ln -s $dir/$basename ~/.$targetname
done

Meine erste Datei war die .vimrc. Also habe ich mir mit vim eine neue Datei unter .dotfiles angelegt, die den Namen __vimrc bekommt. Nachdem ich diese Datei gefüllt hatte, konnte ich mit „init.sh“ die Datei installieren. Es wird im Homeverzeichnis ein Link auf die Datei unter .dotfiles/__vimrc angelegt. Siehe auch:

user@pc ~ $ ll .dotfiles/__vimrc 
-rw-r--r-- 1 user user 1,3K Feb 21 17:32 .dotfiles/__vimrc
user@pc ~ $ ll .vimrc
lrwxrwxrwx 1 user user 30 Feb 16 00:07 .vimrc -> /home/user/.dotfiles/__vimrc

Der Inhalt der vimrc wird absofort immer über .dotfiles/__vimrc verwaltet und im Git-Repository gesichert. Da ich nicht der Git-Profi bin, habe ich mich hier sehr stark an die oben genannte Anleitung gehalten.

Updaten und aktuell halten

Änderungen werden mit einem einfachen „git commit -a“ in das lokale Repository eingecheckt. Sobald man diese Änderungen zu GitHub übertragen möchte, kann man dies mit „git push origin master“ machen. Voraussetzung hierfür ist, dass man die Schritte von Michael zur Einrichtung durchgeführt hat. Einen neuen Rechner kann man dann per „git clone git://github.com/<usernameongit>/dotfiles.git“ aktivieren. Nachdem man seine Skripte ausführbar gemacht hat, kann man man mit „init.sh“ seine Dotfiles installieren. Sollte sich das GitHub Repository in der Zwischenzeit geändert haben, kann man mit einem „git pull“ die aktuellste Version von GitHub ziehen.

Fazit

Für mich hat diese Vorgehensweise zweierlei Vorteile: ich werde so langsam aber sich mit git etwas warm. Weiterhin kann ich nun auf meinem PC, meinem Notebook und auf meinem Raspberry Pi die gleichen Dotfiles verwenden ohne manuell irgendwas durch die Gegend kopieren zu müssen. Veränderungen werden automatisch versioniert und können gezielt zurück geholt werden. Ich hoffe ich konnte Euer Interesse wecken und Ihr könnt mit meinen Infos etwas anfangen. Mein Dotfiles Repo findet sich unter: https://github.com/demaya/dotfiles und wartet nur darauf, von Euch geforked zu werden 🙂

Links

Beitragsbild: CC-BY 2.0 by http://www.flickr.com/photos/othree/

3 Kommentare

  1. Ein cooles Tool das etwas ähnliches macht möchte ich an dieser stelle Empfehlen: Daglink (https://github.com/gfxmonk/daglink)

    Man kann damit Dateien an einen anderen Ort verschieben und mittels einer Beschreibungsdatei festlegen wo sie ursprünglich waren um damit beim Start entsprechende Symlinks erstellen zu lassen. zusätzlich kann man pro Maschine unterschiedliche Dateien anwenden lassen oder an andere Orte symlinken (manches ist bei verschienden Linux-Distributionen ja doch anders).

  2. top! Ich wusste bis eben noch nicht, dass ich so ein Problem überhaupt habe 😉

  3. Allerdings sollte man je nach dotfile auch aufpassen. Zum Beispiel in der muttrc stehen auch Passwörter. Also die lieber nicht über github synchronisieren…

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.