diff options
author | Michał Sapka <michal@sapka.me> | 2023-01-10 17:14:44 +0100 |
---|---|---|
committer | Michał Sapka <michal@sapka.me> | 2023-01-10 17:14:44 +0100 |
commit | d5d27d6b6bbd0d189a3af9a61caa804c53668af6 (patch) | |
tree | 4ef9a560b537460c6fefc25303a706b491ff4385 /content/2022/gnu_stow.md | |
parent | 6fbcd9787ffc367a18cee3acbce01192772813c8 (diff) |
feat: serve posts under year
Diffstat (limited to 'content/2022/gnu_stow.md')
-rw-r--r-- | content/2022/gnu_stow.md | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/content/2022/gnu_stow.md b/content/2022/gnu_stow.md new file mode 100644 index 0000000..a448d4c --- /dev/null +++ b/content/2022/gnu_stow.md @@ -0,0 +1,129 @@ +--- +date: 2022-06-09T19:10:00+02:00 +category: linux +draft: fale +type: productivity +title: Managing dotfiles with GNU Stow +--- +If you are working with linux/bsd based system, you are most likely accustomed to managing +your configs with dotfiles. And you most likely have them stored with Git. But there is the +never ending problem of how to actually use them. I have moved management of this under +GNU Stow. +<!--more--> +Let's take a very typical dotfiles repository. + +``` +./nvim/init.lua +./tmux/tmux.conf +``` + +You want to have those files available as + +``` +~/.config/nvim/init.lua +~/.tmux.conf +``` + +The most popular approach would be to symlink the files under the expected location. We +could also copy the files every time something changes, but that would be crazy. Are we +the stuck with having to do those symlinks manually every time we install a new machine +or create a virtual one? And what if we have dozens of such configs stored under git? + +## Symlink farm + +GNU Stow is a symlink farm. This means, that it's a system aimed at automating creating of +those symlinks. + +[GNU Stow website](https://www.gnu.org/software/stow/manual/stow.html) + +For Stow, the dotfiles directory is called "Stowed" directory. Now comes the cool part. Each folder +in the Stowed directory (called "Package directory") stores a separate directory tree. GNU +Stow will join all those separate trees and create a proper structure under Target Directory, +which by default is the parent of Stowed directory. Let's look at example. + +``` +~/target/stow/one/config/one.conf +~/target/stow/two/config/two.conf +~/target/stow/three/config/three.conf +``` + +So, our home director now has a "Target" directory, which has a "Stow" directory. The Stow +directory stores three configs which we want to sylink as + + +``` +~/target/config/one.conf +~/target/config/two.conf +~/target/config/three.conf +``` + +Let's stow the first one + +``` +cd ~/target/stow +stow one +``` + +And see what happened + +``` +cd ~/target +ls -lA +``` + +We get somethine like + +``` +lrwxrwxrwx 1 msapka wheel 15 Jun 9 23:01 config -> stow/one/config +drwxr-xr-x 5 msapka wheel 4096 Jun 9 22:55 stow +``` + +Stow created a config symlink in the target directory. Very cool, but it gets cooler! Let' +stow the second one + +``` +cd ~/target/stow +stow two +``` + +and what we get + +``` +drwxr-xr-x 2 msapka wheel 4096 Jun 9 23:03 config +drwxr-xr-x 5 msapka wheel 4096 Jun 9 22:55 stow +``` + +Our config is no longer a symlink, but a real folder. Let's see what's inside here. + +``` +cd config +ls -lA +``` + +``` +lrwxrwxrwx 1 msapka wheel 27 Jun 9 23:03 one.conf -> ../stow/two/config/one.conf +lrwxrwxrwx 1 msapka wheel 26 Jun 9 23:03 two.conf -> ../stow/one/config/two.conf +``` + +We have our two configs, but what has happened? Stow looked at both sub trees for "one" and +"two"m and joined then in a way, that is possible. The only way for one.conf and two.conf to +exist in config is if config is a normal directory. Extremely cool! + +Let's image that our target is actually homedir, so we have a ~/dotfiles directory. Then +each package directory can mimic the tree struture of the actual config! Coming back +to our example, we can have a + +``` +~/dotfiles/tmux/.tmux.conf +~/dotfiles/nvim/.config/nvim/init.lua +``` + +Then, after stowing both packages we have symlinks under our desired + + +``` +~/.config/nvim/init.lua +~/.tmux.conf +``` + +GNU Stow is a very simple tool. All we understand what will happen with each sub tree. |