(Updated 2022-05-11)
Almost all of the command line tools I use on my Mac workstation, on my
development server in the cloud, and on my company’s Linux server infrastructure
store their configuration in so-called “dotfiles” — files (or even whole
directories) in my user home directory that are hidden from plain sight by
prefixing their name with a period, for example .vimrc
. (Like this example,
actually quite a few of these files do end in rc
. That’s why they’re sometimes
also called “rc files”.)
On dev.to, Jonathan Carter asked “How do you manage and synchronize your dotfiles across multiple machines?” Since “multiple” in my case means “more than 500 servers” (we operate a managed high-performance hosting platform for Drupal and WordPress), I thought I’d answer his question in a short blog post.
dotfile management
I maintain my dotfiles in a public dotfiles repository which I clone to every machine I want to customize. I then create a symlink for each file to where in the filesystem it needs to appear. This separation allows me to maintain my original dotfiles dot-free, i.e. as normal, visible files.
The key to keeping this symlinking process simple and error-free is the tool rcm. It can handle one or more dotfiles directories, each with its own precedence.
You can also provide it with tag names that switch between alternative versions
of a file. For example, the BSD subsystem on the Mac sometimes behaves a bit
differently from Linux. In this case, I maintain alternative versions stored in
subfolders starting with tag-
. My dotfile deployment then installs the correct
version depending on the host OS (more on that below).
Using a post-up
hook, you can add steps that need to happen after the dotfiles
are in place, for example launching vim to update its plugins.
I install rcm right after setting up a new development machine (which usually only happens once or twice a year). On our servers, it gets installed automatically via our configuration management software Chef.
dotfile deployment
Here’s a short example script that clones and deploys a dotfiles repository. For
my actual version, check the setup
script in the repository.
#!/bin/bash
if ! which rcup >/dev/null; then
echo "Fatal: rcm is not installed on this machine."
exit 1
fi
os_type=$(uname -s)
if [[ -d ~/.dotfiles ]]; then
cd ~/.dotfiles
git pull
else
git clone <repo URL> ~/.dotfiles
fi
rcup -f -t $os_type -d ~/.dotfiles
As you can see, it clones the dotfiles repository and calls rcup
using an
OS-specific tag (“linux” or “darwin”).
As for the initial deployment on a new machine, I simply curlbash my setup
script:
curl -L https://gitlab.com/geewiz/dotfiles/-/raw/main/setup | bash
rcm
then takes care of the rest.
That’s how I manage and deploy my dotfiles to have a consistent setup across all my work machines and our hosting infrastructure.
If you’d like to watch me put these nifty dotfiles to good use, join me on Twitch for my next live coding session!