版本控制:集中式 vs 分布式

集中式

  CVCS的版本库集中存放在*服务器,而工作时都是用自己的电脑,所以要先从*服务器取得最新的版本,然后工作完后再将自己的代码推送给*服务器。

  CVS:最早的、开源、免费。由于自身设计的问题,会造成提交文件不完整、版本库莫名其妙损坏的情况

  SVN:开源、免费。修正了CVS的一些稳定性问题,是目前用得最多的集中式版本库控制系统

  ClearCase:收费、安装比Windows还大、运行比蜗牛还慢。IBM 收购了原本制作的Rational公司

  VSS:集成在Visual Studio中。反人类的设计?

版本控制:集中式 vs 分布式

  集中式版本控制系统最大的问题就是必须联网才能工作,受网络状况、带宽影响。

分布式

  DVCS没有*服务器(也可以有),允许开发人员组实现他们选择的几乎任何工作流,每个人的电脑上都是一个完整的版本库,所以不需要联网。如何多人协作? 如:你修改了文件A,同事修改了文件A,此时只需把各自的修改推送给对方,就可以互相看到对方的修改了。

  Git、BitKeeper(促使Git诞生)、Mercurial和Bazaar等。

版本控制:集中式 vs 分布式

特点与比较

  集中式: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工作流

版本控制:集中式 vs 分布式

  实现安全的特殊版本控制工作流,让两个开发人员可以在咖啡馆中通过无线网络一起工作:

  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/

上一篇:瑞丽的SQL-SQL Server的表旋转(行列转换)


下一篇:VisualStudio程序运行后控制台窗口一闪就没了