版本管理 1. CVS 2. Subversion 3. Clisoft SOS 4. IC
Manage 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 Adding
config.txt Adding
xconnect_config.txt Adding
ASIC_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': A
project1/trunk/config.txt A
project1/trunk/xconnect_config.txt A
project1/trunk/ASIC_ADDR_SYNC A
project1/trunk/ASIC_ADDR_SYNC/SW2ASIC_20051103 A
project1/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
查看哪些文件有变化
A
test.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”
提交修改了的文件
Adding
test.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 $svn
copy –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。
|