﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>PHP博客-为了忘却的纪念   $bestmost-&gt;save("多多益善")-随笔分类-svn</title><link>http://www.phpweblog.net/fuyongjie/category/615.html</link><description>言己及众</description><language>zh-cn</language><lastBuildDate>Thu, 19 Feb 2009 08:21:27 GMT</lastBuildDate><pubDate>Thu, 19 Feb 2009 08:21:27 GMT</pubDate><ttl>60</ttl><item><title>利用subversion进行分支合并（转载）</title><link>http://www.phpweblog.net/fuyongjie/archive/2009/02/19/6339.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Thu, 19 Feb 2009 01:08:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2009/02/19/6339.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/6339.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2009/02/19/6339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/6339.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/6339.html</trackback:ping><description><![CDATA[<strong>利用subversion进行分支合并</strong><br><br>一、我的合并需求<br>
&nbsp; &nbsp; 在主线的第54个版本上作了分支，在接下来的日子里，主线和分支同时都有修改，此时需要将分支上的改动合并到主线上，合并前主线和分支都已经提交，截至到合并前，主线的修改达到了版本号66，而分支的修改达到了68。主线和分支修改的文件不同。<br>
二、我最初的错误操作<br>
&nbsp; &nbsp; 我当时的想法是合并，就是简单的把主线的最新版本和分支的最新版本合在一起就成了，而且这也是符合我们的手工习惯。于是我就作出了一个错误的操作：<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;1、在分支的工作副本上单击右键，选择合并，出现合并对话框，在起始路径和版本号中选择主线的最新版本，在结束路径中选择分支的最新版本，然后单击合并，合并后，提示框内没有任何合并的内容。<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;2、上个操作不成功，于是胡乱进行这个操作，在主线的工作副本上单击右键，选择合并，出现合并对话框，在起始路径和版本号中选择分支的最新版本，在结束路径中选择主线的最新版本，然后单击合并，合并后，提示框内没有任何合并的内容。<br>
&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;3、发现第2个操作仍没有结果，更晕，于是进行下面的操作，在主线的工作副本上单击右键，选择合并，出现合并对话框，在起始路径和版本号中选择主线
的最新版本，在结束路径中选择分支的最新版本，然后单击合并，合并后，提示框内提示有文件更新，打开更新的文件一看，原来是分支上的内容把主线上的工作副
本覆盖了。于是进行下一个实验。<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;4、在分支的工作副本上单击右键，选择合并，出现合并对话框，在起始路径和版本号中选择分支的最新版本，在结束路径中选择主线的最新版本，然后单击合并，合并后，提示框内提示有文件更新，打开更新的文件一看，原来是主线上的内容把分支上的覆盖了。<br>
三、我把这个问题发到论坛，pcplayer指出了我的错误，即&#8220;起始选择主线的最新版本，结束使用分支的最新版本&#8221;，并指明&#8220;应该选择一条线上的两个版
本，这两个版本间的改动会以打补丁的形式合并到另外一条线上&#8221;，于是看了一遍subversion中文手册svnbook1.2版中第4章分支与合并，终
于理解了合并的使用：<br>
&nbsp;&nbsp;1、如果是需要将主线的改动合并到分支上，需要在分支的工作副本下进行合并，合并的范围是需要从主线上上次合并的版本到当前主线上最新的版本，如果主
线和分支都修改了相同的文件，合并后会出现冲突，然后解决冲突，如果主线修改但是分支没有修改，则主线上合并的变更内容会增加到当前副本中，提交，如果是
第一次合并，则起始版本号是上次建立分支的版本号<br>
&nbsp; &nbsp;&nbsp;
&nbsp;2、相反，如果是需要将分支的改动合并到主线上，需要在主线的工作副本下进行合并，合并的范围是需要从分支上上次合并的版本到当前分支上最新的版本，合
并后会出现冲突（冲突的前提如上种情况），然后解决冲突，提交，如果是第一次合并，则起始版本号是上次建立分支的版本号<br>
&nbsp; &nbsp;&nbsp;
&nbsp;3、正确的操作（对应我的需求，将分支上的改动合并到主线上）：在主线的工作副本下单击右键，合并，在起始范围中选择分支的54版本，结束范围中选择分
支的最新版本（当然也可以修改到中间的其他版本，例如65等），然后单击合并即可。由于我的需求中主线和分支修改的是不同的文件，所以不会存在冲突，合并
完后直接提交即可。<br>
&nbsp; &nbsp;&nbsp; &nbsp;<br>
四、合并的工作是把主线或者分支上合并范围内的所有改动列出，并对比当前副本的内容，由合并者手工修改冲突。如果当前工作副本是主线的，则合并的范围是分支上的改动，如果工作副本是分支的，则合并范围是主线上的改动<br>
<br>
啰里啰唆的写了一堆，不知道大家能否看明白？呵呵
<br><img src ="http://www.phpweblog.net/fuyongjie/aggbug/6339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2009-02-19 09:08 <a href="http://www.phpweblog.net/fuyongjie/archive/2009/02/19/6339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>svn trunk branch tag</title><link>http://www.phpweblog.net/fuyongjie/archive/2009/01/19/6289.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Sun, 18 Jan 2009 16:06:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2009/01/19/6289.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/6289.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2009/01/19/6289.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/6289.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/6289.html</trackback:ping><description><![CDATA[<p>trunk：表示开发时版本存放的目录，即在开发阶段的代码都提交到该目录上。</p>
<p>branches：表示发布的版本存放的目录，即项目上线时发布的稳定版本存放在该目录中。</p>
<p>tags：表示标签存放的目录。</p>
<p>在这需要说明下分三个目录的原因，如果项目分为一期、二期、三期等，那么一期上线时的稳定版本就应该在一期完成时将代码copy到branches上，这样二期开发的代码就对一期的代码没有影响，如新增的模块就不会部署到生产环境上。而branches上的稳定的版本就是发布到生产环境上的代码，如果用户使用的过程中发现有bug，则只要在branches上修改该bug，修改完bug后再编译branches上最新的代码发布到生产环境即可。tags的作用是将在branches上修改的bug的代码合并到trank上时创建个版本标识，以后branches上修改的bug代码再合并到trunk上时就从tags的version到branches最新的version合并到trunk，以保证前期修改的bug代码不会在合并。</p>
<br><img src ="http://www.phpweblog.net/fuyongjie/aggbug/6289.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2009-01-19 00:06 <a href="http://www.phpweblog.net/fuyongjie/archive/2009/01/19/6289.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)svn之trunk、branches、tags </title><link>http://www.phpweblog.net/fuyongjie/archive/2009/01/19/6288.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Sun, 18 Jan 2009 16:06:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2009/01/19/6288.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/6288.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2009/01/19/6288.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/6288.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/6288.html</trackback:ping><description><![CDATA[<div class="blog_title">
<h3 class="" title=""><a href="http://www.phpweblog.net/blog/121765"><br></a></h3>
</div>
<div class="blog_content">
<p>一直以来用svn只是当作cvs，也从来没有仔细看过文档，直到今天用到，才去翻看svn book文档，惭愧<img alt="" src="http://www.javaeye.com/images/forum/smiles/icon_sad.gif" _counted="undefined"> </p>
<p>需求一： <br>有一个客户想对产品做定制，但是我们并不想修改原有的svn中trunk的代码。</p>
<p>方法： <br>用svn建立一个新的branches，从这个branche做为一个新的起点来开发 <br></p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar">
<ol class="dp-j">
    <li class="alt">svn&nbsp;copy&nbsp;svn://server/trunk&nbsp;svn://server/branches/ep&nbsp;-m&nbsp;"init&nbsp;ep"&nbsp;&nbsp;
    </li>
