I recently needed to rename a branch in a CVS repository, and after Googling around for a while I found only hints of what might work, but no actual examples of how to rename a branch. Apparently it’s one thing to rename a tag in CVS, but if it’s a branch tag CVS doesn’t give you any easy ways to rename the branch, and if you try “normal” rename commands on a branch tag you’ll start seeing cryptic error messages. I started fiddling around with some of the commands in a CVS sandbox and figured out how to do it.
If you give a branch the wrong name you can fix the name by adding the good name as a tag name on the same branch, changing your working version to the good name, then deleting the old tag, and finally converting the new tag into a branch tag.
Whoops! I created a bad tag name:
earl@earl:~/sandbox/earl > cvs tag -b bad_name cvs_test.pl T cvs_test.pl earl@earl:~/sandbox/earl > cvs up -r bad_name cvs_test.pl M cvs_test.pl earl@earl:~/sandbox/earl > cvs ci cvs_test.pl /cvsroot/sandbox/earl/cvs_test.pl,v <-- cvs_test.pl new revision: 1.1.2.1; previous revision: 1.1 earl@earl:~/sandbox/earl > cvs stat cvs_test.pl =================================================================== File: cvs_test.pl Status: Up-to-date Working revision: 1.1.2.1 Repository revision: 1.1.2.1 /cvsroot/sandbox/earl/cvs_test.pl,v Commit Identifier: 21af497a241a4567 Sticky Tag: bad_name (branch: 1.1.2) Sticky Date: (none) Sticky Options: (none)
To fix that, I tag the working revision (in this case 1.1.2.1) of the bad_name branch with the good_name and then switch to the good_name branch:
earl@earl:~/sandbox/earl > cvs admin -N good_name:1.1.2.1 cvs admin: Administrating . RCS file: /cvsroot/sandbox/earl/cvs_test.pl,v done earl@earl:~/sandbox/earl > cvs stat cvs_test.pl =================================================================== File: cvs_test.pl Status: Up-to-date Working revision: 1.1.2.1 Repository revision: 1.1.2.1 /cvsroot/sandbox/earl/cvs_test.pl,v Commit Identifier: 21af497a241a4567 Sticky Tag: bad_name (branch: 1.1.2) Sticky Date: (none) Sticky Options: (none) earl@earl:~/sandbox/earl > cvs up -r good_name cvs_test.pl earl@earl:~/sandbox/earl > cvs stat cvs_test.pl =================================================================== File: cvs_test.pl Status: Up-to-date Working revision: 1.1.2.1 Repository revision: 1.1.2.1 /cvsroot/sandbox/earl/cvs_test.pl,v Commit Identifier: 21af497a241a4567 Sticky Tag: good_name (revision: 1.1.2.1) Sticky Date: (none) Sticky Options: (none)
Next I delete the bad_name tag by using the -n option without specifying a revision number:
earl@earl:~/sandbox/earl > cvs admin -n bad_name cvs admin: Administrating . RCS file: /cvsroot/sandbox/earl/cvs_test.pl,v done earl@earl:~/sandbox/earl > cvs stat cvs_test.pl =================================================================== File: cvs_test.pl Status: Up-to-date Working revision: 1.1.2.1 Repository revision: 1.1.2.1 /cvsroot/sandbox/earl/cvs_test.pl,v Commit Identifier: 21af497a241a4567 Sticky Tag: good_name (revision: 1.1.2.1) Sticky Date: (none) Sticky Options: (none) earl@earl:~/sandbox/earl > cvs up -r bad_name cvs_test.pl cvs update: `cvs_test.pl' is no longer in the repository
The bad tag name is gone! To get the good tag again:
earl@earl:~/sandbox/earl > cvs up -r good_name cvs_test.pl U cvs_test.pl earl@earl:~/sandbox/earl > cvs stat cvs_test.pl =================================================================== File: cvs_test.pl Status: Up-to-date Working revision: 1.1.2.1 Repository revision: 1.1.2.1 /cvsroot/sandbox/earl/cvs_test.pl,v Commit Identifier: 21af497a241a4567 Sticky Tag: good_name (revision: 1.1.2.1) Sticky Date: (none) Sticky Options: (none)
The last step is to convert the good_name tag into a branch tag:
earl@earl:~/sandbox/earl > cvs tag -d good_name cvs_test.pl D cvs_test.pl earl@earl:~/sandbox/earl > cvs tag -b good_name cvs_test.pl T cvs_test.pl earl@earl:~/sandbox/earl > cvs up -r good_name cvs_test.pl earl@earl:~/sandbox/earl > cvs ci cvs_test.pl /cvsroot/sandbox/earl/cvs_test.pl,v <-- cvs_test.pl new revision: 1.1.2.1.2.1; previous revision: 1.1.2.1
There may be an easier way to do this, but this does work.
Hope you found this useful.