Looking for .git in all the wrong places

Like many of you, I store my dotfiles in Git repos. However, I quickly encountered a problem with this approach: my configurations would often get out of sync between my various machines. Instead of writing a script to check for updates or just being diligent about it, I decided that I would integrate my configurations into something on my machines that check for updates already: the system package manager!

Unfortuantely, fixing that problem created a new one. I used to have each configuration directory checked out as a Git repository, so to change or fix something, I only had to make the change, test, commit, and push. But now, it seems that I need to sync my changes between my config directory and a clone to commit and push. However, there's a better way!

GIT_DIR

Although Git looks for .git in an ancestor directory by default, you can override its normal logic for finding the repository directory via the GIT_DIR environment variable. Which means if I want to make a local change and push it, I only need to do the following prep work:

  $ cd ~/.vim
  $ export GIT_DIR=~/projects/vimfiles/.git

Now all of the regular Git commands work as if ~/.vim were a normal repository! Interestingly enough, there is a companion environment variable, GIT_WORK_TREE, that tells Git where the working directory is; if you want to do things the other way around.