| 版本管理 1. CVS 2. Subversion 3. Clisoft SOS 4. ICManage
 5. Git CVS用于代码的管理
 CVS作为unix系统下非常经典的版本管理系统,适合于代码的简单管理。对权限控制很差,基本上只能按照group的方式来控制谁可以check out,check in.CVS没有二进制管理能力,无法对各种非文本的文档,比如word进行管理,只能用于代码。
 
 CVS是一个C/S模式的版本控制系统,用于在软件开发过程中记录文件版本,协调开发人员保证文件同步,从而保证项目正确的进行并行开发,并支持版本回滚、bug 跟踪和补丁生成。使用CVS可以有效地对软件开发的源代码和开发文档进行统一的管理和组织。
 
 主要功能如下:
 同步的最新修改
 文件的版本回溯
 多人同时修改同一个文件产生的冲突
 项目的分支开发
 文件权限控制
 
 Redhat Enterprise默认安装有cvs,如果没有,请安装cvs的rpm包。
 
 CVS的基本使用:
 创建一个仓库
 #groupadd cvs #useradd –d /data/cvsroot -gcvs cvs #cvs –d /data/cvsroot init 
 配置环境
 $vi ~/.cshrc  $setenv CVSROOT /data/cvsroot 
 项目的初始导入
 进入到你准备到如的初始源代码目录
 $cvs import -m "somecomments" project_name vendor_tag release_tag 执行后:会将所有源文件及目录导入到/data/cvsroot/project_name目录下
 vender_tag: 开发商标记
 release_tag: 版本发布标记
 这个project可以给某个unix group授权chmod 775 root:asic/data/cvsroot/project_name,这样所有asic group的人都可以check in和check out了。
 
 项目的CheckOut $cvs co project_name 
 同步到最新
 $cvs update 
 修改文件后CheckIn $ cvs ci -m "somecomments" file_name 
 添加新文件
 创建好新文件后,比如:touch newfile cvs add newfile 
 对于图片,Word文档等非纯文本的项目,需要使用cvs add –kb 按二进制文件方式导入(k表示扩展选项,b表示binary),否则有可能出现文件被破坏的情况
 比如:
 cvs add -kb newfile.gif cvs add -kb readme.doc 
 查看修改历史
 cvs log file_name cvs history file_name 
 其实CVS还有一种pserver的方式,可以使用客户端来进行管理。这样,即时/data/cvsroot没有被nfs 共享出来在其他服务器上也可以通过cvs进行版本控制。
 分两步建立:
 首先,建立xinetd启动服务
 cat >>/etc/xinetd.d/cvspserver << "EOF" 
 service cvspserver
 {
 port
 = 2401
 socket_type = stream
 protocol
 = tcp
 wait
 = no
 user
 = root
 passenv
 = PATH
 server
 = /usr/bin/cvs
 server_args = -f --allow-root=/data/cvsrootpserver
 }
 EOF
 
 
 其次,客户端设置.cshrc (csh forexample) $vi ~/.cshrc 
 setenv CVSROOT:pserver:username@192.168.x.x:/data/cvsroot 这里的username请换成自己的,后面的ip地址和路径,请换成符合实际服务器的路径。
 Subversion
 以下文档是很早的时候写的,跟最新版本可能存在一定差异,请注意。
 
 subversion简介
 多年来,版本控制系统一直都是CVS(Concurrent Versions System)的天下。CVS作为基
 于RCS上建立,可以实现多用户协同工作的系统,可以记录文件的修改信息。这对于开发人员是非常有用的。
 然而,CVS经过这么多年,也逐渐显示出一些不足,这个时候出现了一些商业的版本控制软件,比如Rational的ClearCase就是一个功能强大的商业软件,但是其价格也是非常昂贵的。
 Subversion就是一种设计来解决CVS的局限性的软件。从2000年开始,Subversion开始开发,2001年8月开始用Subversion来管理Subversion的开发工作,到目前位置,subversion已经发展到了1.9.3版。
 Subverion的主要特点有:
 a.保留大多数CVS 特性,很多命令的选项基本通用
 b.目录、重命名和文件meta-data都已经版本化,以前的CVS只能对文件版本化。
 c.不可分隔的原子化提交,版本的变化是每次提交所有的文件版本都变化。
 d.可以选择Apache作为网络服务器,集成于现有Apache控制的权限管理等。
 e. 分支和标签是代价低廉(固定不变的)的操作
 f.本地化的客户端/服务器,分层的库设计
 g.消耗和修改部分的大小成比例,而不是数据的大小
 h.Unix下的链接也可以实现版本化控制了 
 i.更加有效的处理二进制文件
 j.更加人性化的命令输出
 k.本地化提示信息。
 
 Subversion的安装
 Subversion是建立在一个可移植的APR(Apacheportable Runtime)上,所以Subversion可以建立在Apache的支持上,但是不仅限于必须使用Apache。Subversion可以做为Apache 2.0的一个模块,以WebDAV/DeltaV协议运行,也可以采用其自带的svnserver小型服务器运行。我们这里将采用Apache下WebDAV/DeltaV方式运行,所以需要检查Apache2.0是否已经安装好。
 # yum install subversion RHEL6默认安装的是1.6.11版本的subversion 
 
 Subversion和CVS的比较
 1.不同的修订版本号。CVS将每个修改文件都赋予一个版本号,因此在CVS中,所有的文件版本号是不同的。
 2.Subversion将目录版本化了。Subversion也开始跟踪目录的结构,任何对目录的svn操作都将会被记录,但是任何操作都必须提交后才生效。
 3.离线工作更加方便。Subversion的工作原始副本在本地也有保留,任何对本地文件的修改,不需要连接到服务器去,就可以对比知道自己做了哪些修改。并且,提交修改的时候Subversion只将差异部分提交给服务器。
 4.二进制文件和文本文件。CVS对二进制文件的版本化做的非常差,对于每次修改的二进制文件,CVS都会将更新的副本储存下来,大量占用了空间。而Subversion就不管是二进制文件还是文本文件,它都采用差异比较算法来表示更新的部分。CVS提交二进制文件需要带-kb标记,subversion不需要任何标记就可以识别二进制文件。
 
 实例介绍
 目前有一家公司,有两个不同的Group在进行开发,也就是说,两个项目组的成员是不允许获得另外一个项目组的开发代码的。当时,为了某些模块的协同工作,两个项目组的Project Manager又不得不互相取得对方的代码。
 现在我们设计一个Subversion来做版本控制的系统,假设一共有6个用户,group1有user1,user2,manager1;group2有user3,user4,manager2.项目组分别为project1,project2. 由于我们的权限方面控制比较复杂,而适合权限复杂控制以及更好授权选择的方式,我认为以Apache+mod_dav_svn比采用独立的svnserve更加方便。
 
 建立Apache+mod_dav_svn的subversion版本控制
 (1).安装mod_dav_svn #yum install mod_dav_svn (2).基本的Apache配置
 #cd /etc/httpd/conf #vi httpd.conf 找到LoadModule部分,在LoadModule dav_module后面加入两行
 LoadModule dav_module modules/mod_dav.so LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so 在配置文件中,需要告诉Apache在什么地方保存的Subversion版本库,Location就是告诉Apache在特定的URL以及子URL下需要的特殊处理。
 在文件的最后部分建立<Location>区块
 <Location /svn>
 DAV svn
 SVNParentPath
 /data/svn
 </Location> 注意,任何Apache的web目录下不能存在svn这样的目录,否则会导致Apache不知道怎么解析。
 (3).配置认证部分
 前面的配置会让所有能访问你web的人都可以获得你的文件,并且可以提交他的修改。所以,为了安全,也为了一个很好的秩序,我们必须添加认证。
 <Location /svn> DAV svn
 SVNParentPath
 /data/svn
 # access control policy
 AuthzSVNAccessFile/etc/httpd/conf/access-control-file
 # Only authenticatedusers may access the repository
 Require valid-user
 # Howto authenticate a user
 AuthType Basic
 AuthName"Subversion repository"
 AuthUserFile/etc/httpd/conf/svn-auth-file
 </Location>
 其中的svn-auth-file是做用户名和密码认证的,这个文件采用htpasswd来生成和修改。
 $htpasswd –cm /etc/httpd/conf/svn-auth-file user1(第一次使用需要带-c)
 New passwd:***** Re-type new password:***** Adding password for user user1 $htpasswd –m /etc/httpd/conf/svn-auth-file user2 New passwd:***** Re-type new password:***** Adding password for user user2 ….. access-control-file文件的格式:
 [groups] project1 = user1 user2 manager1 project2 = user3 user4 manager2 [project1:/] @project1 = rw manager2 =rw [/project2:/] @project2 = rw manager1 = rw [/project2:/secret] manager1 = 以上配置允许user1,user2,manager1,manager2访问project1的所有文件,并且都可以读写;user3,user4,manager2访问project2的所有文件可以读写,但是manager1只允许读写除了secret目录下的所有其他文件。
 
 建立过程及基本使用
 (1).CreatRepository 基本语法:
 $svnadmin create/data/svn/project1
 
 #chmod 755 /data/svn
 $svnadmin create /data/svn/project1 $svnadmin create /data/svn/project2 建立两个项目组的库,我们采用了默认的FSFS存储方式。
 $ls /data/svn/project1 conf/ dav/ db/ format hooks/ locks/README.txt 
 (2).导入文件到Repository 我们已经建立了库,所以该我们导入我们的源文件到库里边的时候了。我们首先来准备一下两个项目组的文件,然后导入到库里。
 A.准备需要导入的文件
 $cd /home/svn 建立project1的文件目录结构,源文件在/somepath/source1/下面,是project1的项目源代码。
 $mkdir source1 $mkdir source1/trunk $mkdir source/branches $mkdir source/tags $ls source1 $mv /somepath/source1/*source1/trunk/
 project2的建立方法和上面类似
 B.导入项目文件到库里
 $cd source1 $svn import --message “Intial files for Project1”file:///data/svn/source1
 Addingconfig.txt
 Addingxconnect_config.txt
 AddingASIC_ADDR_SYNC
 …… Project2的导入方法类似
 导入完毕后,可以删除刚才准备的源文件了。
 $rm –rf source1 source2 
 (3).获取一份源文件的拷贝
 以用户user1的身份登陆系统,在自己的Home目录下,可以用命令svn checkout
 的方式获得一份subversion控制下的源文件。如果不特别指名,获得的文件在本地目录
 和在subversion下面的目录结构一致。所以,我们为了区分,应该指定一个本地的目录
 名。
 $svn checkouthttp://domain/project1/trunk
 project1_trunk
 [user1@server ~/test]$svn co http://domain/svn/project1/trunk project1_trunk
 Authentication realm: <http://domain:80> Subversionrepository Password for 'user1':  Aproject1/trunk/config.txt
 Aproject1/trunk/xconnect_config.txt
 Aproject1/trunk/ASIC_ADDR_SYNC
 Aproject1/trunk/ASIC_ADDR_SYNC/SW2ASIC_20051103
 Aproject1/trunk/ASIC_ADDR_SYNC/SW2ASIC_20051103/addr.txt
 (4).编辑和提交修改
 编辑文的文件,可以用你喜欢的任何编辑器,我们现在添加一个文件.
 $touch test.txt Add a line for this file $svn add test.txt添加一个文件到subversion,但是直到后面提交后才才库中生效
 
 $svn status查看哪些文件有变化
 
 Atest.txt
 $svn diff test.txt比较本地文件和库中的不同
 
 Index: test.txt ================================ --- test.txt(revision0)
 +++ test.txt(revision0)
 @@ -0,0 +1 @@ +Add a line for this file $svn ci –m “add a line for test.txt”提交修改了的文件
 
 Addingtest.txt
 Transmitting file data . Committed revision 3. $svn log test.txt 查看变化历史
 --------------------------------------------------------------------- r3 | admin | 2005-11-12 14:43:36+0800 (Sat, 12 Nov 2005) | 1 line 
 add a line --------------------------------------------------------------------- $svn update 获得最新的版本,使用这个命令获得他人的最新更改。
 如果发生冲突,使用svn resolve解决
 
 (5).Svn客户端常用命令
 svn add//添加一个文件
 
 svn checkout(coi)//从苦衷获取一个工作拷贝
 
 svn cimmit(ci)//提交当前工作拷贝的更改到代码苦,如果出现冲突需要解决。
 
 svn copy(cp)//做一个工作的拷贝
 
 svn delete(del,remove,rm)//删除本地或者svn库中的文件或者目录
 
 svn diff(di)//比较某个文件和库中对应的文件的不同,和系统的diff命令类似
 
 svn export//导出一个无版本控制的目录树拷贝,用于可以运行的版本需要导出。
 
 svn import//将当前目录下的文件导入到库中
 
 svn info//查看当前目录下的某个文件或者文件夹的信息
 
 svn list(ls)//列出当前拷贝的文件
 
 svn mkdir//在本地或者库中新建一个文件夹
 
 svn move(mv,rename,ren) 类似于系统的mv命令
 svn status(stat,st)//svn工作拷贝的当前状态,和上次提交或者update后的对比
 
 svn update(up)//将svn库中的文件同步到本地
 
 
 (6).创建一个Tag和Branch Subversion创建Tag和Branch和CVS不一样,它采用的是copy方式。
 A.创建一个Tags,只能这个项目的Project Manager负责,下面以manager1用户登陆操作。
 $svn copy –m “Create Tag version1” [url=]file:///data/svn/project1/trunk/[/url][url=]file:///data/svn/project1/tags/version1[/url]
 
 $svn list [url=]file:///data/svn/project1/tags[/url]
 version1 B.创建一个Branch $svncopy –m “createBranch a” [url=]file:///data/svn/project1/trunk/[/url]
 [url=]file:///data/svn/project1/branches/brancha[/url]
 
 以user1登陆
 $svn switch http://domain/svn/project1/branches/brancha
 这样以后user1就以brancha作为工作的库目录,从这里开始作为分支。
 
 (7).Merging a Branch 
 (8).Windows客户端的安装和使用
 下载TortoiseSVN-xxx.msi,安装,然后CheckOut一个库的拷贝。
 Clisoft SOS介绍
 a.业界最完整的版本控制工具. 具有动态连结及智能快取等强大功能
 
 完整得知所有使用者档案修改, 增减, 开启等记录...节省硬件的支出, 让系统管理员更有效控制数据的管理与储存
对于硬件和软件设计资源     (design resouce), 设计者可以更有效的取得及运用
单键标注(Tag)整个工作目录下所使用的版本.数据库快照(Snapshot)及最完整的安全控管机制.可任意任务分组¸ 控制组员可擦写之目录及档案
最简易的操作接口, 无需管理员. 工程师一小时上手
提供命令模式, 易于与EDA工具整合.内建 Bug     Tracking 功能, 可通知同组伙伴所须修改之错误.提供丰富的管理工具及     Trigger 功能.与 Cadence     DFII 完整结合
提供工作交接及内部教育训练一个最佳平台环境.提供最佳异地开发功能
 
 
 这个软件主要是针对全定制IC设计的, 可以嵌入:
 Cadence Virtuoso Custom IC  Agilent Advanced Design System(ADS)   Mentor Pyxis Synopsys Laker  Synopsys Custom Designer 
 
    
    
            
              
 
 
 SOS是商业软件,只要购买了,安装和配置完全由厂家支持,这里就不再做详细的介绍了。
 IC
 Manage
 没有接触过,据说也是一个不错的IC公司喜欢用的版本管理软件。
 git
 很好的一个分布式版本管理软件,在开源软件开发行业使用非常广泛。不过目前在IC设计行业所见不多,也许我们IC行业太落后了,没互联网和开源界对新技术的接受能力强。我们习惯用我们熟悉的东西。
 
 搭建:
 (1) yum install git [root@eda ~]# git --version git version 1.8.3.1 (2)创建git用户
 [root@eda ~]# git --version git version 1.8.3.1 [root@eda ~]# cd [root@eda ~]# pwd /root [root@eda ~]# useradd git [root@eda ~]# passwd git Changing password for usergit. New password:  Retype new password:  passwd: all authenticationtokens updated successfully. [root@eda ~]# su - git [git@eda ~]$ mkdir srv [git@eda ~]$ ls srv [git@eda ~]$ cd srv 
 (3)初始化项目
 [git@eda srv]$ git init--bare proj.git Initialized empty Gitrepository in /home/git/srv/proj.git/ [git@eda srv]$ ls proj.git 
 (4)Clone [git@eda work]$ git clonegit@localhost:srv/proj.git Cloning into 'proj'... git@localhost's password: 
 
 (5)添加文件
 [git@eda work]$ ls proj [git@eda work]$ cd proj/ [git@eda proj]$ touch abc.txt [git@eda proj]$ vi abc.txt  wgh test "abc.txt" 2L, 9Cwritten
 [git@eda proj]$ ls abc.txt [git@eda proj]$ pwd /home/git/work/proj [git@eda proj]$ git addabc.txt [git@eda proj]$ git commitabc.txt -m "test file" 
 *** Please tell me who youare. 
 Run 
 git config --global user.email"you@example.com"
 git config --global user.name "YourName"
 需要设置提交者的个人信息
 [git@eda proj]$ git config--global user.name "Guanghui" [git@eda proj]$ git config--global user.email "wanggh@gmail.com" 
 (6)提交文件
 [git@eda proj]$ git commitabc.txt -m "test file" [master (root-commit)0455f79] test file 1 file changed, 2 insertions(+)
 create mode 100644 abc.txt
 
 [git@eda proj]$ git pushorigin master git@localhost's password:  Counting objects: 3, done. Writing objects: 100% (3/3),215 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0(delta 0) To git@localhost:srv/proj.git * [new branch]
 master -> master
 [git@eda proj]$ 
 (7)查看变化是否提交
 我们需要重新git clone一份
 [git@eda ~]$ git clonegit@localhost:srv/proj.git [git@eda ~]$ cd proj/ [git@eda proj]$ ls abc.txt [git@eda proj]$ git log commit0455f7997a895e5ffea3f016ec04bf2bdb7b25ad Author: Guanghui <wanggh@xmail.com> Date:Fri Apr 15 21:44:12 2016 +0800
 
 test file
 发现已经存在我们刚才添加进入的一个文件了。
 
 权限管理
 要方便管理公钥,用Gitosis;
 要像SVN那样详细地控制权限,用Gitolite。
 |