My usual method for setting up a new computer is to install
Syncthing and add all my main synchronized
folders, then rsync
any specific dotfiles (.vimrc
,
.gitconfig
, etc) to the new
system.
It’s never super clean, but this does speed me up enough to get moving quickly. I’ve considered
setting up a more global $HOME
sync folder with a ton of excludes, but I want to be a bit more
intentional about updating my system configuration.
I decided to just use a private GitHub repo to store these dotfiles, taking a lot of care to avoid committing any secrets (I like to assume that anything I store on someone else’s computer will eventually be public).
This turned out to be so much easier than I expected, just a simple alias to override the $GIT_DIR
and a custom exclude file to make sure I only add very specific files to this repo.
git init --bare $HOME/.cfg
echo "*" >> $HOME/.cfg/info/exclude
alias dotfile="git --git-dir=$HOME/.cfg/ --work-tree=$HOME"
I have the above alias added to my .zshrc
(so bonus: it is automatically sync’d!) and can do all
the normal git
commands by calling dotfile
:
dotfile remote add origin [email protected]:private/repo.git
dotfile add .gitconfig
dotfile add .zshrc
... # etc
dotfile commit -m 'add my dotfiles'
dotfile push -u github main
Now, to setup a new machine, I need to setup my dotfile repo in my home directory. Just as before
when I initialized a bare git repo with a custom GIT_DIR
, I need to clone my repo on the new
system with the bare flag and pointing to the same .cfg
directory for consistency. You can test
this non-destructively by creating a temporary folder and referencing it instead of $HOME
in the
commands below:
⚠️ This will overrwrite any tracked files in
$HOME
⚠️
git clone --bare [email protected]:private/repo.git $HOME/.cfg
git --git-dir=$HOME/.cfg --work-tree=$HOME checkout -f
Now I can do things like manage OS-specific entries and files via branches, or try out major changes without worrying about leaving myself in a broken state on this machine or another one.