</ol>
</div>
</div>
&lt;script&gt;render_code();&lt;/script&gt;
<p>&nbsp;</p>
<p>Tip: <br>如果你的svn中以前没有branches这个的目录，只有trunk这个，你可以用 <br></p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<ol class="dp-j">
    <li class="alt">svn&nbsp;mkdir&nbsp;branches</li>
</ol>
</div>
</div>
新建个目录
<p>&nbsp;</p>
<p>需求二： <br>产品开发已经基本完成，并且通过很严格的测试，这时候我们就想发布给客户使用，发布我们的1.0版本 <br></p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar">
<ol class="dp-j">
    <li class="alt">svn&nbsp;copy&nbsp;svn://server/trunk&nbsp;svn://server/tags/release-1.0&nbsp;-m&nbsp;"1.0&nbsp;released"&nbsp;&nbsp;
    </li>
</ol>
</div>
</div>
<br>
<p>&nbsp;</p>
<p>咦，这个和branches有什么区别，好像啥区别也没有？
<br>是的，branches和tags是一样的，都是目录，只是我们不会对这个release-1.0的tag做修改了，不再提交了，如果提交那么就是branches</p>
<p>需求三： <br>有一天，突然在trunk下的core中发现一个致命的bug,那么所有的branches一定也一样了，该怎么办？ <br></p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar">
<ol class="dp-j">
    <li class="alt">svn&nbsp;-r&nbsp;148:149&nbsp;merge&nbsp;svn://server/trunk&nbsp;branches/ep&nbsp;&nbsp;
    </li>
