Simple dotfile management concept based on symlinks
Find a file
2021-09-13 13:57:53 +02:00
common/mpv initial commit 2021-09-07 11:47:41 +02:00
machines initial commit 2021-09-07 11:47:41 +02:00
dotlink add unlink and help 2021-09-12 00:29:11 +02:00
README.org update README 2021-09-13 13:57:53 +02:00

dotlink

There are countless ways of managing your dotfiles.. this is also one. After trying several approaches and switching between different setups, this method finally met all of my requirements:

  • As simple as possible
  • Multiple machines are managed in one repository
  • Identical configurations for one program on several machines only need to be adjusted in one place
  • Different configurations for one program on several machines 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 machines (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.

Concept

The concept is based on symlinks and two directories, common and machines.

The machines directory contains subdirectories for all machines on which dotfiles are managed. They need to match the hostname of the machine (in this repository host1 and host2) and mimic the corresponding $HOME directories.

The common directory contains configs which are present on multiple machines. 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 machines directory to the common directory make the configs available on multiple machines 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
  ├── machines
  │   ├── 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 machines/<hostname> directory can then be linked to the corresponding path into the home directory of the machine. 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.

Script usage

When the dotlink script is executed, all files from the machines/<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 machines directory like in this repository.

  Usage: dotlink [OPTIONS]

  Simple dotfile management based on symlinks.

  OPTIONS
    -h, --help    Show this help message
    -u, --unlink  Remove current links

Adding configuration files for only one host

Add the files to machines/<hostname>/<path_in_home>. If you want to keep all configuration files in the common directory and just use symlinks in the machines directory, you can follow the instructions below.

Adding configuration files for multiple host

It is important that the links from the machines directory to the common directory are relative. Follow these steps to add new configurations for multiple machines:

  1. Add the files somewhere to the common directory
  2. Execute ln -rs common/<config_or_directory> machines/<hostname>/<path_in_home> for every machine on which the files should be present
  3. Execute the dotlink script on every modified machine