??xml version="1.0" encoding="utf-8" standalone="yes"?>
分布式版本控制系l已成爆发之势,来多的开源Y件用诸?GNU arch, Bazaar, Mercurial, Git, SVK{分布式版本控制pȝ?q一斚w是开源Y件开发的本质Q全部源码公开Q跨地域的开发团队)军_的,另一斚w是管理角度(服务器扩展性,Z信Q铄代码提交Q?
我们认ؓ了解分布式版本控制系l,对于E序员是必要的,因ؓ:
我们认ؓ“集中?#8221;版本控制pȝQ仍然是商业企业软g开发中的首选,因ؓ是企业对授权和集中管理的需要?即有跨地域开发的需要,我们也可以通过镜像、代理等方式实现 Subversion 的高效运行?
比较目 分布?bzr) 集中?svn) 性能 服务器扩展能?/p>
★★?/p>
?/p>
|络带宽占用 ?/p>
☆☆?/p>
本地保存的完整版本历?/p>
★★?/p>
- 安全 历史版本的安全验?/p>
★★?/p>
- 数据安全QBCPQ?/p>
★★?/p>
?/p>
分支操作 代码合ƈQmergeQ能?/p>
★★?/p>
★★ 分支理 ★★?/p>
★★?/p>
分支建立速度 ?/p>
★★?/p>
用户界面 使用q_q泛?/p>
★★?/p>
★★?/p>
命o行可用?/p>
★★?/p>
★★?/p>
Windows囑Ş界面 ?/p>
★★?/p>
权限理 l一的用户帐?/p>
- ★★?/p>
针对目录?Checkout - ★★?/p>
目录授权 - ★★?/p>
分支授权 ?/p>
★★?/p>
其他 q程版本库复?/p>
★★?/p>
★★?/p>
ȝ提交 ★★?/p>
-
我们选择 Subversion(SVN) 作ؓ企业版本控制工具的首选,而不?CVS。不是因为我们?Subversion 旉更久Q也不是因ؓ我们?Subversion 更有感情。恰恰相反,CVS 很早已l渗透到我们的血液中。关?CVS 可以参考我们这个文档: 《CVS 版本控制?/a>?
多年的?CVS 的开发经验,我们深感 CVS 在用和理上的不。下面是 SVN ?CVS 的对照?
比较目 CVS SVN 权限控制 是否依赖pȝ帐号 依赖 不依?/p>
可否对分支授?/p>
?/p>
?/p>
是否支持LDAP认证 ?/p>
?/p>
囑Ş化帐L?/p>
?/p>
?集中理q_) 用户可否获取忘记口oQ修改口?/p>
?/p>
?集中理q_) 目录Q文件名变更 ?/p>
?/p>
分支理 创徏分支旉 耗时* ?/p>
分支可见、查?/p>
?/p>
?/p>
二进制文?/p>
二进制优?/p>
?/p>
?/p>
二进制文件标?/p>
手工 自动 二进制文Ӟ囑Ş文gQ被破坏 易破?/p>
不易破坏 事物处理 量子提交 ?/p>
?/p>
修改提交说明 单个文g ?/p>
换行W?/p>
可否指定换行W类?/p>
?/p>
?/p>
查换行符讑֮Q避免跨q_开发带来的混ؕ ?/p>
?/p>
功能扩展 CVSROOT hooks 脚本 |络带宽 |络带宽占用 ?/p>
?/p>
脱机命o ?/p>
部分
那么商业的版本控制工具如何呢Q我们要大声告诉你,不要Q不要把您的核心资—?#8220;代码”让他人绑Ӟ
比较目 某商业Y?/strong> SVN 服务器端存储 是否依赖数据库(额外的管理负担) 依赖 不依?/p>
数据存储格式是否开?/p>
?/p>
?/p>
是否可以版本库导出Q以侉K建、导入其他项目、分发给W三Ҏ者配|管理Y件切换?/p>
?/p>
?/p>
是否可以Ҏ务器端存储进行整?/p>
?/p>
?/p>
是否可以d删除配置?/p>
?/p>
? 可否通过插gq行功能扩展Q?/p>
?/p>
?/p>
命o?/p>
命o行功能是否完?以便实现工作自动?/p>
?/p>
?/p>
是否可以集成到自动编?nightly build)pȝQ?/p>
?/p>
?/p>
文g状态保?/p>
客户端本地是否有配置文g以保持状态? ?/p>
?/p>
是否依靠服务器端q行状态保持? ?/p>
?/p>
客户端是否可以脱行? ?/p>
?/p>
工具整合 是否可以和资源管理器整合Q?/p>
?/p>
?/p>
是否?Eclipse 插gQ?/p>
?/p>
?/p>
成本 软g本n成本 ?/p>
?/p>
培训成本 ?/p>
?/p>
?#8220;开源速?#183;集中理”q_整合;
2. 分布式还是集中式版本控制
3. SVN ?CVS 的对?/h2>
4. SVN ?商业版本控制pȝ的对?/h2>
5. 英汇:功能扩展
6. Z么选择英?/h2>
7. 相关文档
CVS
代表协作版本pȝQ这是一个将一l文件放在层ơ目录树中以保持同步的系l。h们可以从
CVS
服务器上更新他们的本地层ơ树副本Qƈ修改的l果或新文g发回Q或者删除旧文g?/span>
CVS
Z客户?/span>
/
服务器的行ؓ使得其可容纳多用P构成|络也很方便。这一Ҏ?/span>
CVS
成ؓ位于不同地点的h同时处理数据文g
(
特别是程序的源代?/span>
)
时的首选?/span>
服务?/span>
1
。初始化
cvs
服务器环?/span>
Q?/span>
cvs –d /tmp/source init
命o?/span>
/usr/local/sourc
下徏立了
cvsroot
目录Q里面是初始化的
cvs
服务器配|文件?/span>
2
。把
cvs
服务器放?/span>
xinetd
?/span>
Q?/span>
vi /etc/xinetd.d/cvspserver
建立服务文gq添加内?/span>
server cvspserver
{
flags = REUSE
socket_type = stream
wait = no
user = root
protocol = tcp
server = /usr/bin/cvs
server_args = -f –allow-root=/tmp/source pserver
disable = no
}
其中
server_args
一个参数指定了源代码\?/span>
,
一个指定了服务器用密码认证方?/span>
.
然后保
/etc/services
文g中有以下两行
cvspserver 2401/tcp
cvspserver 2401/udp
最后重?/span>
xinetd
服务?/span>
试
假设
cvs
服务器在
192.168.0.192
上,pȝ上有一个用?/span>
cvs
。登陆另一?/span>
linux
机器Q执行下列命令可以完成测试?/span>
$export CVSROOT
Q?/span>
:pserver:cvs@192.168.0.192:2401/tmp/source
$cvs login
输入密码Q没有错误提CC登陆成功?/span>
$cvs logout
d
用户认证
cvs
服务器有一套自q用户认证机制Q此Ҏ使用了系l上用户直接作ؓ
cvs
服务器用P采用
linux
l、用h限实现这L功能?/span>
例如Q在
linux
pȝ上有两个开发组
a
?/span>
b
Q分别有用户
a
Q?/span>
user1
Q?/span>
a
Q?/span>
user2
Q?/span>
b
Q?/span>
user1
Q?/span>
b
Q?/span>
user2
?/span>
模块
a
Q?/span>
source
Q希?/span>
a
l成员都可以dQ?/span>
b
l没有Q何权限,使用以下命oQ?/span>
Q?/span>
chown –R a-user1 a-source
Q?/span>
chgrp –R a a-source
Q?/span>
chmod –R 770 a-source
如果希望
a
Q?/span>
source
Q只?/span>
a
Q?/span>
user1
可以写,同组其他用户可以读,
b
l没有Q何权限,?/span>
chmod
命oҎ
Q?/span>
R 750
卛_?/span>
说明
cvs
中默认一个用?/span>
checkout
代码时候,会在当前模块下生成一个锁文gQ如果这个用户对当前模块没有写权限,L不可能的。配合上面的权限讄Q必L以下
cvs
服务器配|。改成不在当前模块目录下生长锁文Ӟ把锁文g集中C个所有用户都有读写权限的目录。修攚w|文?/span>
CVSROOT/config
Q?/span>
Put CVS lock files in this directory rather than directly in the repository.
Q?/span>
LockDir=/var/lock/cvs
?/span>
LockDir
设上可以了?/span>
pȝ建立多个源代码库
1
。用一个不同\?/span>
2
?/span>
/etc/xinetd.d
目录下徏立一个新的Q务配|文Ӟ?/span>
cvspserver1
Q文件中W一?/span>
server
名称一定要区分。如改ؓ
server cvspserver1
Q?/span>
server_args
做相应变动。还要在
/etc/services
文g中,加入新的服务器端口,?/span>
cvspserver1 2402/tcp
。重?/span>
xinetd
卛_?/span>
CVS
的用流E?/span>
1
。登?/span>
(login)
Q只需做一ơ。需要密码认证,除非是允许匿名登入,否则都要输入
CVS Server
理者配l您的密码?/span>
2
。取?/span>
(checkout)
整䆾专案
(
cM档案下蝲
)
。此Ӟ您的碟中会有一份专案的原始码目录,我们UC为工作目录?/span>
3
。依您的E式意图Q修Ҏ一支程式?/span>
4
。查询程式的在库状?/span>
(status)
?/span>
(3
?/span>
4
q二个动作可互调或合q操?/span>
)
5
。视在库状态,比对二者的差异
(diff)
Q调整修改的E式
(
是否和他Z改的部䆾发生冲突Q若无冲H,那就十分单纯Q可在修改完之後Q直接存?/span>
(commit/ci)
档案?/span>
(repository)
?/span>
)
6
。若有冲H,?/span>
mailling list
中,和他论,取得协调?/span>
7
。将修改好的档案
commit
存入
CVS
档案?/span>
(
俗称
checkin
Q类似档案上?/span>
)
Q请务必在程式码注解中,详述您的意图?/span>
8
。透过
mailling list
说明您的xQ和大家讨论?/span>
9
。每l过一D|日,应查询在库状态,q更新您的工作目?/span>
(update)
?/span>