I have a lot of dotfiles.
I have dotfiles for my:
I also like to keep things consistent across my different machines. So, I make sure to store all my dotfiles and configurations on GitHub.
But in the past, to keep things in sync, I always had to do something like this:
cp dotfiles/.zshrc ~/.zshrc
I had to do it for every single file or folder I had. This got very annoying until I discovered GNU Stow.
Introducing GNU Stow
GNU Stow is a symlink farm manager, which means it helps you store all your configuration files in one common location.
So when you "stow" a file, it will create a symlink between your file and an identical file in our home directory.
But remember that it will follow the same folder structure as the file. So, if you have a file like:
Then, stow will symlink to the directory:
The main lesson here is that you should organize your dotfiles in the same way you would organize them in your home folder.
For example, this is the structure of my dotfiles:
Using GNU Stow
Let's first install Stow. If you're on MacOS, then installing it is as simple as:
brew install stow
I would then suggest creating a folder in your home directory called dotfiles.
This is where all our common configurations will reside. As an example, we would create a file named
Finally, I just have to run the command
stow . to symlink my files to my parent directory.
If all went well, you should find a
random.txt file in your home directory.
If you version control your dotfiles, then you'd have a
.git directory in your folder.
You'd probably be concerned about Stow symlinking the
.git folder, but fear not Stow will automatically ignore the
This is the
.git folder is specified in the default stow ignore file.
The default stow ignore file looks like this:
If you want to overwrite it, then you can create a local stow ignore file called
For example, I have
Makefile with some useful commands, and I don't want to stow to symlink it.
I can create a
.stow-local-ignore file and specify my
echo "Makefile" >> .stow-local-ignore
Cleaning up symbolic links
If you'd like to get rid of all the symbolic links that Stow created in your home folder, you can do that with the following command:
stow -D .
GNU Stow has fundamentally changed the way I manage my dotfiles.
No more do I have to copy files around.
Symlink is the answer.
GNU Stow is the answer.
Thanks for reading.