GNU Stow Unrelated Administrative Note: I don't want to go back and modify all the other posts, but going forward this phlog will wrap lines to 50 characters so they look good on mobile (this is based on a Mastodon post by solderpunk which asked people to test what widths worked well on common mobile platforms). Regularly Scheduled Programming: Like many programmers who "exist" on lots of different systems, I like to manage various "dotfiles" (configuration files) using version control (in my case, Git). I also tend to like using the latest and greatest versions of open source software, and as a result I install from source files very often on a variety of platforms. Also, since I have accounts on several public access UNIX systems, I am used to installing software on constrained accounts where I can't install to system directories and often don't want to bother admins for software that may not be applicable to all users of the system. I use GNU Stow [1] to help me manage both dotfiles and source installations. GNU Stow is essentially a symlink manager. The prescribed way on the GNU Stow site is to manage source installations where you *can* install to system directories like /usr/local. So, you'd have a folder like /usr/local/stow/foo for package foo and /usr/local/stow/bar for package bar. When you install from source, you set the PREFIX in the configure or make step to /usr/local/stow/foo, and you get /usr/local/stow/foo/[bin,share]. Now, you can go into /usr/local/stow and type `stow foo`, which will take everything inside that directory and symlink it one level up (this too is configurable - you can have it put the symlinks anywhere). This does the right (safe) thing and doesn't clobber anything. If /usr/local/bin already exists (it probably does), then it will symlink to the actual binaries inside of /usr/local/stow/foo/bin. You can probably see where I'm going here, but this works in the same way for "local" installs. Pick a directory under your $HOME that you want source installs to live in. I'd recommend $HOME/.local. Under that directory, make a "stow" directory, and then everything from the above applies cleanly. You will need to add $HOME/.local/bin to your $PATH and $HOME/.local/share/man to your $MANPATH among other potential environment variables depending on what you're installing. Now, when you compile a new version, you can move the old $HOME/.local/stow/foo directory to foo-version and make a new foo directory to send the compiled files to. Now your symlinks stay the same but you installed a new version. Also, the old version is still around if you need to roll back quickly. If you want to delete a package, go to your stow directory and run `stow -D foo` and the symlinks are gone! No more hunting around for stray files in random directories. Dotfiles Dotfiles can be managed similarly, check out this [1] excellent blog post about it. The TL;DR is: have a folder called "dotfiles" in your $HOME that contains folders for all the programs whose config files you want to track. For me, that involves config files like ".bashrc" and the things in ".vim", so I have folders under $HOME/dotfiles called "vim" and "bash". Move your actual dotfiles from your $HOME dir to the right folder under $HOME/dotfiles (.bashrc goes to $HOME/dotfiles/bash for example). Then, in $HOME/dotfiles, run `stow bash` and `stow vim`. Now, all your configuration files are in one place, and they can be source controlled easily. Enjoy! [1] https://www.gnu.org/software/stow/ [2] http://brandon.invergo.net/news/2012-05-26-using-gnu-stow-to-manage-your-dotfiles.html