分布式版本控制系统入门

简介

在过去几年,对于分布式版本控制可以给开发过程提供的益处有许多争论。最近,分布式工具已经很成熟了。尽管分布式工具的一些优点最初可能不明显,但是从长期来看,它们提供的灵活性是非常有意义的。阅读完本文之后,您应该能够开始使用分布式版本控制系统,基本了解分布式模型能够提供的优点。

围绕分布式版本控制的争论主要集中在不再需要的中心服务器。这是一个非常独特的特性,对于一些开发人员组很重要,但是它的真正价值在于,它允许开发人员组实现他们选择的几乎任何工作流。它能够完成很多事情,比如传统的集中式模型,或两个开发人员在咖啡馆通过无线连接协同工作,等等。

允许开发人员以各种新的方式工作,这是分布式版本控制真正令人兴奋的特点。实际上,在本文末尾会介绍如何实现这样的“咖啡馆”工作流。这对于作家、学校教师和 Linux® 内核开发人员都有益处。

什么是分布式版本控制?

分布式版本控制 (DVCS) 是一种不需要中心服务器的管理文件版本的方法,但是它也可以使用中心服务器。更改可以被合并到 DVCS 的任何其他用户的系统中,因此可以实现非常灵活的工作流。

DVCS 的两个主要优点是:它比集中的版本控制更灵活,因为它除了支持传统的(集中式)工作流,还支持其他各种工作流;它比集中式服务器快得多,因为大多数操作在客户机本地进行,而不需要网络操作。

什么是钩子?

钩子是在版本控制操作的生命周期中通过程序执行操作的方法。例如,通过使用钩子,可以在代码签入(check in)存储库时自动发送电子邮件。另外,还可以在签入代码之前,检查用户是否满足一组条件,比如包含一个测试文件。

另一种扩展版本控制系统功能的方法是编写插件。如果打算编写自己的插件,在 参考资料 中可以找到描述 Bazaar、Git 和 Mercurial 的插件系统的文章链接。

DVCS 和集中式版本控制系统的主要差异

在 DVCS 和集中式版本控制系统之间有三个关键差异。第一个差异是,DVCS 通过本地提交支持离线工作,这是由 DVCS 的操作方式决定的。这与集中式版本控制完全不同,集中式版本控制要求通过到中心服务器的连接执行所有操作。这种灵活性让开发人员在飞机上也能够像在办公室中一样轻松地工作,可以一次又一次地进行提交。

第二个差异是 DVCS 比集中式系统更灵活,因为 DVCS 支持许多不同类型的工作流,从传统的集中式工作流到纯粹的特殊工作流,再到特殊工作流和集中式工作流的组合。这种灵活性允许通过电子邮件、对等网络和开发团队喜欢的任何方式进行开发。

第三个差异是 DVCS 比集中式版本控制系统快得多,因为大多数操作在客户机上进行,速度非常快。另外,在需要进行推(push )操作(与另一个节点通信)时,速度也更快,因为两个客户机机器上都有完整的元数据。速度差异相当显著,根据使用本地存储库还是网络存储库,DVCS 比 Subversion 快大约 3-10 倍。

分布式版本控制工作流

因为 DVCS 非常灵活,可以实现各种各样的工作流,但是由于篇幅有限,本文只讨论两种工作流。首先讨论最常用的工作流之一 Partner 工作流。按照 Partner 工作流,一个开发人员启动一个项目,然后进行分支。然后,在不同开发人员工作的分支之间来回合并更改。

第二种常用的工作流是通过本地提交使用集中式服务器。在这种工作流中,开发人员的工作方式与使用集中式 subversion 存储库时非常相似,但是他们进行本地提交,然后把最终更改推到集中式服务器。这种工作流有许多变体,包括与 Partner 工作流结合使用。重要的是,可以采用许多种工作方式,通过使用 DVCS,可以灵活地选择最适合自己的工作方式。

快速入门指南

了解一种新技术的最好方法之一是实际使用它。在本节中,简要介绍 Mercurial、Bazaar 和 Git 中的常用操作,您可以试试这些操作:

  • 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 之间进行转换。这使开发人员能够方便地试用 DVCS 或从一种 DVCS 转移到另一种 DVCS。

例如,对于 Mercurial,可以使用工具 hgimportsvn 和 hgpullsvn 与现有的 subversion 存储库通信,创建新的 hg 存储库和历史。tailor 工具是一种通用的存储库转换工具。

另一种有意思的试用方法是集成 DVCS 与现有的 subversion 存储库。对这种方法的详细讨论超出了本文的范围,但是 参考资料 给出了一些工具的链接,这些工具可以在 subversion 分支与 Git、Bazaar 和 Mercurial 之间进行双向操作。

