bare git repo dotfiles


The simplest, aliased-based way is to use the following:

git init --bare $HOME/.dots-git
alias dotconfig='git --git-dir=$HOME/.dots-git/ --work-tree=$HOME'

However, I made a slightly more sophisticated (complicated) shell function to allow me to just use git in $HOME:

function git() {
  # for config file management
  if [[ $(pwd) == ${HOME} ]] ; then
    command git --git-dir=$HOME/.dots-git/ --work-tree=$HOME "$@"
    command git "$@"

This function comes with a caveat: when you need to clone a new repo into $HOME, you need to use /usr/bin/git. I don’t put any repos directly in my $HOME, so it hasn’t been too big of a deal for me in practice.


Now any files in $HOME can be versioned as usual with things like:

dotconfig status
dotconfig add .vimrc
dotconfig commit -m 'add vimrc'
dotconfig push

Or just using git as usual if the above shell function was installed.

To see what files are being tracked:

dotconfig ls-tree --full-tree -r HEAD

Install onto a new system

/usr/bin/git clone --bare https://myrepourl $HOME/.path/used/in/alias
[git|mailconfig|...] checkout

If there are already dotfiles present, then need to back them up and move out of the way:

mkdir -p .config-backup

and rerun git checkout

We’ll also want the following settings for the repo:

[remote "origin"]
        url =
        fetch = +refs/heads/*:refs/remotes/origin/*
        showUntrackedFiles = no