03 September 2015


I have tried several methods of storing and making my dotfiles portable across different machines. There are dozens of excellent programs out there but somehow, I didn't really like any of them. Until my friend demure told me about GNU Stow.

Note: In debian, besides stow, there is a package called xstow which stands for (extended stow). They both work in a similar way.

GNU Stow is not meant to manage your dot files. The typical area of action of stow would be /usr/local  Its main usage is creating links to files in differnet parts of your filesystem so that you can try different versions of the same program (or at least this is what I understood from reading this article: Using GNU Stow to manage your dotfiles). 

And reading that article is precisely how I learnt to use it to create symbolic links to all my dot files while they are perfectly stored in my home in a directory named dotfiles.

The main reason why I like it so much is because Stow does something similar to what I used to do manually. The fact of finding a program that does all the hard work for you automatically is really great.

This is what I used to do before:

I had a dotfiles directory inside my Dropbox folder which synchronized across all my computers. Inside that dotfiles directory I had several files, but I'm going to use the typical .bashrc as an example.

In all my machines I made a symbolic link in my home directory named .bashrc to Dropbox/dotfiles/.bashrc This way all my computers read the same file as if the file was a real one. Make no mistake, the file did exist, but it was only a link after all.

In order to achieve this I had to type:

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

Whenever I made a new installation, I had to do the same for each of my dot files inside my dotfiles directory.

I do not know if you can imagine it, but my dotfiles directory was a little bit chaotic because there are many dot files that have their own dot folder so there were files with a dot, folders with a dot and files inside the dot folders.

What GNU Stow does for you:

With Stow you can keep all your dot files perfectly organized inside their own directory as long as they are inside ~/dotfiles And stow will make a symbolic link to all the right places where the files should go.

For example. You would place your .bashrc inside a directory named bash inside your dotfiles directory. Then you would only have to change to your dotfiles directory and type:

 $ cd ~/dotfiles
 $ stow bash

And be done with it. Isn't this an extraordinary thing?

Note: keep in mind that in debian you can also use xstow instead. It works exactly the same. Thus:

 $ cd ~/dotfiles
 $ xstow bash

Now comes the best part of all. So far my examples have only taken a single file (.bashrc) into account. But sure your dotfiles directory is full of both dot files and dot folders. If you had to go one by one it would be as hard as making the links manually. Well, with stow you can use wildcards to make your life easier.

For example, if you have in your dotfiles directory the following directories:

bash i3 cmus filezilla elinks mr nano gitconfig tmux mc ssh screen supertux

In order to create symbolic links to them all at the same time you can do:

 $ cd ~/dotfiles
 $ stow *

And be happy :)

One important consideration is that in each directory inside your dotfiles directory, you have to keep the skeleton structure of your dotfiles.So that stow knows where to place them. I recommend you take a look at the article I linked to above in order to understand it better.

Another important consideration is that I created a private git repository to use a version control system to keep track of changes to my files.