热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用CVS进行项目开发管理

文章标题:使用CVS进行项目开发管理。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类

  在多人共同开发一个大型项目时,源代码的维护和版本维护是一件令人头疼的事情,由于多人开发,每个开发人员都拥有此项目的副本,所以如果要手动维护同一个文件多人的修改是十分困难的事情。
  另外,可能你需要的项目的版本不是当前开发的最新的版本, 如果为了这个目的而为每一个版本保留一个备份几乎是不可能的。Linux平台上提供了一个功能软件:CVS。众所周知,Linux的发展得益于互联网的发展,大部分的软件都是众多开发者在互联网上共同开发的,这些软件的维护大部分都使用CVS,例如Deban Linux的开发、KDE的开发,以及sourceforg上的开发项目。正确熟练使用CVS是一个Linux程序员基本的素质。
  
  
  CVS不仅可以维护源代码,事实上,所有的文本文件都可以使用CVS来管理,当然也可以管理 二进制文件,只是需要特殊的命令选项罢了。
  
  CVS把文件保存在一个名叫仓库(repository)的地方,仓库中保存的文件并不是每个版本的副本,而是可以从任意版本回溯到初始版本的一些代码的主控信息,这样,就节省了大量的存储空间。
  仓库不仅可以建立在本机上,也可以建立在网络上。另外CVS支持版本分支(tag),这样可以从任意的版本中衍生出另外一个版本进行开发,必要时,还可以把这个分支合并到主开发分支去。
  
  CVS需要一个名叫RCS(修订控制系统)的软件,确切说,CVS主要管理开发项目中的目录的改动,而RCS则侧重于管理的一个文件的改变。如果要使用网络的CVS,还需要rsh或者自己内置的cvs-server,rsh是CVS客户于服务器的通信平台,如果需要安全的信息传输,可以使用ssh,这个可以使用CVS_RSH环境变量来指定:
  export CVS_RSH=rsh 使用rsh
  export CVS_RSH=ssh 使用ssh
  
  RCS使用
  在使用CVS之前,先介绍一下RCS的使用方法。
  正如前面所说,RCS是针对某一个特定的文件进行管理,常用到的命令是co和ci。RCS使用当 前工作路径下的RCS目录来存储管理的文件。
  ci (check in)把源代码加入到RCS源代码仓库中,每一个添加进代码库中的文件的版本是 1.1。
  以后每次修改文件重新ci以后,此文件的版本递增为1.2 ,1.3.……。
  co(check out)把源文件从RCS源代码仓库中取出,缺省的版本是最新的版本,如果你需要一个指定的版本,则需要使用-r选项指定。例如:
  $mkdir RCS 建立RCS源代码仓库
  编辑一个文件,如hello.c
  #include
  int main (void)
  {
  printf ("Hello World\n");
  return 0;
  }
  然后把它加入到RCS仓库中:
  [kerberos@power zhyf]$ ci hello.c
  RCS/hello.c,v <-- hello.c
  enter description, terminated with single '.' or end of file:
  NOTE: This is NOT the log message!
  >>the inital verion. 输入关于文件改动的信息
  >> . 以.结束信息输入
  initial revision: 1.1 初始版本是1.1
  done
  [kerberos@power zhyf]$
  当文件加入到源代码仓库后,RCS会自动删除文件。
  
  如果需要修改文件,则从仓库取出:
  [kerberos@power zhyf]$ co hello.c
  RCS/hello.c,v --> hello.c
  revision 1.1
  done
  此时,取出的文件是只读的,如果需要编辑文件,需要对文件加锁取出,防止与他人编辑冲突。 
  加锁取出使用-l (lock)选项。
  [kerberos@power zhyf]$ co -l hello.c
  RCS/hello.c,v --> hello.c 从RCS仓库中取出hello.c,仓库中的文件是以v结尾的。
  revision 1.1 (locked) 指明是加锁取出
  done
  这时,我们就可以修改和编辑文件了。
  例如:
  #include
  int main (void)
  {
  printf ("Hello World\n");
  printf("checkoutwithlock\n"); 添入代码
  return 0;
  }
  [kerberos@power zhyf]$ ci hello.c
  RCS/hello.c,v <-- hello.c
  new revision: 1.2; previous revision: 1.1 重新加入到仓库,文件版本递增为1.2
  enter log message, terminated with single '.' or end of file:
  >> check out with lock and modified it .
  >> .
  done
  如果你需要先前的hello.c,也就是1.1版本的,可以使用-r来指定取出文件的版本:
  [kerberos@power zhyf]$ co -l -r1.1 hello.c
  hello.c,v --> hello.c
  revision 1.1 (locked) 取出1.1版本
  done
  可以尝试使用两次加锁取出,这时候,RCS会提示警告信息。
  [kerberos@power zhyf]$ co -l hello.c
  hello.c,v --> hello.c
  revision 1.1 (locked)
  writable hello.c exists; remove it? [ny](n) 是否覆盖当前的hello.c
  如果回答n,则取出失败,回答是则覆盖当前文件与-l相反的选项是-u,取出不加锁的文件用于工作。-f则在ci时强制覆盖RCS仓库中的文件,在co时强制覆盖当前的文件。 
  
  在RCS中,支持类似于宏的关键字,在ci后,这些关键字会被RCS替换成特定的信息,如$Id$关键字:
  /*$Id
  */
  #include
  int main (void)
  {
  printf ("Hello World\n");
  printf("checkoutwithlock\n");
  return 0;
  }
  ci 之后,然后取出,文件将变成:
  /*$Id: hello.c,v 1.3 2001/02/22 16:16:58 kerberos Exp kerberos $
  */
  #include
  int main (void)
  {
  printf ("Hello World\n");
  printf ("check out with lock\n");
  return 0;
  }
  $Id$ 关键字是用文件名、版本、时间、作者 及代码性质替换,如果使用-l选项取出,在Exp后面会加上登录用户的名称。除了$Id$关键字,RCS还支持下面常用的关键字:
  $Log$ : 你所提供的修改日志信息。
  $Author$ :存入该版本的作者。
  $Locker$ : 该版本的加锁者
  $State$ : 该版本的状态 Exp(试验版), Stabe(稳定版), Rel(发行版).缺省是Exp
  $Date$ : 该版本存入的时间,使用UTC时间格式。
  $Revision$ : 该版本的版本号
  $RCSfile$ : RCS文件名
  $Source$ : RCS全路径名
  $Name$ : 取回该版本的符号名
  $Header$ : 相当于$ Source $$ Revision$$Date$$Author $$State$$Locker$的组合在UNIX/Linux下有一个diff工具可以比较两个文件的不同,rcsdiff可以在不同的版本之间比较文件的不同,而不必取出文件,如:
  rcsdiff hello.c 比较当前hello.c文件与RCS仓库中最新版本的区别。
  rcsdiff -r1.1 hello.c 比较当前hello.c文件与hello.c的1.1版本的区别。
  rcsdiff -r1.2 -r1.1 比较hello.c 文件的1.1版本和1.2版本的区别。
  使用这个命令,可以很方便的做出任意版本之间的补丁文件。
  另外,还有其他一些不常用的RCS命令,读者可以参考更详细的资料。
  
  CVS使用
  下面我们就讲一下CVS的使用和管理。
  
  在使用CVS之前,必须要指定CVS的根路径,不像RCS是工作在工作目录下的RCS目录下。指定CVS路径的方法有两种,一种是使用cvs-d 选项指定,如:
  cvs -d /home/kerberos/cvsroot 指定/home/kerberos/cvsroot为CVS仓库的路径。
  另外一种是使用CVSROOT环境变量指定(bash下):
  export CVSROOT=/home/kerberos/cvsroot
  
  无论何种方式,每当重新开启一次终端会话,CVS仓库的路径都要重新设置,你可以把以上的后者加入到其实目录下的.bashrc文件中,这样开启一次终端会话后,不需要重新设置了(对于其他的环境变量的设置也是如此)。如果你的CVSROOT环境变量已经存在,可以使用cvs -d 选项来指定不同于CVSROOT所指定的CVS仓库。然后初始化CVS仓库,建立CVS维护所需要的一些文件和信息,CVS把这些信息存放在CVS仓库主目录的CVSROOT目录下。这些文件,除了modules ,其他文件都没有手动修改的必要,modules 文件定义了CVS的导出模块在CVS仓库中的位置,这一点在从CVS仓库中导出一个深层目录时是非常方便的。
  
  cvs init
  初始化之后,我们使用cvs import来把需要进行版本维护的开发项目的目录结构导入到CVS仓库中,如下:
  建立好项目的目录结构以后,当前的testprj目录的结构是这样的:
  
  [kerberos@power zhyf]$ tree testprj
  testprj
  |-- admin
  |-- doc
  |-- include
  |-- libs
  `-- src
  |-- include
  `-- main
  
  7 directories, 0 files
  cvs import有三个参数:第一个是这个目录树在CVS仓库中的模块名称,第二个是发布者的一个标志,第三个是这个项目的版本标记(tag)。下面,我们把testprj导入到CVS仓库中,使用testprj 模块名称。
  [kerberos@power testprj]$cvs import testprj KERBEROS INITVER
  
  执行命令以后,CVS会调用CVSEDITOR指定的编辑器来让你输入日志,如果CVSEDITOR没有定义,缺省调用vi,可以使用export命令指定你自己喜欢使用的编辑器。输入日志以后,CVS把当前的目录结构导入CVS仓库中,并且使用testprj这个模块名称,在导出文件时,就可以使用
  cvs co testprj 来导出。
  "/tmp/cvscVxZnW" 5L, 242C written
  cvs import: Importing /home/zhyf/cvsroot/testprj/admin
  cvs import: Importing /home/zhyf/cvsroot/testprj/libs
