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.
What about if I you don’t have admin access to the repo?
Renaming requires the use of admin functions, so if you don’t have admin rights and can’t use “cvs admin -n bad_name” then you’ll need to find someone who has admin rights to help you rename a branch.
Or you could use this as an opportunity to switch to Git.
Much easier than the above is to just do
cvs admin -N good_name:1.1.2 cvs_test.pl
Note the use of 1.1.2, which is the branch revision number, while 1.1.2.1 is the file revision number.
Your process doesn’t actually rename a branch, you are actually creating a new branch off the old branch and giving that sub-branch the new name. Note the extra levels in the new revision in:
> new revision: 1.1.2.1.2.1; previous revision: 1.1.2.1
This is what you have done:
HEAD: 1.1
|
bad_name branch: +– 1.1.2.x
|
good_name sub-branch: +– 1.1.2.1.2.x
I haven’t tested it, but I’m pretty sure you could accomplish the same thing just by doing:
cvs tag -b -r bad_name good_name
cvs tag -d bad_name
-L
However, there might be cases in which one uses a tag temporarily or accidentally puts one in the wrong place. Therefore, one might delete, move, or rename a tag.