9.2 How to store binary files
There are two issues with using CVS to store
binary files. The first is that CVS by default
converts line endings between the canonical form in
which they are stored in the repository (linefeed
only), and the form appropriate to the operating system
in use on the client (for example, carriage return
followed by line feed for Windows NT).
The second is that a binary file might happen to
contain data which looks like a keyword (see section Keyword substitution), so keyword expansion must be turned
off.
The `-kb' option available with some CVS
commands insures that neither line ending conversion
nor keyword expansion will be done.
Here is an example of how you can create a new file
using the `-kb' flag:
| $ echo '$Id$' > kotest
$ cvs add -kb -m"A test file" kotest
$ cvs ci -m"First checkin; contains a keyword" kotest
|
If a file accidentally gets added without `-kb',
one can use the cvs admin
command to recover.
For example:
| $ echo '$Id$' > kotest
$ cvs add -m"A test file" kotest
$ cvs ci -m"First checkin; contains a keyword" kotest
$ cvs admin -kb kotest
$ cvs update -A kotest
# For non-unix systems:
# Copy in a good copy of the file from outside CVS
$ cvs commit -m "make it binary" kotest
|
When you check in the file `kotest' the file is
not preserved as a binary file, because you did not
check it in as a binary file. The cvs
admin -kb
command sets the default keyword
substitution method for this file, but it does not
alter the working copy of the file that you have. If you need to
cope with line endings (that is, you are using
CVS on a non-unix system), then you need to
check in a new copy of the file, as shown by the
cvs commit
command above.
On unix, the cvs update -A
command suffices.
(Note that you can use cvs log
to determine the default keyword
substitution method for a file and cvs status
to determine
the keyword substitution method for a working copy.)
However, in using cvs admin -k
to change the
keyword expansion, be aware that the keyword expansion
mode is not version controlled. This means that, for
example, that if you have a text file in old releases,
and a binary file with the same name in new releases,
CVS provides no way to check out the file in text
or binary mode depending on what version you are
checking out. There is no good workaround for this
problem.
You can also set a default for whether cvs add
and cvs import
treat a file as binary based on
its name; for example you could say that files who
names end in `.exe' are binary. See section The cvswrappers file.
There is currently no way to have CVS detect
whether a file is binary based on its contents. The
main difficulty with designing such a feature is that
it is not clear how to distinguish between binary and
non-binary files, and the rules to apply would vary
considerably with the operating system.