In 2002 I wrote a Lisp program called Meta-CVS. It uses CVS to store files in a certain format, which allows versioning of the directory structure, symbolic links and permissions. As well, it has a "mcvs grab" command for importing snapshots of external code such that renames are identified. Plus it has merge automation with tracking. Plus interactive workflow when creating a repo, for identifying binary files and whatnot.
The support for renaming in Meta-CVS blows git out of the water (since that basically doesn't have any).
People continuing with CVS crazy not to be at least using Meta-CVS to make their lives easier.
I used Meta-CVS once to clean up a mess. In the company I was working on, my friend, a configuration manager, came to me with a problem: merging some large amount of Java cruft from a branch where the developers did various renames. Not just A to B renames, but cyclic renames A.java renamed to B.java, while B.java renamed to C.java, while C.java again renamed to A! (Would you believe it.) This had to be merged to the trunk.
I whipped out Meta-CVS for the task. "mcvs grab" easily identified the rotating renames and merged the content, which we were then able to check into the VC actually being used (might have been SVN).
Let me warn you in advance that Meta-CVS isn't just a client you can use over CVS repos to get all those nice things. It uses CVS repos to store its own format. All the files are given UUID-like hexadecimal names, stored as a flat directory. The mcvs program maps checks that out in a MCVS/ subdirectory. (So there is a MCVS/CVS directory under that where the ,v files are.) The MCVS/MAP file is a Lisp data structure which maps the UUID names to paths. The program builds and maintains the working tree according the MAP file.
Meta-CVS requires CLISP. Hopefully now just "apt install clisp" nowadays, and similar.
When I developed Meta-CVS as my first nontrivial Lisp project, I soon learned about people who will try to "strongly advise" you to write in Perl or Python:
"Another downside to Meta-CVS is that it is written in Common LISP. Granted, Common LISP is a very powerful and flexible language. However, it is not very common (pardon the pun) on UNIX and other systems, and few people could be expected to install a client if they need to install it first. If Meta-CVS' author wishes to make it more popular, I strongly advise him to re-implement it in C, Perl, Python or something more standard."http://better-scm.shlomifish.org/docs/nice_trys.html
The support for renaming in Meta-CVS blows git out of the water (since that basically doesn't have any).
People continuing with CVS crazy not to be at least using Meta-CVS to make their lives easier.
I used Meta-CVS once to clean up a mess. In the company I was working on, my friend, a configuration manager, came to me with a problem: merging some large amount of Java cruft from a branch where the developers did various renames. Not just A to B renames, but cyclic renames A.java renamed to B.java, while B.java renamed to C.java, while C.java again renamed to A! (Would you believe it.) This had to be merged to the trunk.
I whipped out Meta-CVS for the task. "mcvs grab" easily identified the rotating renames and merged the content, which we were then able to check into the VC actually being used (might have been SVN).