集中式
CVCS的版本库集中存放在*服务器,而工作时都是用自己的电脑,所以要先从*服务器取得最新的版本,然后工作完后再将自己的代码推送给*服务器。
CVS:最早的、开源、免费。由于自身设计的问题,会造成提交文件不完整、版本库莫名其妙损坏的情况
SVN:开源、免费。修正了CVS的一些稳定性问题,是目前用得最多的集中式版本库控制系统
ClearCase:收费、安装比Windows还大、运行比蜗牛还慢。IBM 收购了原本制作的Rational公司
VSS:集成在Visual Studio中。反人类的设计?
集中式版本控制系统最大的问题就是必须联网才能工作,受网络状况、带宽影响。
分布式
DVCS没有*服务器(也可以有),允许开发人员组实现他们选择的几乎任何工作流,每个人的电脑上都是一个完整的版本库,所以不需要联网。如何多人协作? 如:你修改了文件A,同事修改了文件A,此时只需把各自的修改推送给对方,就可以互相看到对方的修改了。
Git、BitKeeper(促使Git诞生)、Mercurial和Bazaar等。
特点与比较
集中式:1、通过与中心服务器的连接执行所有操作,必须联网
分布式:1、快速,本地客户机操作,不联网也不影响工作,离线工作,DVCS 比 Subversion 快大约3-10倍
2、可以实现非常灵活的工作流(传统的集中式工作流 + 特殊工作流 + 特殊工作流和集中式工作流的组合)
3、安全性更高,因为每个人电脑里都是完整的版本库,坏了复制一份即可,CVCS*服务器出问题就GG
4、两台电脑互相访问不了或某一台电脑未开机不能执行复制(交换修改)时,通常有一台电脑充当*服务器
5、分支管理
钩子
钩子是在版本控制操作的生命周期中通过程序执行操作的方法。如:通过使用钩子,可以在代码签入(check in)存储库时自动发送电子邮件。另外,还可以在签入代码之前,检查用户是否满足一组条件,比如包含一个测试文件。
另一种扩展版本控制系统功能的方法是编写插件。
工作流
1、Partner 工作流:一个开发人员启动一个项目,然后进行分支,不同开发人员工作的分支之间来回合并更改。
2、通过本地提交使用集中式服务器的工作流:在这种工作流中,开发人员的工作方式与使用集中式 subversion 存储库时非常相似,但是他们进行本地提交,然后把最终更改推到集中式服务器。
快速入门
- Mercurial
- 安装:sudo easy_install-2.5 mercurial
- 建立项目目录:mkdir hgrepo; cd hgrepo
- 初始化项目:hg init
- 添加文件:touch foo.txt; hg add foo.txt
- 提交:hg commit -m "added foo.txt" commit
- 抓取共享的存储库:hg clone ssh://example.com//projects/hgrepo
- 本地提交更改:hg -ci -m "adding a change"
- 把更改推到服务器:hg push
- 以补丁形式查看未处理的更新:hg incoming -p
- 从服务器下载更新:hg pull
- 应用更改:hg update
- 合并冲突:hg merge
- 合并两个不相关的远程存储库:hg pull -f ssh://example2.com//projects/hgrepo
- Bazaar
- 安装:sudo easy_install-2.5 bzr
- 建立项目目录:mkdir bzrrepo; cd bzrrepo
- 初始化项目:bzr init
- 添加文件:touch foo.txt; bzr add foo.txt
- 提交:bzr commit -m "added foo.txt" commit
- 抓取共享的存储库:bzr branch bzr+ssh://example.com/projects/gitrepo
- 本地提交更改:bzr -ci -m "adding a change"
- 把更改推到服务器:bzr push
- 从服务器下载更新:bzr pull
- 应用更改:bzr update
- 合并冲突:bzr merge
- Git
- 安装:下载最新的tar文件http://kernel.org/pub/software/scm/
- 建立项目目录:mkdir gitrepo; cd gitrepo
- 初始化项目:git init
- 添加文件:touch foo.txt; git add foo.txt
- 提交:git commit -m "added foo.txt" commit
- 抓取共享的存储库:git clone ssh://example.com/projects/bzrrepo
- 本地提交更改:bzr -ci -m "adding a change" commit
- 把更改推到服务器:bzr push
- 从服务器下载更新:bzr pull
- 应用更改:bzr update
- 合并冲突:bzr merge
转换工具和与subversion的集成
上面三种 DVCS 都能够把现有的 subversion 存储库轻松地转换为各自的格式,甚至可以在不同的 DVCS 之间进行转换。
Mercurial可以使用 hgimportsvn 和 hgpullsvn 与现有的 subversion 存储库通信,创建新的 hg 存储库和历史。
tailor 工具是一种通用的存储库转换工具。
咖啡馆 — Mercurial工作流
实现安全的特殊版本控制工作流,让两个开发人员可以在咖啡馆中通过无线网络一起工作:
1、开发人员 A 创建一个存储库:mkdir /tmp/myhgrepo
cd /tmp/myhgrepo
hg init
2、通过 Web 作为只读共享:hg serve
3、开发人员 B 克隆这个存储库:hg clone http://example.com:8000( A机器的 IP 地址或本地主机名)
可以通过对 your-machine-name.local 使用 Bonjour 获得这一信息
4、开发人员 B 更改后作为只读的 HTTP 共享自己的存储库:http://example2.com:8000
5、开发人员 A 对开发人员 B 的存储库拷贝:hg clone http://example2.com:8000
参考文章
http://www.ibm.com/developerworks/cn/aix/library/au-dist_ver_control/