Git dominates distributed version control. Released in 2005 by Linus Torvalds to manage kernel development, it has since become ubiquitous. Everyone has used git. Most of the most complex open source projects are version controlled (with the noteable exception of Mozilla Firefox). There’s GitLab, GitHub, SourceHut, Codeberg, and more for git users. To my knowledge, Mercurial users only have SourceHut, and there’s no Fossil-berg or RCS-Hub. For managing my thesis documents, however, git what not quite the right solution. I didn’t need the fancy distributed development features, since (sadly) nobody was interesting in contributing paragraph commits. What I did need was the easiest way to save revisions of my writing and view old versions, including files in binary formats.

For this, I found GNU RCS, short for Revision Control System. It was written by Walter Tichy in 1983, greatly predating git. I can’t find any example of a modern project employing it. The only modern users I could find are a couple of users on a forum for firearm discussion. That said, it looks like the easiest way to version control text files like notes or proposals.

Uncharacteristically of the GNU project, RCS is much simper than its alternatives. Each file’s history is saved as [filename],v in the same folder as the file or in ./RCS. If you check in a file in a subfolder, it won’t detect the RCS folder in the root directory without setting an environment variable.

RCS version controls files independently while git and mercurial version files in a repository together. For managing several independent documents, the RCS way is more intuitive. Furthermore, RCS conveniently increments version numbers for every save by .1, so the history by default will be v1.1, v1.2, and so on. Compared to git’s random hash names for commits, the RCS way is quick to type and easy to increment up or down a commit.

Commands

To start tracking a file, type ci foo. RCS will prompt for a description of changes. This will also lock the file until it is checked out. Do this with co foo. For solo projects, it is easier to run ci -u foo which checks in the file to update it then immediately checks it out again

rlog foo - List revisions of foo

co -r <revision> foo - Restore an old version of a file

co -p -r <revision> foo - Print contents of a given revision of foo to screen.

rcs -u foo - Sometimes RCS locks down file permissions so it can’t be modified. This command unlocks it