第三方托管选项

如果开放源码或商业开发人员不希望或不需要管理自己的集中式 “集线器”,那么可以选用流行的托管站点托管自己的 Git、Bazaar 或 Mercurial 项目。对于 Mercurial,流行的免费和付费托管站点是 Bitbucket。对于 Git,可以使用 Github;对于 Bazaar,可以使用由 Canonical 发起的 Launchpad。

提示:“咖啡馆” Mercurial 工作流


图 1. 咖啡馆工作流
咖啡馆工作流

如果希望实现安全的特殊版本控制工作流,让两个开发人员可以在咖啡馆中通过无线网络一起工作,那么可以试试下面的方法。

第一个用户使用 Mercurial 创建一个存储库:

mkdir /tmp/myhgrepo
cd /tmp/myhgrepo
hg init


然后,通过 Web 作为只读共享共享它:

hg serve


第二个用户使用以下命令克隆这个存储库:

hg clone http://example.com:8000


注意:这是另一台机器的 IP 地址或本地主机名。在 OS X 上,可以通过对 your-machine-name.local 使用 Bonjour 获得这一信息。

第二个用户进行他需要的更改,然后作为只读的 HTTP 共享提供他的存储库:

http://example.com:8000


第一个用户对第二个用户的存储库拷贝执行 hg 拖操作:

hg clone http://example2.com:8000


每个开发人员都是安全的,因为他们只在需要更新自己的本地文件系统时才对对方的存储库进行拖操作。

结束语

本文讨论了分布式版本控制能够提供的价值,比较了三种主流工具 Git、Mercurial 和 Bazaar 之间的差异。如果您不太熟悉版本控制,那么应该继续学习版本控制、钩子和插件以及它们能够提供的功能。

如果您是老手,那么应该试试这些工具,寻找最适合自己的工具。请通过 参考资料 中的链接详细了解各种分布式版本控制系统以及别人的使用经验。

转载于:https://www.cnblogs.com/ryanlaw/archive/2011/10/11/2207967.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop源生实用工具之distcp

1 概览 DistCp(Distributed Copy)是用于大规模集群内部或者集群之间的高性能拷贝工具。 它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成。 它把文件和目录的列表作为map任务的输入,每个任务会完成源列表中…

如何使用spy ++ (How to use Spy ++)

一个网友在我的一篇随笔后问道,如何使用spy 查找要用到的窗体类名以及相关信息 现把相关作法整理如下 如果你装了vs.net,在vs.net的工具里面就可以看到spy 打开spy ,会以树状图显示当前系统所有的窗体信息,如下所示 然后找到…

[Java]关于throw,throws,try{}catch(){}

一、异常的产生1. 在java代码中,如果发生异常,JVM就会中断程序代码的运行,然后创建异常对象并抛出。例如:int a2, b0;int ia/b; //除数不能为0,发生异常System.out.println(i);程序会在执行第2行代码时中断&#xff0…

PL/SQL Developer 9 注册机

软件下载:下载 注册机下载:下载 说明:测试版本--9.0.1.1613(无需替换文件,输入注册信息即可) 附图: 转载于:https://www.cnblogs.com/zhanqi/archive/2011/10/12/2208750.html

程序图片运行效果存在偏差问题

2019独角兽企业重金招聘Python工程师标准>>> 当图片放到高分辨率的文件夹下,运行程序的手机却是低分辨率时就会出现该问题。解决办法很容易,就是把图片换个文件夹。比如图片放到drawable-xhdpi下,而模拟器是480*800,图…

如何将android例子程序添加到Eclipse进行调试运行

website:http://blog.csdn.net/whwzm88/article/details/6342583 1、打开Eclipse,选择File->new->Android Project,如附图所示窗口: 2、选择Create project from existing source单选框,然后点击->Browse..., 找到想要查看的android例子目录: 备注&…

计算几何——圆卡精度cf1059D

double 在1e17以后就不能顾及小数&#xff0c;所以用一下加精度的技巧 sqrt(r*r-d*d)sqrt(rd)*sqrt(r-d) 遇到误差在几位以内的注意要修改二分的精度&#xff0c;用最大的数据去乘以精度即可 #include<bits/stdc.h> using namespace std;const double esp 1e-7; const d…

坦克大战 Java版

由于博客开通不久&#xff0c;以前没有博客&#xff0c;顺便把以前做的项目也介绍下 希望大家支持&#xff0c;谢谢 坦克大战 IDE&#xff1a;MyEclipse 9.0 语言&#xff1a;Java SE 数据库&#xff1a;由于是单机版&#xff0c;不需要较高的安全性&#xff0c;且数据量较小&a…

