Mercurial > ~samis > hgweb.cgi > blag
diff posts/Managing_dotfiles_with_vcsh_and_mr.md @ 3:45362e07941c
Add more old posts.
author | Samuel Hodgkins <samuel.hodgkins@sky.com> |
---|---|
date | Sun, 27 Aug 2017 03:02:44 +0100 |
parents | |
children | 2307e281b4b7 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/posts/Managing_dotfiles_with_vcsh_and_mr.md Sun Aug 27 03:02:44 2017 +0100 @@ -0,0 +1,76 @@ +Over time, a Linux user may customize and configure his environment rather substantially. +These modifications are stored in a collection of configuration files / data known as 'dotfiles' (because the first letter of many of them is '.'). +For multiple reasons, it is very beneificial if you track, control and synchronise all of your personal dotfiles, a few example reasons include: +- Having an additional backup +- Being able to see their history, how they changed over time +- Being able to rollback changes if needed (I haven't needed this yet) +- Being able to use the same set of files accross multiple physical/virtual machines +- Being able to share you configuration with the world so people can learn from it just like you learn from other people's. + +However, there is not one single universal method for managing them, instead there are many tools and approaches that one can take. +GitHub provides a decent list of programs [here](https://dotfiles.github.io/) but I intend to summarize the main approaches below. +(It may be worth noting that while the methods may not be mutually exclusive, there is one 'main' approach/method per tool and that is what counts.) + +1. Symlink-driven management involves moving the dotfiles away from their original location, instead creating symbolic links to one or more destinations. + There are many ways/approaches of doing this, but the simplest is to just have a single directory be the destination for all the links. +2. VC(Version Control)-driven management involves less management of actual dotfiles compared to the other two. Instead of copying or using symbolic links, + instead a version-control system is primarily used to track/manage dotfiles in groups. The original dotfiles are left in place, instead they can be treated + just like every other repository. There are multiple methods of implementing this approach with their own unique advantages and drawbacks. +3. Configuration-driven management involves using explicit configuration file(s) to determine exactly what dotfiles are to be managed/tracked as well as how they are to be tracked among other things. + The key difference between this method and the others is that rather than using interactive commands to manage and modify dotfiles, one or more configuration files are used. + Typical formats for this information include YAML/JSON or a purpose-built configuration format. Typically but not exclusively uses symbolic links for dotfiles. + +I have been tracking my dotfiles for short-to-moderate period of time. I originally started when I read an article about using GNU Stow as the management tool. +Stow has some features that make it just as useful for this as a dedicated too: It supports 'packages' so you can choose to install part of the dotfiles. +It also doesn't make you specify specifically which files to symlink, it just symlinks the entire package. +However, it's definitely not perfect: Symlinks can be overwritten, Moving dotfiles and replicating directory structures sucked, and you could only manage operations from the right directory. +(I could also only easily have 1 VCS repo, which effectively meant private dotfiles couldn't be tracked) + +One day, while inspecting my ~/dotfiles I noticed that the .git directory was missing. I could've seen this as a disaster, but I didn't. +I had been thinking about migrating away from Stow for a while, but I never actually did anything - so I took this opportunity. +After some reading/googling, I had made the decision to use `mr` and `vcsh`. +`vcsh` would provide each individual repository, public and private while `mr` would be used for higher-level tasks. +There are multiple guides to this pair of tools, such as: + + * [This very short post on vcsh & mr](https://sumancluster.wordpress.com/2015/05/29/managing-dotfiles-using-vcsh-and-mr/) + * [This one which links to a more in-depth tutorial but also takes a look at the internals](https://www.kunxi.org/blog/2014/02/manage-dotfiles-using-vcsh-and-mr/) + * [This very useful and detailed one](http://srijanshetty.in/technical/vcsh-mr-dotfiles-nirvana/) + +When I was migrating, I particularly found the latter link to be rather useful due to the detailed explanations of multiple common tasks. +However, should you not want to read any of the above links I will attempt to give an overview of how it works in practice. + +# Creating a new repository + +1. Clone/Initialize the local vcsh repository +2. Update the myrepos(mr) configuration to include that repository +3. Add the wanted stuff to the vcsh repository +4. Write/generate a .gitignore and modify as needed +5. Commit to the vcsh repository and push both sets of changes as needed. + +# Updating an existing repository + +1. You can prefix git operations with vcsh and then the repo name to perform them on the repository. +2. Alternatively, use 'vcsh enter' to go into an environment where git can be used normally. + +# Updating *all* the repositories + +1. Use `mr up` and let myrepos do the job it was designed to do. + +# Bootstrapping the dotfiles +(presuming git is installed. If not, install it.) + +1. Install myrepos and vcsh. If there's no distribution package, a manual install is easy (they're just standalone scripts) +2. Obtain your myrepos configuration. +3. Use `mr up` and let myrepos obtain all your repositories as needed. + +If you think the above workflow looks interesting, I recommend you have a nice read of the above links - especially the last one +as I found it very useful. However, I have not moved my entire collection of dotfiles over and yet I still have some interesting problems/caveats to tackle. + +Firstly, while using a (private) Git repository to track my SSH/GPG data is useful, certain files have special filesystem permissions which Git does not preserve. While this can be solved with a chmod or two, it may grow +to be more difficult if I need more of these files in the future - plus I might be able to automate it using mr's 'fixups' functionality. + +Secondly, this is more of an observation than a problem: I'm currently using an Apache-style configuration involving both *'available.d'* and *'config.d'*. This works and is flexible, but it'd be simpler to only have a single directory and have equivalent information be part of the configuration itself. + +Thirdly, bootstrapping from a completely clean slate is rather complicated. Certain repositories may depend on others to work / be in the correct location. Then there's the problem of access to private repositories, perhaps HTTP(s) could be used to download SSH keys using pre-entered cached credentials? A similar but lesser problem exists with GPG. Public repositories have no issues with this - if need be, they can have the master remote be changed afterwards.s + +Anyway, that's all for now. If and when I solve the above issues I'll make sure to explain and blog about each my solutions. Until then, I don't expect this to come up again.