CVS 常用操作
导入项目到服务器
格式: cvs import [-m "描述"] 项目名 厂商名 标记
-m "描述" 为导入操作指定描述信息。实际上 -m 参数是一个公共参数,可以为所有需要描述信息的命令指定描述信息。如果不加这个参数,cvs 会自动启动记事本程序,要求你输入描述信息。参考:如何为 cvs 操作指定描述信息
项目名 cvs 服务器会根据这个名字在 cvs 服务器上创建一个目录来保存所有导入的文件。因此你使用 mydoc/project 这样项目名,将会创建两个目录:mydoc 及其子目录 project。
厂商名 项目厂商的标记。例如 nes 或者 microsoft。
标记 为导入的项目指定一个初始标记。一般使用 init 或者 start,表示项目开始。
说明: 将当前目录下的所有文件(包括子目录)导入到 cvs 服务器上指定的目录中(目录名与项目名相同)。每个项目的第一个操作就是导入 cvs 服务器,以后就不需要对同一个项目再次进行这个操作了。
操作示例: chdir myproject
cvs import -m "导入项目" myproject nes init
输出信息: N myproject/hello.c
导入了 hello.c 文件,项目名字是 myproject
No conflicts created by this import
导入操作没有发生冲突
从服务器更新文档
格式: cvs update [-P] [-d]
缩写: cvs up
-P 删除空目录
-d 更新子目录下的所有文件。如果别人向项目中添加了新目录,必须加 -d 参数才能够将这些新目录及其中的文件更新到本地。
操作示例: cvs update -d
说明: 从 cvs 服务器上更新文件到本地,功能与 VSS 的 CheckOut 命令相同。
输出信息: cvs server: Updating .
M shutdown.c
文件名前面的字母有下列几种,包含不同的含义:
U 完整的文件从服务器上更新到了本地(当文件为二进制文件或者本地不存在的文件)。
P 文件的部分内容从服务器更新到了本地(文件为文本文件时,CVS将只传送本地文件和位于服务器上的文件相比较不同的部分,以减少带宽的使用)。
A 这个文件目前只存在于本地目录中,你虽然使用 cvs add 命令向 cvs 服务器添加了文件,但还没有使用 cvs commit 命令确认添加操作。
R 这个文件你已经不存在于本地了,而且你也使用了 cvs remove 命令从 cvs 服务器上删除了这个文件,但还没有使用 cvs commit 命令确认删除操作。
M 这里有两种含义:一是你的本地文件修改了,但还没有用 cvs commit 命令提交到 cvs 服务器上;二是你的本地文件修改了,cvs 服务器上的文件被其他人修改了,现在你们的修改已经成功的合并了。参考:如何比较本地文件与 cvs 服务器上的文件
C 你的本地文件修改了,cvs 服务器上的文件被其他人修改了,但现在你们的修改发生的冲突,无法自动合并。参考:如何解决修改冲突
? 这个文件只存在与本地,没有用 cvs add 命令添加到 cvs 服务器。
将修改提交到服务器
格式: cvs commit [-m "描述"]
缩写:cvs ci
-m "描述" 为修改的操作指定描述信息。
操作示例: cvs commit -m "增加了一个 test 函数"
说明: 将本地修改过的文件提交到 cvs 服务器,与 VSS 的 CheckIn 操作功能相同。除了提交修改过的文件外,cvs add(添加文件)、cvs remove(删除文件)这些操作都需要 cvs commit 命令来确认。
输出信息: cvs commit: Examining .
Checking in shutdown.c;
/cvsroot/shutdown/shutdown.c,v <-- shutdown.c
(提交文件)
new revision: 1.3; previous revision: 1.2
(新的修订号 1.3,早先的修订号 1.2。这个修订号是 cvs 服务器上的文件修订记录,和项目的版本号没有关系)
done
如果出现问题,那么输出信息可能是这样:
cvs server: Up-to-date check failed for `hello.c'
cvs [server aborted]: correct above errors first!
上面两行信息的意思是 "hello.c" 文件更新检查失败,要求首先纠正上面的错误。
通常出现这个问题最常见的原因就是你修改过的文件别人也修改过了,并提交到了 cvs 服务器上。参考:如何比较本地文件与 cvs 服务器上的文件
要纠正这个问题只有先用 cvs update 命令从服务器上更新修改过的文件到本地。如果存在冲突,还要解决冲突以后再运行 cvs commit 命令。参考:如何解决修改冲突
添加新文件和目录到服务器
格式: cvs add [-m "描述"] 文件名
-m "描述" 为修改的操作指定描述信息。
文件名 如果要添加目录,就指定为目录名。cvs add 命令支持通配符,因此可以使用通配符来添加一次性添加多个文件。
操作示例: cvs add -m "增加 test.c 文件" test.c
cvs add -m "增加多个 .c 文件" *.c
说明: 向 cvs 服务器添加新文件或者目录。添加操作完成后用 cvs commit 命令确认添加。
输出信息: cvs server: scheduling file `test.c' for addition
(计划了文件添加操作)
cvs server: use 'cvs commit' to add this file permanently
(使用 cvs commit 真正的执行提交操作)
如果要添加一个目录,按照下面的步骤操作:
cvs add mydir
? mydir/ProjectDoc.cpp
(?号表示这个文件还没有用 cvs add 命令添加到 cvs 服务器)
Directory /cvsroot/myproject/mydir added to the repository
(目录 mydir 已经添加到了项目中)
chdir mydir
cvs add ProjectDoc.cpp
cvs server: scheduling file `ProjectDoc.cpp' for addition
cvs server: use 'cvs commit' to add this file permanently
cvs commit
cvs commit: Examining . Log message unchanged or not specified
RCS file: /cvsroot/myproject/mydir/ProjectDoc.cpp,v
done
Checking in ProjectDoc.cpp;
/cvsroot/myproject/mydir/ProjectDoc.cpp,v <-- ProjectDoc.cpp
initial revision: 1.1
done
如果有多个文件要添加,可以使用通配符。全部的添加操作完成后,才用 cvs commit 提交添加,这样效率更高。
从项目中删除文件
格式: cvs remove [文件名]
文件名 要删除的文件名。如果这个参数省略,那么 cvs 会自动查找本地不存在的文件,并将其从 cvs 服务器中删除。
操作示例: cvs remove test.c
cvs remove *.c
说明: 从 cvs 服务器删除指定的文件。要删除的文件首先要从本地目录中删除或者改名。
输出信息: cvs server: file `test.c' still in working directory
cvs server: 1 file exists; remove it first
(文件 "test.c" 还在本地目录中,要先删除本地文件)
推荐先把要删除的本地文件改名或者移动到其他地方,确定以后不需要时再删除。因为 cvs 删除服务器上的文件后是无法恢复的。
ren test.c test.c.bak
cvs remove test.c
cvs server: scheduling `test.c' for removal
cvs server: use 'cvs commit' to remove this file permanently
cvs commit
Removing test.c;
/cvsroot/myproject/test.c,v <-- test.c
new revision: delete; previous revision: 1.1
done
最后用 cvs commit 命令提交删除操作。
如果要取消刚刚的删除操作(必须在使用 cvs commit 提交删除操作之前),可以使用 cvs add 命令:
cvs add test.c
U test.c
cvs server: test.c, version 1.5, resurrected
(文件 "test.c" 恢复)
达到同样效果的另一种操作方法:
rename test.c test.c.bak
cvs remove
cvs commit
从项目中删除目录
说明: cvs 不提供删除目录的操作,所以删除目录的唯一方法就是从 cvs 服务器删除该目录下的所有文件。
操作示例: chdir mydir
delete *.*
cvs remove
cvs commit
上面的操作将删除 mydir 目录下的所有文件,使 mydir 成为空目录。然后使用 cvs update -P 命令就能够将删除空目录(但该目录仍然保存在服务器上,而且如果使用不带 -P 参数的 cvs update -d 命令,那么本地仍然会创建这些空目录)。
文件移动或者改名
操作示例: rename test.c new.c
cvs remove test.c
cvs add new.c
cvs commit -m "将文件 test.c 更名为 new.c"
说明: 更改一个文件的名字,必须首先改变本地文件的名字。然后删除服务器上的旧文件,添加本地的新文件,最后提交操作。
目录移动或者改名
操作示例: mkdir newdir
chdir mydir
move *.* ..\newdir
cvs remove
chdir ..\newdir
cvs add *.*
cvs commit -m "将目录 mydir 改名为 newdir"
说明: 更改一个目录的名字是一件非常麻烦的事情。首先你要创建新目录,然后把文件移动到这个新目录中。接下来用 cvs remove 命令删除旧目录中的文件,再用 cvs add 命令添加新目录中的文件。最后用 cvs commit 提交更改。
删除项目
操作示例: plink user@host "rm -i -r /cvsroot/myproject"
说明: 上面的命令实际上是登录到服务器上,用 rm 命令删除了 /cvsroot/myproject 目录。
警告:rm 命令危险性很大,因此强烈建议不要使用这种方式删除项目。而应该请求 CVS 仓库管理员帮你删除不需要的项目。
plink是putty软件包中的一部分,下载地址:
http://www.chiark.greenend.org.uk/~sgtatham/putty/
列出服务器上的所有项目
操作示例: plink user@host "ls -lF /cvsroot/ | grep -v "CVSROOT""
说明: 上面的命令可以列出服务器上的所有项目。或者使用下面的脚本:
@echo off
if !%CVSROOT% == ! goto exit
for /f "tokens=2,3 delims=:" %%i in ("%CVSROOT%") do @plink %%i "ls -lkF %%j/ | grep -v "CVSROOT/ ""
:exit
输出信息: total 46(total 46不是指项目总数)
drwxrwxrwx 4 cvs_daut cvs 512 May 6 16:48 atl-freebsd_diary/
drwxrwxrwx 3 cvs_daut cvs 512 May 5 13:43 atl-msgplus2/
drwxrwxrwx 3 cvs_daut cvs 512 May 5 13:43 atl-nav2003/
drwxrwxrwx 4 cvs_daut cvs 512 May 5 13:43 atl-os/
drwxrwxrwx 9 cvs_daut cvs 512 May 9 04:52 case-ae/
drwxrwxrwx 2 cvs_daut cvs 512 May 7 11:39 case-hlg/
drwxrwxrwx 4 cvs_daut cvs 512 May 8 02:55 case-sdae/
drwxrwxrwx 5 cvs_daut cvs 512 May 5 13:44 case-wdae/
drwxrwxrwx 2 cvs_daut cvs 512 May 5 13:44 docs-MeetingRecord/
drwxrwxrwx 6 cvs_daut cvs 512 May 7 22:10 docs-devl_common/
drwxrwxrwx 3 cvs_daut cvs 512 May 9 09:25 docs-freebsd_diary/
....
导出不包含 CVS 信息的项目目录
格式: cvs export -D 日期 -d 目的地目录 项目名
-D 日期 导出哪个日期以后的项目文件。如果时 -D now 则导出当前最新的文件。
-d 目的地 导出的文件存放在哪个目录中。
项目名 要导出的项目的名字。
操作示例: cvs export -D now -d myproject_release myproject
说明: 从 cvs 服务器中导出指定的项目,但不包含 CVS 信息。通常在公开发布源代码之前用 cvs export 命令导出文件。因为 CVS 信息中有用户名、服务器地址等信息,不应该让源代码的最终用户看到这些信息。
输出信息: cvs export: Updating myproject_release
U myproject_release/test.c
U myproject_release/hello.c
(导出了2个文件)
为 cvs 操作指定描述信息
操作示例: cvs add -m "Add file test.c" test.c
说明: 大部分 cvs 命令都接受 -m 参数,以指定一个操作的描述信息。如果不使用 -m 参数,那么 cvs 会启动记事本程序来要求用户输入描述信息。
与使用 -m 参数比较而言,在记事本中可以输入多行的描述信息,详细的说明操作情况。记事本窗口中,用 CVS: 起始的行都会被忽略掉。
比较本地文件与 cvs 服务器上的文件
格式: cvs diff [文件名]
文件名 要比较的文件名。如果这个参数省略,那么 cvs 会比较当前目录下的所有文件。
操作示例: cvs diff test.c
说明: 比较本地文件和保存在 cvs 仓库中的版本的不同之处。
输出信息: Index: test.c
===================================================================
RCS file: /cvsroot/test/test.c,v
retrieving revision 1.1.1.1
diff -r1.1.1.1 test.c
3c3
< int main()
---
> int main(int argc, char* argv[])
5c5,7
< printf("Hello, world !\n");
---
> printf("Hello, world ! Come on, Baby !\n");
> printf("My god, you are pig !\n");
>
上面的输出结果中,< 开头的内容表示是 cvs 仓库中的版本的内容,> 开头的内容是本地文件的内容。