<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Behind the Code &#187; dvcs</title>
	<atom:link href="http://yinwm.com/tag/dvcs/feed/" rel="self" type="application/rss+xml" />
	<link>http://yinwm.com</link>
	<description>Just Do It</description>
	<lastBuildDate>Wed, 04 Jan 2012 03:54:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>我现在开始倾向于使用Hg了</title>
		<link>http://yinwm.com/2010/04/now-i-prfer-to-use-hg/</link>
		<comments>http://yinwm.com/2010/04/now-i-prfer-to-use-hg/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 15:19:05 +0000</pubDate>
		<dc:creator>yinwm</dc:creator>
				<category><![CDATA[技术快餐]]></category>
		<category><![CDATA[随想]]></category>
		<category><![CDATA[dvcs]]></category>

		<guid isPermaLink="false">http://yinwm.com/?p=194</guid>
		<description><![CDATA[用过一段时间的git，感觉非常之爽歪歪，但是也发现了一些问题，比如团队的成员并不是很容易的接受git，觉得麻烦。而且对于在含有*nix和windows上面同时开发的团队，经常要在不同的环境中处理回车换行的问题。这时候git不是不能解决，而是一遍一遍的给团队的成员灌输这些东西，成本是非常高的。 这两天抽空研究了一下Hg，发现国内外的“实用主义者”更倾向于使用这个。她和svn的一些使用习惯差不多，比如diff时候的版本号都是使用冒号(:)分割等等。这些小细节往往则是团队开发中选择一个工具的比较重要的因素。 我决定继续研究一段hg，然后考虑一下是否更加合适在团队中使用。]]></description>
			<content:encoded><![CDATA[<p>用过一段时间的<a href="http://git-scm.com/" target="_blank">git</a>，感觉非常之爽歪歪，但是也发现了一些问题，比如团队的成员并不是很容易的接受git，觉得麻烦。而且对于在含有*nix和windows上面同时开发的团队，经常要在不同的环境中处理回车换行的问题。这时候git不是不能解决，而是一遍一遍的给团队的成员灌输这些东西，成本是非常高的。</p>
<p>这两天抽空研究了一下<a href="http://hg-scm.org/" target="_blank">Hg</a>，发现国内外的“实用主义者”更倾向于使用这个。她和svn的一些使用习惯差不多，比如diff时候的版本号都是使用冒号(:)分割等等。这些小细节往往则是团队开发中选择一个工具的比较重要的因素。</p>
<p>我决定继续研究一段hg，然后考虑一下是否更加合适在团队中使用。</p>
]]></content:encoded>
			<wfw:commentRss>http://yinwm.com/2010/04/now-i-prfer-to-use-hg/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>bzr快速入门（3）&#8212;- 使用看门人，Gatekeeper</title>
		<link>http://yinwm.com/2008/09/bzr%e5%bf%ab%e9%80%9f%e5%85%a5%e9%97%a8%ef%bc%883%ef%bc%89-%e4%bd%bf%e7%94%a8%e7%9c%8b%e9%97%a8%e4%ba%ba%ef%bc%8cgatekeeper/</link>
		<comments>http://yinwm.com/2008/09/bzr%e5%bf%ab%e9%80%9f%e5%85%a5%e9%97%a8%ef%bc%883%ef%bc%89-%e4%bd%bf%e7%94%a8%e7%9c%8b%e9%97%a8%e4%ba%ba%ef%bc%8cgatekeeper/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 07:38:49 +0000</pubDate>
		<dc:creator>yinwm</dc:creator>
				<category><![CDATA[bzr]]></category>
		<category><![CDATA[dvcs]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[程序开发]]></category>

		<guid isPermaLink="false">http://yinwm.cn/wordpress/?p=55</guid>
		<description><![CDATA[有没有遇到过这样的时候，一个手欠，或者没注意，一个还没有完全写好的功能就放到主分支上了，而且还很幸运的打到release里面。好吧，你没那么幸运，但是几个经验不是很丰富的小弟把代码随便传上来，你总得看一下吧。 这个怎么搞呢？难道你跑去每个人的地方看看？看着他们跑测试用例？跟着他们做Code Review？一两个人还行，人多呢？要是人不在你身边呢？比如远程开发？如果组织结构更大一点呢？开发团队在开发，测试团队在测试，这样很可能一个没有经过充分测试、检查过的代码版本，就被测试团队抓走了，然后可能就是一堆的问题咯。其实有问题还好，要是有问题没检查出来，那就更麻烦了。 所以，利用bzr的这种天然的DVCS的优势，添加了一个叫做Gatekeeper，看门人的概念。这个概念说起来是很简单的，就是所有的代码，该提交提交，该搞啥搞啥，但是呢，不是提交到主开发分支哪里，而是提交到看门人负责的一个分支上，由他来进行统一的测试审查等等。等完事OK了，他（只有他）再提交到主分支上就好了。这样就保证了所有的问题，低质量的代码，都被看门人挡住了。 看门人可以是一个人，也可以是一个团队，只要能够保证产品的质量就可以了。 比如在服务器，代码都是放在/repo/main上面的，哪么现在根据main生成一个dev.main的分支，所有的人都是基于dev.main进行开发。而测试团队则选择main进行测试，这样开发和测试就已经分开了。然后看门人保证dev.main的质量，当质量达到一定的水平之后，并且代码稳定了，就可以把dev.main merge到main上面了。]]></description>
			<content:encoded><![CDATA[<p>有没有遇到过这样的时候，一个手欠，或者没注意，一个还没有完全写好的功能就放到主分支上了，而且还很幸运的打到release里面。好吧，你没那么幸运，但是几个经验不是很丰富的小弟把代码随便传上来，你总得看一下吧。 </p>
<p>这个怎么搞呢？难道你跑去每个人的地方看看？看着他们跑测试用例？跟着他们做Code Review？一两个人还行，人多呢？要是人不在你身边呢？比如远程开发？<br />如果组织结构更大一点呢？开发团队在开发，测试团队在测试，这样很可能一个没有经过充分测试、检查过的代码版本，就被测试团队抓走了，然后可能就是一堆的问题咯。其实有问题还好，要是有问题没检查出来，那就更麻烦了。</p>
<p>所以，利用bzr的这种天然的DVCS的优势，添加了一个叫做Gatekeeper，看门人的概念。这个概念说起来是很简单的，就是所有的代码，该提交提交，该搞啥搞啥，但是呢，不是提交到主开发分支哪里，而是提交到看门人负责的一个分支上，由他来进行统一的测试审查等等。等完事OK了，他（只有他）再提交到主分支上就好了。这样就保证了所有的问题，低质量的代码，都被看门人挡住了。</p>
<p>看门人可以是一个人，也可以是一个团队，只要能够保证产品的质量就可以了。</p>
<p>比如在服务器，代码都是放在<br />/repo/main<br />上面的，哪么现在根据main生成一个dev.main的分支，所有的人都是基于dev.main进行开发。<br />而测试团队则选择main进行测试，这样开发和测试就已经分开了。<br />然后看门人保证dev.main的质量，当质量达到一定的水平之后，并且代码稳定了，就可以把dev.main merge到main上面了。</p>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://yinwm.com/2008/09/bzr%e5%bf%ab%e9%80%9f%e5%85%a5%e9%97%a8%ef%bc%883%ef%bc%89-%e4%bd%bf%e7%94%a8%e7%9c%8b%e9%97%a8%e4%ba%ba%ef%bc%8cgatekeeper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>为什么使用DVCS</title>
		<link>http://yinwm.com/2008/02/%e4%b8%ba%e4%bb%80%e4%b9%88%e4%bd%bf%e7%94%a8dvcs/</link>
		<comments>http://yinwm.com/2008/02/%e4%b8%ba%e4%bb%80%e4%b9%88%e4%bd%bf%e7%94%a8dvcs/#comments</comments>
		<pubDate>Thu, 21 Feb 2008 23:25:30 +0000</pubDate>
		<dc:creator>yinwm</dc:creator>
				<category><![CDATA[bzr]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[dvcs]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://yinwm.cn/wordpress/?p=36</guid>
		<description><![CDATA[我们在开发过程中一般都使用VCS工具，最普遍的工具就是svn，但是在使用过程中还是会存在一些问题的。 假设一个场景一个项目要进行开发， A是底层核心功能开发人员，他要对底层进行开发，并且在第一时间所有的人都要获取他的代码 B是功能开发人员，进行一个feature1的开发 C，D是功能开发人员，进行另外一个feature2的开发 feature1和feature2要公用部分代码，比如同一个接口文件，并对他进行修改 假如我们用svn进行开发，这里面是有一个问题的，因为A的存在，feature1和feature2的开发并不能完全分开，而在开发阶段B，C，D三个人都不能随意的提交代码，否则feature1和feature2都会相互影响。如果他们真的都是分开的功能也没问题，但是因为C，D是一个feature的负责人，他们之间必须要进行代码交换，而因为svn是集中式开发，那么他们应该，必须，也只能通过svn进行代码交换。如果 C提交代码，要求D更新代码 A提交代码，要求所有人更新代码 D获取代码，A和C的，是正确的代码 B获取代码，死菜了，因为C的代码是他不需要的，会影响他的工作，甚至都无法编译通过 这个是一个很普遍的场景，尤其是对人数多一些的小组。那么我们应该如何避免这种情况的发生呢？答案是使用DVCS系统，也就是分布式代码管理系统，例如bzr，hg等。 DVCS的出现可以方便的解决这类问题。与svn等传统VCS系统不同，DVCS并不需要一个中心服务器，每个人的开发工作区都可以认为是中心服务器。DVCS的基础是分支，每需要一个开发工作区，都是基于已有的某个开发工作区创建一个分支，然后开发，然后进行分支的代码merge。因为这种特性，DVCS的分支操作代价非常小。当然对于管理，发布等等我们还是需要一个中心服务器的，那么我们只要一个放在中心服务器的分支就足够了，使用完全相同的技术和下面的各个开发工作区进行代码交换。从技术上，他们的地位是完全等同的。根据这些，我们再使用DVCS假设一下上述的开发场景 在中心服务器创建技术开发版本 A，B，C，D分别根据中心服务器创建自己的开发分支 A进行开发，每个阶段，B，C，D基于A提供的代码进行merge，比如A自己架设一个（临时的）ftp C进行开发，每一阶段，D基于C提供的代码进行merge，相对D的开发来说，情况一样。他们的开发完全不影响B的开发 最终都开发完成，一并merge回中心服务器 这就非常顺利的避免了上面遇到的问题。而且，DVCS因为是把自己的工作区认为是代码仓库（repository），所以可以随时的提交代码，随时记录自己的开发变更。而这个在svn当中有时就比较头疼，如果一个feature要开发时间比较长，那么中间的每一个小阶段的代码就很难记录了。 当然了，你可以说，我在svn当中采用给每个人开分支的方法解决这个问题。bingo，没错，但是，这已经就是DVCS的思想了，不是么？那么为什么不用一个现成的DVCS工具呢？]]></description>
			<content:encoded><![CDATA[<p>我们在开发过程中一般都使用VCS工具，最普遍的工具就是svn，但是在使用过程中还是会存在一些问题的。</p>
<p>假设一个场景<br />一个项目要进行开发，
<ul>
<li>A是底层核心功能开发人员，他要对底层进行开发，并且在第一时间所有的人都要获取他的代码</li>
<li>B是功能开发人员，进行一个feature1的开发</li>
<li>C，D是功能开发人员，进行另外一个feature2的开发</li>
<li>feature1和feature2要公用部分代码，比如同一个接口文件，并对他进行修改</li>
</ul>
<p>假如我们用svn进行开发，这里面是有一个问题的，因为A的存在，feature1和feature2的开发并不能完全分开，而在开发阶段B，C，D三个人都不能随意的提交代码，否则feature1和feature2都会相互影响。如果他们真的都是分开的功能也没问题，但是因为C，D是一个feature的负责人，他们之间必须要进行代码交换，而因为svn是集中式开发，那么他们应该，必须，也只能通过svn进行代码交换。<br />如果
<ol>
<li>C提交代码，要求D更新代码</li>
<li>A提交代码，要求所有人更新代码</li>
<li>D获取代码，A和C的，是正确的代码</li>
<li>B获取代码，死菜了，因为C的代码是他不需要的，会影响他的工作，甚至都无法编译通过</li>
</ol>
<p>这个是一个很普遍的场景，尤其是对人数多一些的小组。那么我们应该如何避免这种情况的发生呢？答案是使用DVCS系统，也就是分布式代码管理系统，例如bzr，hg等。</p>
<p>DVCS的出现可以方便的解决这类问题。与svn等传统VCS系统不同，DVCS并不需要一个中心服务器，每个人的开发工作区都可以认为是中心服务器。DVCS的基础是分支，每需要一个开发工作区，都是基于已有的某个开发工作区创建一个分支，然后开发，然后进行分支的代码merge。因为这种特性，DVCS的分支操作代价非常小。当然对于管理，发布等等我们还是需要一个中心服务器的，那么我们只要一个放在中心服务器的分支就足够了，使用完全相同的技术和下面的各个开发工作区进行代码交换。从技术上，他们的地位是完全等同的。<br />根据这些，我们再使用DVCS假设一下上述的开发场景
<ol>
<li>在中心服务器创建技术开发版本</li>
<li>A，B，C，D分别根据中心服务器创建自己的开发分支</li>
<li>A进行开发，每个阶段，B，C，D基于A提供的代码进行merge，比如A自己架设一个（临时的）ftp</li>
<li>C进行开发，每一阶段，D基于C提供的代码进行merge，相对D的开发来说，情况一样。他们的开发完全不影响B的开发</li>
<li>最终都开发完成，一并merge回中心服务器</li>
</ol>
<p>这就非常顺利的避免了上面遇到的问题。而且，DVCS因为是把自己的工作区认为是代码仓库（repository），所以可以随时的提交代码，随时记录自己的开发变更。而这个在svn当中有时就比较头疼，如果一个feature要开发时间比较长，那么中间的每一个小阶段的代码就很难记录了。</p>
<p>当然了，你可以说，我在svn当中采用给每个人开分支的方法解决这个问题。bingo，没错，但是，这已经就是DVCS的思想了，不是么？那么为什么不用一个现成的DVCS工具呢？</p>
]]></content:encoded>
			<wfw:commentRss>http://yinwm.com/2008/02/%e4%b8%ba%e4%bb%80%e4%b9%88%e4%bd%bf%e7%94%a8dvcs/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