c# 扩展方法奇思妙用高级篇五:ToString(string format) 扩展

在.Net中&#xff0c;System.Object.ToString()是用得最多的方法之一&#xff0c;ToString()方法在Object类中被定义为virtual&#xff0c;Object类给了它一个默认实现&#xff1a; 1 publicvirtualstringToString()2 {3 returnthis.GetType().ToString();4 }.Net中原生的class…

MFC中OnDraw与OnPaint的区别

OnPaint是WM_PAINT消息的消息处理函数&#xff0c;在OnPaint中调用OnDraw&#xff0c;一般来说&#xff0c;用户自己的绘图代码应放在OnDraw中。 OnPaint()是CWnd的类成员&#xff0c;负责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数&#xff0c;没有响应消息的功能.当视图变…

Windows Internet

网址:http://baike.baidu.com/view/560670.htm WinInet 求助编辑百科名片 WinInet&#xff08;“Windows Internet”&#xff09;API帮助程序员使用三个常见的Internet协议&#xff0c;这三个协议是用于World Wide Web万维网的超文本传输协议&#xff08;HTTP&#xff1a;Hyper…

PHP使用CURL抓取页面

cURL的基本原理 curl是利用URL语法在命令行方式下工作的开源文件传输工具&#xff0c;他能够从互联网上获得各种各样的网络资源。简单来说&#xff0c;curl就是抓取页面的升级版。 <?php//1.初始化&#xff0c;创建一个新cURL资源$ch curl_init(); //2.设置URL和相应的选…

Lync Server 2010迁移至Lync Server 2013故障排错 Part3 :内外网共享PPT提示证书问

最近在公司生产环境中部署Lync Server 2013并对公网发布后&#xff0c;发现公网未加域客户端在与内网用户共享PPT时&#xff0c;会报证书错误&#xff0c;如下图所示&#xff1a;但是内网是正确的&#xff0c;经过查询了一下Lync 客户端自身的日志信息后发现&#xff0c;公网客…

用WinInet开发Internet客户端应用指南

一&#xff1a;http://www.vckbase.com/document/viewdoc/?id545 二&#xff1a;http://www.vckbase.com/document/viewdoc/?id546 用WinInet开发Internet客户端应用指南&#xff08;一&#xff09; 编译/NorthTibet 一、概述一个Internet客户端程序的目的是通过Internet…

WebService的基本概念:java webservice,什么是webservice

WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求&#xff0c;轻量级的独立的通讯技术。 这种技术允许网络上的所有系统进行交互。随着技术的发展&#xff0c;一个Web服务可以包含额外的指定功能并且可以在多个B2B应用中协作通讯。 Web服务可以理解…

掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等)...

掌握常见的内部排序方法&#xff08;插入排序&#xff0c;冒泡排序&#xff0c;选择排序&#xff0c;快速排序&#xff0c;堆排序&#xff0c;希尔排序&#xff0c;归并排序&#xff0c;基数排序等&#xff09;。数组高级以及Arrays(掌握)排序方法空间复杂度时间复杂度稳定性插…

关于Android错误 View requires API level 14 (current...

2019独角兽企业重金招聘Python工程师标准>>> 问题描述&#xff1a;在界面配置文件main.xml中&#xff0c;可能用上某些控件&#xff08;例如GridLayout&#xff09;遇上下面所说的错误:View requires API level 14(current min is 8), 但将项目clear后&#xff0c;再…

socket-select函数

最近在用socket编程&#xff0c;用到select函数&#xff0c;于是上网查找资料&#xff0c;如下这篇是讲的比较详细易懂的&#xff1a;Select在Socket编程中还是比较重要的&#xff0c;可是对于初学Socket的人来说都不太爱用Select写程序&#xff0c;他们只是习惯写诸如 connect…

javascript 基础 转

最近面试过一些人, 发现即使经验丰富的开发人员, 对于一些基础的理论和细节也常常会模糊. 写本文是因为就我自己而言第一次学习下面的内容时发现自己确实有所收获和感悟. 其实我们容易忽视的javascript的细节还有更多, 本文仅是冰山一角. 希望大家都能通过本文有所斩获.一. Jav…

从表到里学习JVM实现

在社会化分工、软件行业细分专业化的趋势下&#xff0c;会真的参与到底层系统实现的人肯定是越来越少&#xff08;比例上说&#xff09;。真的会参与到JVM实现的人肯定是少数。但如果您对JVM是如何实现的有兴趣、充满好奇&#xff0c;却苦于没有足够系统的知识去深入&#xff0…