There are countless ways of managing your dotfiles.. this is one of them. After trying several approaches and switching between different setups, this method finally met all of my requirements:
- As simple as possible
- Multiple hosts are managed in one repository
- Identical configurations for one program on several hosts only need to be adjusted in one place
- Different configurations for one program on several hosts are no problem
- Set everything up with one command
- Updating configurations shall require nothing more than
git pull
This is a reference repository which contains a bash script (dotlink
) and some example dotfiles for two hosts (host1
and host2
).
Warning: If you want to try this make a backup of your dotfiles! The script doesn’t overwrite existing files but you never know.
The concept is based on symlinks and two directories, common
and hosts
.
The hosts
directory contains subdirectories for all hosts on which dotfiles are managed.
They need to match the hostname of the host (in this repository host1
and host2
) and mimic the corresponding $HOME
directories.
The common
directory contains configs which are present on multiple hosts.
It doesn’t follow any specific structure, you can choose what suits your setup.
Subdirectories with program names, followed by the configuration files (in this repository only mpv
) make probably the most sense but its up to you.
The common
directory should never contain symlinks.
Symlinks from the hosts
directory to the common
directory make the configs available on multiple hosts and they can be adjusted in one place (see mpv
in this repository).
Here is the tree output from this repository:
dotlink/ ├── common │ └── mpv │ ├── input.conf │ └── mpv.conf ├── hosts │ ├── host1 │ │ ├── .config │ │ │ └── mpv -> ../../../common/mpv/ │ │ └── .offlineimaprc │ └── host2 │ └── .config │ ├── beets │ │ └── config.yaml │ └── mpv -> ../../../common/mpv/ └── dotlink
The mpv configuration is shared between hosts, host1
has an OfflineIMAP configuration in his home directory and host2
has a beets configuration in his .config
directory.
Every file from every hosts/<hostname>
directory can then be linked to the corresponding path into the home directory of the host.
This can be done by hand or with help of the dotlink
script.
If you updated a configuration somewhere else just call git pull
and thats it.
When the dotlink
script is executed, all files from the hosts/<hostname>
directory, which matches the current hostname, are linked to their destination in the $HOME
directory.
Executing the script is only neccessary when new files were added which are not linked yet.
The script can be executed from everywhere, it is just important that it’s stored next to a hosts
directory like in this repository.
Usage: dotlink [OPTIONS] Link all files from hosts/$HOSTNAME to $HOME. OPTIONS -h, --help Show this help message and exit -u, --unlink Remove current links
Add the files to hosts/<hostname>/<path_in_home>
and execute the dotlink
script on the modified host.
If you want to keep all configuration files in the common
directory and just use symlinks in the hosts
directory, you can follow the instructions below.
It is important that the links from the hosts
directory to the common
directory are relative.
Follow these steps to add new configurations for multiple hosts:
- Add the files somewhere to the
common
directory - Execute
ln -rs common/<config_or_directory> hosts/<hostname>/<path_in_home>
for every host on which the files should be present - Execute the
dotlink
script on every modified host