For a long time I used NFS for my home dir. That worked great at home and at work where I’d have a desktop and server. But then I got a laptop and that stopped working. For a while I’d rsync things but then I came across a “version control your home dir” article (this one?) and was hooked.
First I used subversion. My earliest commit was in early 2008, but I stripped out a lot of older binaries I’d committed (bad Kevin, no cookie) so supect the initial start was in 2007. It worked well. I had to write a few scripts to fix permissions but otherwise it was fine.
But at the same time I was using git for code. And as time went on the
differences between hg and git were getting more and more annoying. They
weren’t really diverging, I was just less interested in remembering them.
I wanted to use it for my home dir, but for a number of reasons the
idea of a .git dir at the base of my home dir seemed like a bad idea. A
git add . in the wrong place would make me sad.
Until this weekend when I came across vcsh. Not only does it use git and not put a .git dir in your home dir, but it actually allows you to use multiple repos for your home dir. The command line is different, but it’s the same concepts. Since I use pass which has a subset of git commands, it’s a similar concept.
The nice part is that setup is a cinch. The annoying part with my svn or hg methods was setup, with vcsh it goes like this:
The first clones my
home repo. It will usually fail in my case because
something is in the way. So I run the second command (note: clobbers
files) to just force it to go.
After that you can run
vcsh push or
vcsh pull to do the obvious
action in all your home dir repos. To run a command for a specific repo
(say a commit) you just prefix the repo:
vcsh home commit -m "A change"
Now, you do need to be careful. Running
vcsh home status will show loads
of missing files. Vcsh has a per-repo gitignore system which I haven’t
explored yet, but should avoid a number of errors. Wouldn’t want to run
vcsh home add . accidentally in
~/Dropbox for instance.
Vcsh also makes use of myrepos’s
mr command. This is a dependency
vcsh package on Ubuntu but not on [homebrew] so I’ve just
mr to my
~/bin. It’s a useful command. Several projects
I work on have a number of relevant git repos which I organise in
~/src/PROJECT dirs. Now I’ve just added
.mrconfig files to each and
updating a project’s git repos is just a simple
mr up when I get into
the project dir.
mr are just single-file scripts (perl and shell
respectively) so port pretty nicely anywhere.
All in all quite happy with them.