# Manage dotfiles with git I'm managing my dotfiles with git. My method serves me well for a few years already and so I think it's time to write it down. If you think git, you might think of a dotfile repository and dozens of symlinks into the home directory. This is precisely what kept me from using git until I discovered bare repositories. Create your dotfile repository with the `--bare` parameter
git init --bare ${HOME}/.cfg
This creates only a folder for git control files, which normally reside inside the `.git` folder within the repository. You can now tell git to use `${HOME}` as your work-tree directory. This makes git handle your home directory like all the files would be within the git repository. Now you can:
git --git-dir=${HOME}/.cfg/ --work-tree=${HOME} add .vimrc
git --git-dir=${HOME}/.cfg/ --work-tree=${HOME} commit -m "my .vimrc"
If course it is silly to type out such a long command every time you want to interract with your dotfiles. So why not create an alias?
alias config='git --git-dir=${HOME}/.cfg/ --work-tree=${HOME}'
Put this in your `~/.bashrc` or `~/.kshrc` and you can now use the command `config` in the same way you usually use git.
config add .vimrc
config commit -m "my vimrc"
Maybe you have been brave and typed `config status` already. This will list the content of your whole home directory as "untracked files". This is not what we want. We can run `git config` and tell it to stop doing this. But of course we must run our git, which is called `config`.
config config --local status.showUntrackedFiles no
Now git status will only check what's being tracked. So if you add your vimrc file and later change it, `config status` will show it, `config diff` will diff it... You can now use the power of git with your new `config` command. The solution is not perfect, but it comes pretty close...