Info Node: (cvsbook.info)What Happens When You Remove A File
(cvsbook.info)What Happens When You Remove A File
What Happens When You Remove A File
===================================
When you remove a file from a project, it doesn't just disappear. CVS
must be able to retrieve such files when you request an old snapshot of
the project. Instead, the file gets put in the `Attic', literally:
floss$ pwd
/home/jrandom/src/myproj
floss$ ls /usr/local/newrepos/myproj/
README.txt,v a-subdir/ b-subdir/ foo.jpg,v hello.c,v
floss$ rm foo.jpg
floss$ cvs rm foo.jpg
cvs remove: scheduling 'foo.jpg' for removal
cvs remove: use 'cvs commit' to remove this file permanently
floss$ cvs ci -m "Removed foo.jpg" foo.jpg
Removing foo.jpg;
/usr/local/newrepos/myproj/foo.jpg,v <-- foo.jpg
new revision: delete; previous revision: 1.1
done
floss$ cd /usr/local/newrepos/myproj/
floss$ ls
Attic/ README.txt,v a-subdir/ b-subdir/ hello.c,v
floss$ cd Attic
floss$ ls
foo.jpg,v
floss$
In each repository directory of a project, the presence of an `Attic/'
subdirectory means that at least one file has been removed from that
directory (this means that you shouldn't use directories named Attic in
your projects). CVS doesn't merely move the RCS file into Attic/,
however; it also commits a new revision into the file, with a special
revision state of `dead'. Here's the relevant section from
Attic/foo.jpg,v:
1.2
date 99.06.21.03.38.07; author jrandom; state dead;
branches;
next 1.1;
If the file is later brought back to life, CVS has a way of recording
that it was dead at some point in the past and is now alive again.
This means that if you want to restore a removed file, you can't just
take it out of the Attic/ and put it back into the project. Instead,
you have to do something like this in a working copy:
floss$ pwd
/home/jrandom/src/myproj
floss$ cvs -Q update -p -r 1.1 foo.jpg > foo.jpg
floss$ ls
CVS/ README.txt a-subdir/ b-subdir/ foo.jpg hello.c
floss$ cvs add -kb foo.jpg
cvs add: re-adding file foo.jpg (in place of dead revision 1.2)
cvs add: use 'cvs commit' to add this file permanently
floss$ cvs ci -m "revived jpg image" foo.jpg
Checking in foo.jpg;
/usr/local/newrepos/myproj/foo.jpg,v <-- foo.jpg
new revision: 1.3; previous revision: 1.2
done
floss$ cd /usr/local/newrepos/myproj/
floss$ ls
Attic/ a-subdir/ foo.jpg,v
README.txt,v b-subdir/ hello.c,v
floss$ ls Attic/
floss$
There's a lot more to know about RCS format, but this is sufficient for
a CVS adminstrator to maintain a repository. It's quite rare to
actually edit an RCS file; you'll usually just have to tweak file
permissions in the repository, at least if my own experience is any
guide. Nevertheless, when CVS starts behaving truly weirdly (rare, but
not completely outside the realm of possibility), you may want to
actually look inside the RCS files to figure out what's going on.