推荐阅读
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • DockerDataCenter系列(四)-离线安装UCP和DTR,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 程序员如何选择机械键盘轴体?红轴和茶轴对比
    本文介绍了程序员如何选择机械键盘轴体,特别是红轴和茶轴的对比。同时还介绍了U盘安装Linux镜像的步骤,以及在Linux系统中安装软件的命令行操作。此外,还介绍了nodejs和npm的安装方法,以及在VSCode中安装和配置常用插件的方法。最后,还介绍了如何在GitHub上配置SSH密钥和git的基本配置。 ... [详细]
  • Django + Ansible 主机管理(有源码)
    本文给大家介绍如何利用DjangoAnsible进行Web项目管理。Django介绍一个可以使Web开发工作愉快并且高效的Web开发框架,能够以最小的代价构建和维护高 ... [详细]
  • 现在比较流行使用静态网站生成器来搭建网站,博客产品着陆页微信转发页面等。但每次都需要对服务器进行配置,也是一个重复但繁琐的工作。使用DockerWeb,只需5分钟就能搭建一个基于D ... [详细]
  • 在单位的一台4cpu的服务器上部署了esxserver,挂载了6个虚拟机,目前运行正常。在安装部署过程中,得到了cnvz.net论坛精华区 ... [详细]
author-avatar
胡龙云积极_622
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有