CVS:简介

作者:Ralph Krause

如果您从互联网上下载过软件,尤其是从 SourceForge 下载过,您可能注意到过 CVS 这几个字母。CVS 代表并发版本系统,它是一种工具,允许开发人员跟踪他们的项目。它还允许开发人员在项目上进行协作。

虽然 CVS 可以用于网络上拥有许多开发人员的大型项目,但本文重点介绍它在本地系统上对个人的实用性。CVS 的常见应用场景可能是修改脚本或配置文件,然后继续进行其他任务。过了一段时间后,您发现您的更改不起作用,并且您没有原始文件的备份,并且您不太记得您所做的所有更改。CVS 可以帮助防止这种情况,因为它会跟踪对文件所做的更改,并允许您恢复到文件的正常工作版本。

CVS 简要概述

在 CVS 控制下的文件存储在一个名为仓库的特殊目录中,每个文件都有一个由 CVS 维护的修订号。要更改文件,您首先必须从仓库中获取文件的副本。您可以获取文件的最新修订版本或 CVS 中存储的任何早期修订版本。当您完成文件的工作后,您可以将其放回仓库,其修订号会递增。每次将文件提交到仓库时,您都可以提供日志消息,以帮助跟踪文件随时间推移所做的更改。

CVS 与其他版本控制系统的不同之处在于它不锁定文件;不同的开发人员可以检出文件并同时对其进行工作。当文件放回仓库时,CVS 确保一位开发人员的编辑不会与另一位开发人员的编辑冲突。如果发现冲突,CVS 会在第二位开发人员的文件副本中放置标记,以便他或她找到并解决冲突。解决冲突后,开发人员将文件提交到仓库。

安装 CVS

安装 CVS 没有任何技巧。您可以下载并编译源代码,或者安装 RPM 包或其等效软件包。

安装 CVS 后,您将必须决定仓库的位置。它应该位于具有大量可用空间且您具有写入权限的分区中。一旦您决定了仓库的位置,您就必须创建它并用 CVS 管理文件填充它。这可以使用 CVS init 命令完成。如果您希望您的仓库位于 /usr/local/cvsstuff 中,您将执行如下所示的 CVS 命令

cvs -d /usr/local/cvsstuff init

CVSROOT 环境变量或 -d 开关告诉 CVS 命令要对哪个仓库进行操作。可以通过将以下行添加到您的 .bash_profile 中来设置 CVSROOT 变量

export CVSROOT=/usr/local/cvsstuff
填充仓库

要将现有项目放入仓库,请使用 import 命令。例如,假设您具有如下所示的目录结构,并且将来会添加其他客户端目录。

html_projects/
         client1/
            images/
         client2/
            images/

要将 html_projects 及其下的所有内容放入仓库,您将使用以下命令

cd html_projects
cvs import -m "Put html_projects in the repository" html_projects vendor release
-m 选项为事务提供日志消息;如果您不使用它,CVS 会启动您的默认编辑器,以便您可以键入消息,然后在您退出编辑器时完成操作。供应商和发布标签不会被 CVS 使用,但仍然是必需的。典型的供应商标签可以是您的公司名称,“start”是一个不错的发布标签。如果您的项目包含二进制文件,例如图片,请查阅 -k 选项以确保它们被正确复制到仓库中。

如果您现在查看您的仓库,您应该会找到一个名为 html_projects 的目录,其中包含原始 html_projects 目录中所有文件的副本。

在 CVS 下创建新项目只需创建一个空目录结构,然后通过 import 命令将其导入到仓库中即可。当您为新项目创建文件时,请使用 CVS add 命令将它们放入仓库中。

使用 CVS

使用 CVS 的基本步骤如下:从仓库中检出项目,更改项目文件并验证它们是否工作,将修改后的文件提交回仓库并提供有关您所做更改的注释。

您必须先从 CVS 检出文件才能编辑它们。默认情况下,CVS 检出项目的最新修订版本,但您可以根据需要指定较早的修订版本。当您从仓库中检出项目时,CVS 会将项目的文件复制到当前目录,并根据需要创建子目录。您可以通过指定目录名称(例如,html_projects)或通过指定特定的项目文件(例如,html_projects/client1/index.html)来检出项目文件。指定文件仍然会在您的工作目录中创建项目的目录结构,但只有指定的文件会从仓库中复制。

要检出 client1 的文件,请移动到您可以工作的目录,例如您的主目录,然后发出如下所示的 CVS checkout 命令。如果您每次运行 checkout 命令时都没有切换到相同的起始目录,您很容易最终得到散布在各处的多个项目副本。

cvs checkout html_projects/client1

