Control the dotfiles!

Posted: | Updated:

When I was first learning to use GNU/Linux and scripting, I was dead set on creating the bestest backup script. You see, during this period I would very frequently hop distros and I wanted an easy way to restore various settings I wanted. I had never really used any kind of version control system, so methodical usage of tar seemed like the logical choice. Even if it wasn't the best solution, I was trying to do what I could to get the most out of my experience working and playing within this ecosystem. I wanted to shape it as close to exactly what I wanted as possible, and maybe along the way find out new things to try and add to the mix.

It wasn't until a few years later that I was able to implement a system for achieving exactly what I was trying to do with a backups script but without making any traditional backups at all.

Using a so-called 'dotfiles repo' is a pretty common practice. When I was first exposed to the idea I remember thinking "that's neat, I should try something like that out" but didn't really jump on it. now it's not only how I deploy my crap (files, scripts, etc.) but also how I track and "back it up". A dotfiles repo, combined with a way to manage it's state on your system, can be a powerful way to keep your system configured the way you want it while still being simple to maintain.

My system consists of a few components:

src/toasty-dotfiles
├── alucard
│   ├── bin
│   ├── etc
│   ├── games
│   ├── install_all_configs.sh
│   └── setup_alucard.sh
├── richter
│   ├── bin
│   ├── etc
│   ├── install_all_configs.sh
│   └── setup_richter.sh
└── soma
    ├── bin
    ├── desktops
    ├── etc
    ├── games
    ├── hosts
    ├── install_all_dotfiles.sh
    └── setup_soma.sh

There are two shell scripts at play on each machine; one for configuring files in my home directory, and one for taking care of system things after a new install. The new install setup script doesn't do anything crazier than using the package maneger to install desired packages, but it does also backup and and replace a few files under /etc with versions from my repo.

That first file, install_all_dotfiles.sh, contains a list of scripts (under bin) that it needs to make symlinks to. The list is laid out like this:

.bashrc
       bin/aliens-vs-predator-2000
       bin/banished
       bin/daggerfall
       bin/diablo2
       bin/doom3
       bin/duke-server
       bin/duke3d
       bin/dukedc
       bin/dukenwinter
       bin/dukevacation
       bin/dungeon-keeper
       bin/dungeon-keeper2
       bin/dwarf-fortress
       bin/gta-san-andreas
       bin/higan
       bin/martian-dreams
       bin/minecraft
       bin/morrowind
       bin/morrowind-launcher
       bin/pcsx
       bin/ppsspp
       bin/rcr-dos
       bin/sim-city-2000
       bin/ultima6
       bin/ultima7-forge-of-virtue
       bin/ultima7-serpent-isle-silver-seed
       bin/unreal-tournament-goty
       bin/warcraft2
       bin/winsteam
       bin/winsteamwinecfg
       .config/openbox/autostart
       .config/openbox/rc.xml
       .config/openbox/menu.xml
       .config/openmw/openmw.cfg
       .config/openmw/settings.cfg
       .config/tint2/tintwizard.conf
       .config/tint2/tint2rc
       .conkyrc
       .emacs.d/init.el
       .exult.cfg
       games/daggerfall.conf
       games/dungeon_keeper.conf
       games/earthworm_jim.conf
       games/earthworm_jim2.conf
       games/martian_dreams.conf
       games/rcr.conf
       games/sim_city_2k.conf
       games/u6.conf
       games/warcraft2.conf
       .nuvierc
       .oh-my-zsh/custom/mine.zsh
       .oh-my-zsh/themes/larry34.zsh-theme
       .ssh/config
       .vimrc
       .zshrc

The rest of the script consists of three simple bash functions: one to ensure a specific working directory, one to check for (and remove) existing symlinks or rename existing real files, and another to "install" the symlinks to my version-controlled scripts.

If I add a new script, I just add it to my list and run the installer. Simple as that I've got launchers for various things and fine-grained control over them.

You don't have to do it exactly the way I do, but I think that some kind of "dotfiles" repo is a great idea for managing your setup.

This page was last modified on: 2020-07-26