任务 | CVS命令 | Firefly命令 |
新建存储库 | cvs –d <source repository directory> init | hff rep create –h <hostname> –d <rep dir> <rep name> |
Firefly和CVS均支持多存储库。在cvs中用户需要使用 “cvs –f –allow-root=/rep1 –allow-root=/rep2 pserver”的模式来支持多存储库。在cvs中用户需要手工操作来加载/卸载存储库;Firefly使用mount/unmount命令来支持存储库的卸载和加载。
| ||
导入文件到存储库 | cvs import <repository> “v-tag” “r-tag” | 使用hff br import –h <hostname> -proj <project name> -b <branch name> -d <source path>命令向一个空分支中直接导入数据。 |
使用cvs import命令后,并不能在本地立即开始工作,还要cvs checkout命令以建立一个新的本地工作区来开始工作。在Firefly中,用户可以直接建立本地工作区,通过本地工作区来进行文件的添加。也可以使用import功能来向一个空的Branch中导入数据。(cvs import命令是用来弥补cvs add命令不支持递归的缺点的)
| ||
初始化本地工作区 | cvs checkout <module name> | hff init –h <hostname> –proj <project name> –b <branch name> |
Cvs使用checkout命令来初始化本地工作区。在checkout的同时,可以指定-d参数来进行存储库中module和本地目录的映射关系(目前Firefly缺少这一功能)。但是,如果用户使用-d参数的话,很容易使得本地工作区的目录和存储库中的不一致,为开发工作造成不必要的麻烦。在初始化过后的本地工作区中,cvs会在每个目录下生成一个“CVS”目录,用来记录相关信息。在Firefly中,只在本地工作区的根下生成一个.firefly目录,记录所有的本地工作区信息。
| ||
添加文件 | cvs add <file list> | hff create <file list> |
cvs的add命令不支持递归!如果用户要添加dir/file.txt到cvs的存储库中,必须执行:1)cvs add dir; 2) cvs add dir/file.txt。如果dir目录下还有子目录,则需要依次递归执行add命令。当然,用户可以通过编写脚本的方式在一个命令中执行所有的操作,但是会严重影响执行速度。 CVS添加二进制文件需要进行特殊处理(使用-kb参数)。 (http://developer.apple.com/documentation/DeveloperTools/cvs/cvs_75.html) Firefly能够自动判断文本文件和二进制文件。
| ||
编辑文件 | cvs edit <file list> | hff edit <file list> |
用户使用cvs也可以不通过edit命令而直接修改文件内容。Cvs是通过文件时间来判断文件是否修改,不保证其准确性。而Firefly记录在本地工作区中编辑的文件,并且可以使用”hff list-out”命令来查看已经处于编辑状态的文件。Firefly同时支持对Hijack文件的Submit。 在Firefly中,用户可以使用hff edit –v <version number>来确定编辑命令所执行的起始版本,在Submit时候,会在分支上产生一个最新版本,并不会产生新的文件分支。
| ||
撤销编辑 | cvs unedit <file list> | hff unedit <file list> |
用于撤销对文件的编辑,使文件恢复到编辑之前的状态。无大区别。
| ||
提交变更 | cvs commit | hff submit |
Cvs支持commit文件;Firefly支持Submit文件和Changeset。Cvs在做commit时,需要遍历本地工作区所有的文件,通过文件时间的检查来判断应该commit哪些文件;而Firefly记录处于编辑状态下的文件,不需要检查本地工作区中的所有文件,即可得知需要Submit哪些文件。
| ||
更新本地工作区 | cvs update | hff bringover |
Cvs update命令需要使用-d参数才可以得到其它用户新建的目录(Module)。用户必须首先得知其它用户添加了哪些目录,然后使用cvs update –d 或cvs checkout命令才可以得到其它用户新建目录下的文件。在Firefly中,用户只使用bringover一个命令即可得到其它用户针对代码库的修改(包括更改的文件、移动的文件和新增的文件等等)。
| ||
下载文件 | cvs export | hff download |
在cvs中,必须要指定一个tag才可以执行export命令,如果某一文件没有tag,可以使用-f参数要求使用最新版本(NOTE:这样做非常容易出错,因为export到本地的文件并不保证其一致性);在Firefly中,用户可以download某一个分支(开发代码线)的最新版本或是某一个标记(label),而无需新建tag。
| ||
比较文件 | cvs diff –r <rev1> -r <rev2> file name | hff diffs –v1 <rev1> -v2 <rev2> filename |
比较文件版本之间的不同。 | ||
归并文件
| 在cvs中如果在commit时有冲突的话,要求在update中解决。 | 在Firefly中,如果在Submit时有冲突,要求在Bringover中解决。 |
缺省情况下,cvs使用简单的文本格式,要求用户手工解决冲突。在一些cvs的GUI客户端程序中,允许用户定制第三方的归并工具。
| Firefly本身提供3-way的归并工具。并且可以根据不同的文件类型设定不同的第三方归并工具。 | |
查看文件信息 | cvs status | hff info hff list … |
在Firefly中,info命令可以查看其它用户对某一文件的编辑和锁定信息,而cvs不能的status命令不能产看该信息。另外,在Firefly中,提供了丰富的list命令(list-changes, list-deleted, list-out,…),而cvs不具备这些功能。Cvs用户如果需要得知本地工作区中都有哪些文件处于edit状态,需要编写脚本。
| ||
锁定文件/解锁文件 | cvs admin –l <file list> cvs admin –u <file list> | hff lock <file list> hff unlock <file list> |
在cvs中,用户在edit的时候,并不提示其它用户已经锁定/编辑的信息。 在Firefly中,用户可以通过lock命令锁定文件,也可以使用hff edit –lock命令锁定文件。(怀疑检查lock会影响cvs的performance)
| ||
删除文件 | cvs remove <file list> | hff delete <file list> |
在cvs中要删除一个文件,必须在本地工作区中先手工从硬盘上删除该文件,再执行cvs remove命令(或者使用cvs remove –f执行一步删除);在Firefly中,用户只需执行hff delete即可。在cvs中,如果要执行反删除操作,需要通过繁复的remove-add-update命令来完成(参考:http://www.cvsnt.org/manual/Removing-files.html),在Firefly中只需执行hff undelete即可。另外,在Firefly中,用户delete一个文件,再添加一个同名的新文件,系统认为这是两个不同的、独立的文件;而在cvs中则认为这是一个文件(由此可见,cvs在处理删除、反删除的操作时,只是给出了一个work around,并没有从根本上解决该问题)。 |