接下来,切换到 client1 目录 (cd ~/html_projects/client1) 并使用您喜欢的编辑工具对文件进行更改。在将文件提交回仓库之前,请确保您的更改有效。使用版本控制软件时,一个常见的错误是过早地检入文件。这会导致仓库包含文件的许多版本,其中大多数版本都无法工作。

要将更改的文件放入仓库,请使用以下命令

cvs commit -m "made some changes" index.html

CVS 将让您知道文件是否已成功放入仓库以及其新的修订号是多少。

您可以通过使用 checkout 命令指定修订号或日期来检索文件的早期修订版本。例如,如果 index.html 当前处于修订版本 1.3,并且您想检索昨天的版本(版本 1.2),您可以使用以下任一命令执行此操作

cvs checkout -r 1.2 html_projects/client1/index.html

cvs checkout -D yesterday html_projects/client1/index.html
-r 开关允许您指定修订号,而 -D 开关允许您指定日期。您可以指定 ISO 标准日期,例如 2000-03-23,或相对日期,例如“yesterday”。
添加和删除项目文件

要将文件添加到现有项目,请检出项目,然后在项目的工作目录中创建新文件。使用以下命令将其添加到仓库

cvs add newfile
cvs commit -m "Added newfile to the project" newfile

删除文件与添加文件非常相似。首先检出项目,然后删除您要从工作目录中删除的文件。使用以下命令从仓库中删除它们

cvs remove newfile
cvs commit -m "Removed newfile from project" newfile
项目别名

处理充满项目目录的仓库的一种方法是利用在 CVS 命令中使用别名代替目录名称的功能。别名允许您对项目使用简短、有意义的名称,而不是长目录名称。别名还可以用于将单独的项目分组在一个名称下,以便可以使用一个命令检出所有项目。最后,别名可以列出特定的项目文件,例如文档或头文件,允许您检出项目的小部分。要使用别名,您必须编辑仓库的 CVSROOT 目录中的 modules 文件。这在 CVS 文档中进行了解释。

标记项目文件

CVS 允许您使用 tag 命令为项目中的所有文件提供符号或逻辑名称(例如,release-1 或 beta)。由于项目中的每个文件可能具有不同的修订号,因此标签提供了一种在给定时刻拍摄项目快照的方法。然后,您可以在检出项目时将标签与 -r 开关一起使用以检索该快照,而无需记住项目中每个文件的版本号。需要注意的一件事是标签不能包含空格或句点。

项目分支

CVS 允许您创建项目分支,其中每个分支都包含处于不同状态的项目代码,例如错误修复分支和新功能分支。您可以处理不同的分支,而不会影响其他分支,然后您可以自动将一个分支的更改合并到另一个分支中。

举例来说,假设您正在处理一个名为 FaxMan 的项目,并且已发布 1.0 版本。您在发布时将仓库中的源文件标记为 rel-1-0,然后开始处理 2.0 版本。然后您收到有关 1.0 版本中必须修复的错误的投诉。要创建包含 1.0 版本的 FaxMan 项目的分支,您可以使用

cvs rtag -b -r rel-1-0 rel-1-0-bugfix FaxMan

rtag 命令将新标签 (rel-1-0-bugfix) 分配给仓库中的代码。-b 标志表示标签是一个新分支,-r rel-1-0 表示此分支包含先前标记为 rel-1-0 的代码。

要检出和处理 1.0 版本代码,您将使用以下命令

cvs checkout -r rel-1-0-bugfix FaxMan

要将错误修复与当前的 FaxMan 代码合并,您首先检出最新代码,然后告诉 CVS 将 rel-1-0-bugfix 代码与其合并。这是使用以下命令完成的

cvs checkout FaxMan
cvs update -j rel-1-0-bugfix
CVS 客户端

有几个 CVS 客户端可用,因此您不必从命令行操作 CVS。TkCVS 当前版本为 6.4,需要 Tcl/Tk 8.1 或更高版本。Pharmacy 当前版本为 0.2.1,是 GNOME 项目的一部分,而 Cervisia 版本为 1.0 稳定版,使用 Qt 和 KDE 库。另一个使用 Qt 工具包的客户端是 LinCVS,版本 0.3。有关这些项目的指针,请参阅资源部分。

结论

虽然 CVS 是一种非常强大的工具,允许分散的开发人员通过互联网在项目上进行协作,但它也很容易在本地机器上配置和使用。如果您经常更新文件并且需要跟踪更改,CVS 允许您构建已进行更改的记录。

资源

CVS 书籍的泡泡评论

版本控制的下一个版本

CVS: An Introduction
Ralph Krause 是一位作家、程序员和网站管理员,居住在密歇根州。可以通过 rkrause@netperson.net 与他联系。
加载 Disqus 评论