2010年12月10日星期五

CVS:如何存贮二进制文件

使用 cvs 来存贮二进制文件有两个问题。第一是默认情况下,cvs 将会在仓库的规范保存形式(只有换行符)和客户端使用的操作系统合适形式(例如 Windows NT 中回车符跟在换行符后面)之间进行行尾转换。

第二是一个二进制文件有可能会包含有看起来像关键字(参阅 Keyword substitution)的数据,所以关键字扩展必须关闭。



在一些 CVS 命令中使用的选项 `-kb',可以确保 cvs 不进行行尾转换和关键字扩展。

下面一个例子说明如何使用 `-kb' 标志创建一个新的文件:

$ echo '$Id$' > kotest
$ cvs add -kb -m"A test file" kotest
$ cvs ci -m"First checkin; contains a keyword" kotest

如果一个文件意外地没有用 `-kb' 添加,你可以使用 cvs admin 命令去恢复。例如:

$ 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

当你检入 kotest 文件时,这个文件不使用二进制形式保存,因为你并没有当成二进制文件检入。 cvs admin -kb 命令默认地为这文件设置关键字替换方法,但它并不改变你拥有的这个文件的工作副本。如果你需要处理行尾(也就是说,你在一个非 unix 系统中使用 cvs),那么你需要检入文件的新副本,如上面 cvs commit 命令所示。在 Unix 中可使用 cvs update -A 命令满足需要。 (注意,你可以使用 cvs log 检测文件的默认关键字替换模式,使用 cvs status 检测工作副本的关键字替换模式。)

虽然如此,在使用 cvs admin -k 来改变关键字扩展时,记住关键字扩展模式是不会受版本控制的。这就是说,例如,如果你有一个旧版本的文本文件以及一个相同名字的新版本的二进制文件,cvs 没办法根据你要取出的版本取出文本模式或是二进制模式的文件。现在还没有很好的办法解决这个问题。

你也可以设置默认值,让 cvs add 和 cvs import 根据名字来决定文件是否以二进制模式处理;例如,你可以让文件名以 `.exe' 结尾是二进制的。参阅 Wrappers. 现在没有办法让 cvs 根据内容检测一个文件是否为二进制。设计这样一个特性的主要困难是,二进制和非二进制文件之间的区别并非明确的,且使用的准则随操作系统而有很大的不同。

没有评论:

发表评论