Dotfiles bijhouden met Git en Stow

Ik gebruik al aardig wat jaren Linux en andere Unix-achtigen, en dat betekent dat ik de nodige dotfiles heb verzameld. Omwille van een consistente omgeving, of ik nou op de desktop, de server of mijn telefoon een shell open trek, moeten die dotfiles ook nog eens tussen meerdere computers en apparaten gesynchroniseerd worden.

Dotwattes

Voor de lezers thuis die de term dotfile niet kennen: de meeste Linux/Unix-applicaties en zeker die voor de command line, zijn te configureren met kleine tekstbestandjes die in je thuisdirectory staan, of ergens onder de directory .config in je thuisdirectory. Meestal hebben die een naam die begint met een punt, omdat dat er in een Unix-omgeving voor zorgt dat zo'n bestandje onzichtbaar is. Een bestandje met een punt, een dotfile dus. Voorbeelden daarvan zijn .zshrc, waarin de configuratie van de ZSH-shell wordt vastgelegd, en .vimrc waarmee je de allerbeste editor ter wereld volledig naar je hand kunt zetten.

Naarmate je langer in de commandline leeft, bouw je een steeds grotere verzameling veelgebruikte, en dus geconfigureerde, programma's op. Dat is rommelig, maar vooral: het is een boel werk om al die bestandjes synchroon te houden als je meerdere computers gebruikt. Nou is Git natuurlijk het perfecte gereedschap om een slootje tekstbestanden in een versiebeheer te bewaren en op meerdere plekken neer te plempen, maar dan zit je nog met bestandjes die in je thuisdirectory horen, maar daar niet staan. En je hele thuisdirectory in een Git-repo zetten is ook niet verstandig, veel te veel kans dat je per ongeluk een enorm of een gevoelig bestand incheckt.

Dat kan handiger.

De ijverige nerds van GNU bedachten Stow als gereedschapje om makkelijk meerdere versies van programma's en bestanden heen en weer te kunnen schuiven, en dat is precies wat we nodig hebben voor het temmen van onze verzameling dotfiles.

Voorbereiding voor het betere stouw-werk

Ergens onder je thuisdirectory maak je een directory waaruit Stow mag werken, de stow directory in Stow-taal. In mijn geval heb ik die directory na lang wikken en wegen dotfiles genoemd. Die directory kan eventueel een git-repository zijn als je je dotfiles in versiebeheer wil hebben. Ik wil dat, uiteraard, dus dat is bij mij het geval.

Onder die werkdirectory dotfiles, maak je subdirectories aan voor elke groep bestanden (elke applicatie waarvoor je één of meer configuratiebestanden wil laten beheren). In Stow-terminologie heet zo'n subdirectory een package. In mijn geval staan daar bijvoorbeeld vim, zsh en ranger.

Onder elk package kun je nu de diverse bestanden en directorystructuren onderbrengen die je normaal geproken in je thuisdirectory zou onderbrengen:

  • Zo staan bij mij onder de package vim bijvoorbeeld de directory .vim met daarin vimrc, gvimrc, een directory autoload/, enzovoorts. Ook staat er in de package een symlink van .vim naar .config/nvim.
  • In de package zsh staat enkel een bestand .zshrc.
  • In de package ranger staat een directorystructuur .config/ranger/, met daaronder een rc.conf en een directory plugins/ met wat spul.

En dan: stouwen maar

Het aanmaken van alle benodigde symlinks is nu simpelweg een kwestie van in je stow directory gaan staan (dus in mijn geval ~/dotfiles), en dan stow package uit te voeren, dus voor mij bijvoorbeeld stow vim, stow zsh en stow ranger.

Stow maakt dan symlinks van alles onder de package directory, in de directory boven de stow directory. Mocht dat een hele directorystructuur zijn, dan wordt die keurig over eventuele bestaande directories heen gelegd, dus allerlei packages die allemaal wat onder ~/.config kwijt willen, zitten elkaar niet in de weg. En door alles in packages op te delen, kun je zelf bepalen wat je op welke host allemaal wil uitrollen; voor mij zullen packages als vim en zsh nagenoeg overal worden uitgerold, maar ranger hoeft niet per se op mijn telefoon aanwezig te zijn, en een package waarin ik grafische applicaties configureer (een windowmanager, bijvoorbeeld), zijn op de server natuurlijk niet nodig. Door die niet te stowen, vervuil ik in die gevallen niet onnodig mijn thuisdirectory.

Stow heeft er nog wat extra opties bij om het proces ongedaan te maken of handmatig een stow dir aan te geven, maar in de meeste gevallen heb je die niet eens nodig.

Versiebeheer

Het stukje versiebeheer is eenvoudigweg een kwestie van de relevante git-commando's uitvoeren op je stow-directory als je wijzigingen in een configuratie hebt gemaakt.

Aangezien met Stow met symlinks werkt, worden wijzigingen uiteindelijk gemaakt in de bestanden die onder de stow-directory staan. Andersom zijn wijzigingen die daar worden doorgevoerd — door een git pull, bijvoorbeeld — ook direct op je daadwerkelijke dotfiles van toepassing.

Voor nu heb ik mijn dotfiles nog bij GitHub staan, maar omdat dat ook steeds meer een ommuurde tuin wordt, wordt het tijd ze daar eens weg te verhuizen. Uiteindelijk maakt dat voor Stow verder niet uit, natuurlijk.

Dit artikel is losjes gebaseerd op, en in ieder geval flink geïnspireerd door, dit artikel van Brandon Invergo. Foto: Caroline Selfors, Unsplash.

Je gebruikt een browser die Google's FLOC gebruikt en daarmee op je spioneert. Lees hier meer over waarom dat een slecht idee is.