How to properly store dotfiles in a centralized git repository

4

3

I'd like to put all my dotfiles (like .profile, .gitconfig, etc.) in a central git repository, so I can more easily keep track of the changes. I did this, but I would like to know how to properly handle keeping them in sync with the actual ones in ~/. I thought that you could just hard link the two using ln, but this does not seem to work as I expected, i.e., if I edit one file, the other does not change. Maybe I misused the ln command, or else I misunderstand how hard links work.

How do people usually do this? Judging by GitHub, it's a pretty popular thing to do, so surely there's a seamless way to do it that someone has come up with.

By the way, I'm on Mac OS X 10.6.

asmeurer

Posted 2011-06-26T06:40:54.587

Reputation: 450

Answers

4

Many OS X programs, such as TextEdit, save files in a way that breaks hard links.

At least on Linux, symlinks are usually used for this purpose:

$ ln -s ~/dotfiles/bashrc ~/.bashrc

user1686

Posted 2011-06-26T06:40:54.587

Reputation: 283 655

OK. I've been using TextWrangler to edit the files, so maybe it is screwing them up. I'll try symlinks and see if they work. – asmeurer – 2011-06-28T03:33:57.250

I tried symlinking my .profile file, but source ~/.profile gave -bash: /Users/aaronmeurer/.profile: Too many levels of symbolic links. – asmeurer – 2011-06-28T03:45:46.293

1@asmeurer: You symlinked it to itself. (Remember that link targets are relative to the link itself, not to your current directory.) – user1686 – 2011-06-28T09:10:46.583

I see. It's essential to give absolute paths as arguments to ln. It works when I do that. – asmeurer – 2011-07-10T02:31:30.493

@asmeurer: Not necessarily. ln -s dotfiles/bashrc ~/.bashrc would work as well, as long as you remember that it's relative to ~/. – user1686 – 2011-07-10T09:29:05.197

2

I've been helping build a tool to handle this called freshshell. It's similar to homesick with the added feature of being able to pull in files from any GitHub repository, the idea being that you can grab pieces of other peoples config along side your own.

fresh is a tool to source shell configuration (aliases, functions, etc) from others into your own configuration files. We also support files such as ackrc and gitconfig. Think of it as Bundler for your dot files.

twe4ked

Posted 2011-06-26T06:40:54.587

Reputation: 136

2

I highly recommend vcsh and myrepos to manage your dotfiles via Git (and across multiple machines).

Richard Hartmann’s vcsh allows you to manage all your dotfiles in Git without the need to set up numerous symlinks. The key is that any number of Git repositories can co-exist in parallel in your home directory without getting in each other’s way. Furthermore, vcsh was designed with myrepos in mind. This tool allows you to manage all your version control repositories all at once. Most notably, mr can update all your repositories with one single call. Ideal for setting up all your dotfiles on a new machine with as little effort as possible.

I just published a blog entry that explains how to set up these tools in order that you are able to manage dotfiles quickly and effortlessly. Maybe this is helpful for you.

Martin

Posted 2011-06-26T06:40:54.587

Reputation: 121

1

There is a rubygem: homesick which solves all of this! it supports github out of the box and will symlink everything for you.

protip: if you add changes to the dotfiles you'll still need to clone the repos in a seperate dir, make changes from and there push. then pull them with homesick.

additional if you're using VIM?:

use pathogen because it works really well when managing dotfiles in git. Plugins can be added as submodules and will load effortless.

stefano

Posted 2011-06-26T06:40:54.587

Reputation: 111