</ol>
</div>
</div>
<br>其中148和149是两次修改的版本号。
</div>
</div>
</div>
</div>
<br><img src ="http://www.phpweblog.net/fuyongjie/aggbug/6288.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2009-01-19 00:06 <a href="http://www.phpweblog.net/fuyongjie/archive/2009/01/19/6288.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SVN中的分支（转载）</title><link>http://www.phpweblog.net/fuyongjie/archive/2009/01/18/6287.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Sun, 18 Jan 2009 15:56:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2009/01/18/6287.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/6287.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2009/01/18/6287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/6287.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/6287.html</trackback:ping><description><![CDATA[<h3 class=type_original title=原创>&nbsp;</h3>
<div class=blog_content>
<p style="FONT-SIZE: 10pt; MARGIN: 0in"><span style="FONT-FAMILY: SimSun">近日发现原来对</span> <span style="FONT-FAMILY: Calibri">SVN</span> <span style="FONT-FAMILY: SimSun">中分支的理解过于肤浅，所以特意花功夫深入了解一下。</span> </p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: SimSun">&nbsp;</p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: SimSun"><strong>分支用于解决什么样的问题？</strong> </p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in"><span style="FONT-FAMILY: SimSun">在手机游戏开发过程中，经常会遇到多种机型移植的问题。通常开发人员都说以一种机型作为</span> <span style="FONT-FAMILY: Calibri">release</span> <span style="FONT-FAMILY: SimSun">基础版本的目标，然后再此基础上进行相关的适配工作，如，键值修改，屏幕大小的修改单等。</span> </p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in"><span style="FONT-FAMILY: SimSun">然而同时维护多个版本是异常头疼的事情，因为很少有人能保证在移植之前，基础版本是没有</span> <span style="FONT-FAMILY: Calibri">bug</span> <span style="FONT-FAMILY: SimSun">的，特别是在工期很紧的情况下。这样一来，基础版本中出现了</span> <span style="FONT-FAMILY: Calibri">bug</span> <span style="FONT-FAMILY: SimSun">，就需要手动的&#8220;</span> <span style="FONT-FAMILY: Calibri">Ctrl+C/Ctrl+V</span> <span style="FONT-FAMILY: SimSun">&#8221;到其他的所有版本，各种版本的管理非常混乱，经常一不小心就会出现这样那样的问题。</span> </p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: SimSun">&nbsp;</p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in">而 SVN 的分支 (branch) 虽然不能做到自动将基础版本中的修改复制到其他版本中，却可以对各种版本的管理提供更有效和更规范的支持，避免了很多人为造成的问题。使用 SVN 来管理，可以将基础版本作为主干 (trunk) ，并从项目启动到 alpha 版本的推出，都可以在主干上进行开发。<span style="COLOR: red"> alpha 版本发布以后，对于其他版本可以分别建立分支</span>，如： branch_moto ， branch_s603 等 </p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: SimSun">&nbsp;</p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: SimSun"><strong>如何创建分支？</strong> </p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in"><span style="FONT-FAMILY: SimSun">创建分支非常简单，只需在需要创建分支的工作目录上，使用TortoiseSVN &#8594; Branch/Tag命令，在</span> <span style="FONT-FAMILY: Calibri">"To URL"</span> <span style="FONT-FAMILY: SimSun">项指定待创建的分支</span> <span style="FONT-FAMILY: Calibri">url</span> <span style="FONT-FAMILY: SimSun">即可。具体</span> <span style="FONT-FAMILY: SimSun">可查看TortoiseSVN的帮助文档中的&#8220;</span> <span style="FONT-FAMILY: Calibri">Braching/Taging</span> <span style="FONT-FAMILY: SimSun">&#8221;一节</span> </p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in">&nbsp;</p>
<p>&nbsp;</p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: SimSun"><strong>如何在分支下工作？</strong> </p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in"><span style="FONT-FAMILY: SimSun">假设我们的主干名为</span> <span style="FONT-FAMILY: Calibri">trunk</span> <span style="FONT-FAMILY: SimSun">，分支目录名为</span> <span style="FONT-FAMILY: Calibri">branch</span> <span style="FONT-FAMILY: SimSun">。</span> <span style="FONT-FAMILY: Calibri">branch</span> <span style="FONT-FAMILY: SimSun">实际上是</span> <span style="FONT-FAMILY: Calibri">trunk</span> <span style="FONT-FAMILY: SimSun">目录在</span> <span style="FONT-FAMILY: Calibri">branch</span> <span style="FONT-FAMILY: SimSun">创建时的</span> <span style="FONT-FAMILY: Calibri">copy</span> <span style="FONT-FAMILY: SimSun">，而创建以后，</span> <span style="FONT-FAMILY: Calibri">branch</span> <span style="FONT-FAMILY: SimSun">与</span> <span style="FONT-FAMILY: Calibri">trunk</span> <span style="FONT-FAMILY: SimSun">实际就是互不干扰的工作了，</span> <span style="FONT-FAMILY: Calibri">branch</span> <span style="FONT-FAMILY: SimSun">上的修改不会影响到</span> <span style="FONT-FAMILY: Calibri">trunk</span> <span style="FONT-FAMILY: SimSun">，反之亦然。</span> </p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: SimSun">&nbsp;</p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: SimSun"><strong>如何合并分支？</strong> </p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in"><span style="FONT-FAMILY: SimSun">事实上，我们并没有解决本文开头所提出的问题，即，</span> <span style="FONT-FAMILY: Calibri">trunk</span> <span style="FONT-FAMILY: SimSun">有了修改之后，并不会自动提交到</span> <span style="FONT-FAMILY: Calibri">branch</span> <span style="FONT-FAMILY: SimSun">中（不知道有没有其他的版本管理工具可以做到），这一切都需要手动来实现，而这个过程在</span> <span style="FONT-FAMILY: Calibri">SVN</span> <span style="FONT-FAMILY: SimSun">中称为&#8220;合并</span> <span style="FONT-FAMILY: Calibri">(merge)</span> <span style="FONT-FAMILY: SimSun">&#8221;。</span> </p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in"><span style="FONT-FAMILY: Calibri">SVN</span> <span style="FONT-FAMILY: SimSun">合并与原始的&#8220;</span> <span style="FONT-FAMILY: Calibri">Ctrl+C/Ctrl+V</span> <span style="FONT-FAMILY: SimSun">&#8221;相比，有以下几点好处（假设是将</span> <span style="FONT-FAMILY: Calibri">trunk</span> <span style="FONT-FAMILY: SimSun">合并到</span> <span style="FONT-FAMILY: Calibri">branch</span> <span style="FONT-FAMILY: SimSun">中）：</span> </p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in"><span style="FONT-FAMILY: Calibri">1</span> <span style="FONT-FAMILY: SimSun">、</span> <span style="FONT-FAMILY: Calibri">trunk</span> <span style="FONT-FAMILY: SimSun">中新增的文件可以自动合并到</span> <span style="FONT-FAMILY: Calibri">branch</span> <span style="FONT-FAMILY: SimSun">中</span> </p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in"><span style="FONT-FAMILY: Calibri">2</span> <span style="FONT-FAMILY: SimSun">、提示</span> <span style="FONT-FAMILY: Calibri">trunk</span> <span style="FONT-FAMILY: SimSun">与</span> <span style="FONT-FAMILY: Calibri">branch</span> <span style="FONT-FAMILY: SimSun">中的同名文件的冲突内容，便于用于编辑冲突</span> </p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: SimSun">&nbsp;</p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: SimSun"><strong>合并操作步骤</strong> </p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in"><span style="FONT-FAMILY: SimSun">在</span> <span style="FONT-FAMILY: Calibri">TortoiseSVN</span> <span style="FONT-FAMILY: SimSun">中提供便捷的合并功能。在待合并的工作目录上（如：</span> <span style="FONT-FAMILY: Calibri">branch</span> <span style="FONT-FAMILY: SimSun">），使用TortoiseSVN &#8594; Merge命令，在&#8220;</span> <span style="FONT-FAMILY: Calibri">From:(start URL and revision of the range to merge)</span> <span style="FONT-FAMILY: SimSun">&#8221;中选择希望合并的目录</span> <span style="FONT-FAMILY: Calibri">(</span> <span style="FONT-FAMILY: SimSun">如：</span> <span style="FONT-FAMILY: Calibri">trunk)</span> <span style="FONT-FAMILY: SimSun">，并指定希望合并的开始</span> <span style="FONT-FAMILY: Calibri">revision</span> <span style="FONT-FAMILY: SimSun">编号，在&#8220;</span> <span style="FONT-FAMILY: Calibri">To:(end URL and revision of the range to merge)</span> <span style="FONT-FAMILY: SimSun">&#8221;中选择结束</span> <span style="FONT-FAMILY: Calibri">revision</span> <span style="FONT-FAMILY: SimSun">编号。然后点击&#8220;</span> <span style="FONT-FAMILY: Calibri">merge</span> <span style="FONT-FAMILY: SimSun">&#8221;完成合并操作，剩下的工作就是编辑冲突了，当然运气好的话是不需要这个过程滴。</span> </p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in"><span style="FONT-FAMILY: SimSun">值得注意的是，&#8220;</span> <span style="FONT-FAMILY: Calibri">From:</span> <span style="FONT-FAMILY: SimSun">&#8221;和&#8220;</span> <span style="FONT-FAMILY: Calibri">To:</span> <span style="FONT-FAMILY: SimSun">&#8221;中的</span> <span style="FONT-FAMILY: Calibri">URL</span> <span style="FONT-FAMILY: SimSun">通常是相同的，切记不要与创建分支时的含义混淆。</span> </p>
<p style="FONT-SIZE: 10pt; MARGIN: 0in"><span style="FONT-FAMILY: SimSun">与合并相关的操作可查看TortoiseSVN的帮助文档中的&#8220;</span> <span style="FONT-FAMILY: Calibri">Merging</span> <span style="FONT-FAMILY: SimSun">&#8221;一节</span> </p>
</div><img src ="http://www.phpweblog.net/fuyongjie/aggbug/6287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2009-01-18 23:56 <a href="http://www.phpweblog.net/fuyongjie/archive/2009/01/18/6287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SVN分支与合并</title><link>http://www.phpweblog.net/fuyongjie/archive/2009/01/18/6286.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Sun, 18 Jan 2009 15:51:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2009/01/18/6286.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/6286.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2009/01/18/6286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/6286.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/6286.html</trackback:ping><description><![CDATA[<h3 class="type_translate" title="翻译"><a href="http://liuqiang.javaeye.com/blog/235466"><font color="#108ac6">SVN分支与合并</font></a></h3>
<div class="blog_content">
<p>分支的基本概念就正如它的名字,开发的一条线独立于另一条线,如果回顾历史,可以发现两条线分享共同的历史,一个分支总是从一个备份开始的,从那里开始,发展自己独有的历史(如下图所示) <br><br><img alt="" src="http://chaxinyi.javaeye.com/upload/picture/pic/10345/a5f7da85-6e2c-3c41-b9e1-57c1e4874747.jpg" _counted="undefined"> <br><br>⑴创建分支 <br>假设目前我们版本库中的项目的布局如下图： <br><br><img alt="" src="http://chaxinyi.javaeye.com/upload/picture/pic/10347/3e3b403f-7684-3eca-b47e-efc191928a90.jpg" _counted="undefined"> <br><br>如图所示，我们的项目放在了trunk（主线）目录，另外还有branch(分支)和tags(标签)目录，这样的布局是为了更清晰的区别主线、分支和标签三者的位置。 <br>subversion对分支和标签是通过复制一份最新的版本库的快照来实现的。 <br><br>开始创建分支： <br>在我们CheckOut的主线目录(trunk)上，右键点击然后选择&#8220;Branch/tag&#8230;&#8221; <br><br><img alt="" src="http://chaxinyi.javaeye.com/upload/picture/pic/10349/0e66b0bf-118b-3b96-a5c9-0f16df426773.jpg" _counted="undefined"> <br><br>在弹出的窗口中，将To Url 指向branch目录并输入分支的具体目录名，这里是mybranch1.0，我们即将创建的分支便存放于此处，点击OK。 <br><br><img alt="" src="http://chaxinyi.javaeye.com/upload/picture/pic/10351/d40acf2e-1133-3380-b183-fcc8aedc14cd.jpg" _counted="undefined"> <br><br>Update一下本地的branch目录，你就可以看到你刚刚创建的分支&#8220;mybranch1.0&#8221;，这样一来我们的分支就创建完成了。 <br><br><img alt="" src="http://chaxinyi.javaeye.com/upload/picture/pic/10353/d8552794-297c-39c2-ae11-fe62ae22a9f3.jpg" _counted="undefined"> <br><br><br>创建分支的最大的目的就是跟主线进行并行开发的时候不影响主线的开发。 <br>因为你在分支上所做的提交都只存于分支上，主线上的Update是看不到分支的修改的。如下图所示，trunk只能看到r344的版本，并看不到r343的版本。 <br><br><img alt="" src="http://chaxinyi.javaeye.com/upload/picture/pic/10355/3888d86d-c616-38d0-9306-6adb75b52a76.jpg" _counted="undefined"> <br><br>（什么时候应该使用分支呢？例如你接到了一个任务，完成这个任务需要三四个人的合作，你们之间需要共享资源，那们就可以创建一个专为这次任务的分支，参与此次任务的人员则在分支上做开发，等完成之后再合并到主线上，才不会出现将实现了一半的不完成功能也提交到主线上，影响主线的正常工作。又或者自己需要一个较长的开发周期来完成任务，这么长的时间内如果一直没有将资源进行提交，万一丢失了就前功尽弃了。当然分支不是只用于此类情况，还有其它很多种情况也能使用分支来达到目的。） <br>使用分支需要注意,由于长期的独立开发，可能会在合并回主线时出现较多的冲突。所以在支线上开发间期如果发现主干有更新，而且这个更新有可能将来跟你产生冲突，那你可以先将主线的内容合并到分支上。已免等到做了大量修改再来更新。(其实此过程跟分支合并到主线上是一样的操作，只是目的地不同。) <br><br>例如我们在主线上的版本为3，我们如何将此版本的信息合并到分支上呢？ <br><img alt="" src="http://chaxinyi.javaeye.com/upload/picture/pic/10357/bf1c755b-689b-3989-9a30-087905177164.jpg" _counted="undefined"> <br><br>在分支的根目录上右键点击，选择&#8220;TortoiseSVNMerge&#8230;&#8221;。 <br><br><img alt="" src="http://chaxinyi.javaeye.com/upload/picture/pic/10359/c5181bd0-cba5-3cfd-8b3c-b87f7b67bc41.jpg" _counted="undefined"> <br><br><br>在这里我们必需先弄明白一个合并背后的关健概念 <br>合并的过程中发生的所有事:首先两个版本库树的比较，然后将区别应用到本地拷贝. <br>这个命令是包括三个参数的: <br>1. 初始的版本树 2.最终的版本树 3一个接收区别的工作拷贝。 <br>弄明白这些概念之后我们继续往下操作。 <br>在弹出的窗口中，选择主线目录和其版本号(初始的版本树)，再选择主线目录和最新的版本号（最终的版本树），这里也可以是某一个版本号但应该比初始的版本树的版本号要高，接收区默认为你右键所指的目录，这里是mybranch1.0。 <br><br>在合并之前我们可以通过点击&#8220;Unified diff&#8221;，查看两版本树之间所有文件的内容的变化，&#8220;diff&#8221;显示出有发生变化的文件列表，&#8220;dry run&#8221;能显示真正合并时的状态信息，但并没有做任何的合并操作。 <br>我们点击&#8220;Merge&#8221;。 <br><br><img alt="" src="http://chaxinyi.javaeye.com/upload/picture/pic/10361/79cca1ca-b738-30c4-8ec6-0c5ba2bbe842.jpg" _counted="undefined"> <br><br>在点击&#8220;Merge&#8221;，合并后的文件（即对分支上的文件补上了主线上修改的内容），如无冲突则可以在分支上像其它文件一样使用了，如果合并后的内容不满意，可以通过撤销来取消这次的合并操作，前提是未对合并后的文件做提交操作。 <br><br>分支合并到主线跟从主线上合并内容到分支上类似 <br>不同的是 <br>1、开始的版本库是分支创建的版本 <br>2、结束的版本库是完成所以开发工作之后的版本 <br>3、应用的目的是主线目录 <br><br>关于转换工作拷贝、标签（标签在Subversion中跟分支是相同原理的，一个不去做任何的修改的分支就是版本库某一时刻的一个快照，相当于为某一个版本做了一个标签） </p>
</div><img src ="http://www.phpweblog.net/fuyongjie/aggbug/6286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2009-01-18 23:51 <a href="http://www.phpweblog.net/fuyongjie/archive/2009/01/18/6286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于代码库结构解析（SVN）</title><link>http://www.phpweblog.net/fuyongjie/archive/2009/01/18/6285.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Sun, 18 Jan 2009 15:44:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2009/01/18/6285.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/6285.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2009/01/18/6285.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/6285.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/6285.html</trackback:ping><description><![CDATA[<div>
<p><span><span>一般而言，代码库的目录结构如下：</span></p>
<p align=center><span><span></p>
<p><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>有的时候，也会把<span>release</span>目录命名为<span>tag</span>，之所以按照这样的目录结构来命名是有缘由的，下面是我个人的一些理解，供参考。</span></p>
<p><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>任何一个项目<span>/</span>产品都会经历一个从无到有的过程，在这个过程中，我们会使用<span>Trunk</span>这个目录，当产品达到发版要求时，我们会将发版那一个点的代码做一个<span>Tag</span><span>,</span>放到<span>release/tag</span>目录（由于项目不同，其目录结构也会有所差异），这是一个静态的点。比如，当<span>GCL2008</span>发版时，我们会做一个<span>Tag,</span>以捕捉<span>625</span>的环境一部分（这里只包括源码，最好打版本的脚本也能够在这里），并没有开发环境（比如<span>Dephi</span>）。</span></p>
<p><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>当同时需要开发两个版本或对源码的改写不是那么确定时，我们就需要做一个<span>Tag</span>到<span>Branch</span>，其实这个<span>Branch</span>的作用与<span>Trunk</span>类似，也是一个动态，代码会在这里不断演进。比如<span>GSP</span>的升级，因为有很多不确定因素，所以我们需要做一个<span>Branch,</span>以防止不确定性问题的发生对项目造成的影响，如果没有发生问题，我们还可以将其合并到主干（<span>Trunk</span>）版本上。</span></p>
<p><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>大家可能认为<span>Branch</span>、<span>Tag</span>是一样的，最容易理解就是<span>Tag</span>是一个静态的过程，而<span>Branch</span>是一个动态的过程，代码是一个不断演进的过程。</span></p>
<p><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>对于配置管理员而言可以解决一下几个问题：</span></p>
<p><span><span><span>1、</span><span> </span></span></span><span><span>版本发布环境一部分的备份（这里只针对源代码和<span>Build</span>脚本）；</span></p>
<p><span><span><span>2、</span><span> </span></span></span><span><span>对于后期的用户反馈以及补丁制作提供了有力支持（<span>Branch</span>）；</span></p>
<p><span><span>以上我对配置库目录结构进行了解析（在这里并没有包含版本管理的思想），下面我就对<span>SVN</span>的版本管理做一个简单的介绍，利用<span>Log</span>日志，我们可以轻松的记录下什么时间发布了什么样的版本，这个信息对于补丁的管理是十分有好处的。</span></p>
</div>
</span></span></span></span></span></span></span></span></span></span></span><img src ="http://www.phpweblog.net/fuyongjie/aggbug/6285.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2009-01-18 23:44 <a href="http://www.phpweblog.net/fuyongjie/archive/2009/01/18/6285.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Subversion安装手记</title><link>http://www.phpweblog.net/fuyongjie/archive/2008/10/11/5875.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Sat, 11 Oct 2008 04:28:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2008/10/11/5875.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/5875.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2008/10/11/5875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/5875.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/5875.html</trackback:ping><description><![CDATA[<h2 class=post-title><br></h2>
<div class=post-body>
<h2>STEP 1:下载和安装 </h2>
<p>首先在<a title=Subversion href="http://subversion.tigris.org/">Subversion的官方网站</a>去下载windows安装包，最新版是1.3.1，可惜在项目树上只更新到了<a title=1.3.0的二进制包 href="http://subversion.tigris.org/files/documents/15/29065/svn-1.3.0-setup.exe">1.3.0的二进制包</a>。<br>下载后安装在本地机器上，这里注意的是最好将安装目录指定为纯英文名目录，安装在中文目录下天知道哪天会冒出一个让你想破头也想不出的错误来。<br>下载<a title=TortoiseSVN href="http://tortoisesvn.tigris.org/">TortoiseSVN</a>进行本地安装，我安装的是最新的<a title="1.3.2 for svn 1.3.0" href="http://nchc.dl.sourceforge.net/sourceforge/tortoisesvn/TortoiseSVN-1.3.2.5840-svn-1.3.0.msi">1.3.2 for svn 1.3.0</a>，这是一个将SVN集成到windows shell中的GUI管理工具，推荐使用。<br></p>
<h2>STEP 2:创建储存库 </h2>
<p>安装完TortoiseSVN后提示要重启机器，其实启不启都可以正常使用了，首先创建SVN储存库(repository)，可以选择命令行方式或者通过TortoiseSVN插件进行GUI操作，命令行运行如下：<br></p>
<div class=code>svnadmin create E:\svn\repository</div>
<br>e:\svn\repository就是我指定的储存库目录，如果用GUI方式，可以在这个目录下点击右键选择[TotoiseSVN]-&gt;[Create Repository href...]进行创建，版本库模式指定为默认的即可。<br>repository创建完毕后会在目录下生成若干个文件和文件夹，dav目录是提供给Apache与mod_dav_svn使用的目录，让它们存储内部数据；db目录就是所有版本控制的数据文件；hooks目录放置hook脚本文件的目录；locks用来放置Subversion文件库锁定数据的目录，用来追踪存取文件库的客户端；format文件是一个文本文件，里面只放了一个整数，表示当前文件库配置的版本号；<br>
<h2>STEP 3:配置 </h2>
<p>打开/conf/目录，打开svnserve.conf找到一下两句：<br></p>
<div class=code># [general]<br># password-db = passwd<br></div>
去之每行开头的#，其中第二行是指定身份验证的文件名，即passwd文件<br>同样打开passwd文件，将<br>
<div class=code># [users]<br># harry = harryssecret<br># sally = sallyssecret<br></div>
这几行的开头#字符去掉，这是设置用户，一行一个，存储格式为&#8220;用户名 = 密码&#8221;，如可插入一行：admin = admin888，即为系统添加一个用户名为admin，密码为admin888的用户<br>
<h2>STEP 4:运行SVN服务 </h2>
<p>在命令行执行<br></p>
<div class=code>svnserve --daemon --root E:\svn\repository</div>
服务启动，--daemon可简写为-d，--root可简写为-r，可以建立一个批处理文件并放在windows启动组中便于开机就运行SVN服务，或者在这个地址<a title=http://clanlib.org/~mbn/svnservice/ href="http://clanlib.org/%7EEmbn/svnservice/">http://clanlib.org/~mbn/svnservice/</a>下载那个<a title=svnservice.exe href="http://clanlib.org/%7EEmbn/svnservice/SVNService.zip">svnservice.exe</a>文件，拷贝到E:\svn\bin目录下，再从命令行下执行：<br>
<div class=code>svnservice -install --daemon --root "E:\svn\Repository"<br>sc config svnservice start= auto<br>net start svnservice<br></div>
此文件会将SVN变成windows系统的一个服务，并默认为自启动，注意：执行第三句时确保前面以命令行方式运行的SVN服务已经停止，如果没停止可在其窗口中按Ctrl+C中止运行。<br>
<h2>STEP 5:创建项目版本树 </h2>
<p>确定SVN服务(命令行或windows服务)运行后，在你需要导入储存库的目录下单击右键选择[TortoiseSVN]-&gt; [Import...]，在弹开的窗口的URL框中输入 "svn://localhost/myproject" 点击 "OK" 执行导入，如果没有报错，数据就全部加入SVN储存库目录树上了。用命令行也可以完成这些操作，这需要你在系统变量中新建一个&#8220;SVN_EDITOR&#8221;的系统变量，变量值为本地的一个文本编辑器执行文件路径，一般指到windows的记事本上就行了 "c:\windows\notepad.exe" ，然后新开一个CMD窗口，执行</p>
<div class=code>svn mkdir svn://localhost/myproject</div>
随即关闭记事本打开的log文件窗口后按"c"键继续后生成项目树。一般情况，我们在创建文件根路径后应该在创建三个目录：branches、tags、 trunk，这三个目录是Subversion需要的三个目录。对于check out、commit、update等操作可以通过svn命令行方式执行，也可以用TortoiseSVN的windows菜单完成，非常简单咯。<br><br><span style="COLOR: red">注意：出现&#8220;no repository found in ....&#8221;错误，多半是访问路径不对。<br>如我的Repository 路径为：E:\svn\repos1<br>我启动服务为：svnserve E:\svn&nbsp; （这里可认为svn 的localhost所指向的目录就是svn）<br>那么我的访问路径为：svn://localhost/repos1 (没有了svn目录)<br></span><br></div>
<br><img src ="http://www.phpweblog.net/fuyongjie/aggbug/5875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2008-10-11 12:28 <a href="http://www.phpweblog.net/fuyongjie/archive/2008/10/11/5875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>