﻿<?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>BlogJava-jasmine214--love-随笔分类-版本管理</title><link>http://www.blogjava.net/jasmine214--love/category/46241.html</link><description>只有当你的内心总是充满快乐、美好的愿望和宁静时，你才能拥有强壮的体魄和明朗、快乐或者宁静的面容。</description><language>zh-cn</language><lastBuildDate>Thu, 24 May 2012 12:24:37 GMT</lastBuildDate><pubDate>Thu, 24 May 2012 12:24:37 GMT</pubDate><ttl>60</ttl><item><title>代码评审 工具 ReviewBoard</title><link>http://www.blogjava.net/jasmine214--love/archive/2012/05/24/379059.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Thu, 24 May 2012 12:10:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2012/05/24/379059.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/379059.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2012/05/24/379059.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/379059.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/379059.html</trackback:ping><description><![CDATA[<div><div id="p_fullcontent"><p>Review Board起源于VMware的一些开发者。它基于<a href="http://www.oschina.net/p/django">Django</a>，你可以把它安装在自己的服务器上，工作流和Rietveld极为类似。令人高兴的是它提 供了在diffs里进行语法彩色编码，使得代码阅读变得简便。此外，它还实现了基于Lucene的搜索来帮助管理较大的diffs组。</p>  <p>Review Board在审查补丁（Patch）方面表现完美。一个叫做&#8220;提交审查&#8221;的工具被用来和SCM系统进行连接（当前支持SVN、CVS、Perforce、Git和Mercurial等），可以允许你请求一个将被提交的修改的审查。<a id="jxh8" title="用户基础" href="http://code.google.com/p/reviewboard/wiki/UserBasics">用户基础</a>页面将这个过程描述如下：</p>  <ol><li>你在本地检出的代码上做了些可怕的修改。 </li><li>你通过公布diff、编写描述和选择一些审查者来创建一个审查请求。 </li><li>你在审查请求中点击&#8220;发布&#8221;并等待你的审查者看到它。 </li><li>其他人看了你的审查请求，说道&#8220;这太可怕了，除非什么东西坏掉了。&#8221; </li><li>你根据他们的评论更新了你的代码。 </li><li>你公布了更新后的diff，以及对他们评论的解答以指明你修改了什么（或者你要说明为什么你不打算按照他们的建议修改代码）。 </li><li>大家看了你更新后的代码，并请你继续。 </li><li>你将修改提交到仓库中。 </li><li>你在审查请求中点击&#8220;设置为已提交&#8221;来从其他人的面板中移除你的审查请求。</li></ol>  <p><img src="http://www.oschina.net/uploads/img/200811/13164328_MOUr.jpg" alt="" /></p></div></div>原文：<div>http://www.oschina.net/p/review+board</div><img src ="http://www.blogjava.net/jasmine214--love/aggbug/379059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2012-05-24 20:10 <a href="http://www.blogjava.net/jasmine214--love/archive/2012/05/24/379059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SVN 一次性提交多个目录中文件的方法</title><link>http://www.blogjava.net/jasmine214--love/archive/2012/05/21/378661.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Mon, 21 May 2012 02:53:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2012/05/21/378661.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/378661.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2012/05/21/378661.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/378661.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/378661.html</trackback:ping><description><![CDATA[<div>情况一：将项目中未加入版本控制的文件提交到版本库。 <br /> <br />在使用WINDOW下的SVN客户端工具时，在提交一个项目的文件时，如果有未加入版本库的文件，这时可以先将未加入的文件选中，然后一起提交。 <br /> <br />但在LINUX命令行中，如果一个项目中新创建了一个文件new.php,那么我们可以使用如下命令来进行版本的提交。 <br /> <br />~@bash svn add new.php <br />~@bash svn ci -m=hqlong <br /> <br />但如果有多个文件时，我一直都是一个一个的添加。比如。有a.php,b.php,c.php.那么提交操作如下： <br /> <br />~@bash svn add a.php,b.php,c.php <br />~@bash ci -m=hqlong <br /> <br />一直以后，新添加的文件不多，所以也就没有注意这个。今天当我查看项目的版本状态时，发现很多文件都没有加入版本库，本想按照老方法一个一个的添加，但始终想着是否有另外一种方式，一次性全部提交。所以就请教了我的两位大学同学（小黑、杨煌）。答案如下： <br />将同一目录下的未加入版本库的文件提交到版本库。 <br /> <br />~@bash svn add * <br /> <br />注意上面只是针对同一目录的文件，如果目录下还有目录，这时上面的命令提交就不行了。如果是二级目录的话。操作命令如下： <br /> <br />~@bash svn add */* <br /> <br />当然三目录依次类推。 <br /> <br />~@bash svn add */*/* <br /> <br />那么如果里面有很多级目录，该怎么办呢？或者说根本不清楚究竟有多少级。 <br />这时使用通配符&#8220;*&#8221;，来解决一切未知的答案。 <br /> <br />~@bash svn add */**/* <br /> <br />注意上面第三个&#8220;*&#8221;，它代表了我们所担心的那个未知数。 <br /> <br />情况二：更新或者提交源码时，不提交某一特定文件。 <br /> <br />当很多人同时开发一个项目，项目的配置文件可能在不同的开发人员的机器上，会有不同。当每次更新整个项目时，希望更新全部的文件但除了配置文件以外。 <br />又如配置文件为config.php. <br />这时我们可以使用正则来排除我们所不需要提交的代码。 <br />提交代码命令如下 <br /> <br />~@bash svn ci !(config.php) -m=hqlong <br /> <br />表示除了config.php以外的代码，都提交到版本库中。 <br />更新代码命令如下 <br /> <br />~@bash svn up !(config.php) <br /> <br />表示除了config.php的所有代码都更新。 </div><br /><br />原文：http://vaqeteart.iteye.com/blog/832526<img src ="http://www.blogjava.net/jasmine214--love/aggbug/378661.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2012-05-21 10:53 <a href="http://www.blogjava.net/jasmine214--love/archive/2012/05/21/378661.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SVN 使用--no-ignore解决库文件忽略的问题</title><link>http://www.blogjava.net/jasmine214--love/archive/2012/05/10/377763.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Thu, 10 May 2012 02:27:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2012/05/10/377763.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/377763.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2012/05/10/377763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/377763.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/377763.html</trackback:ping><description><![CDATA[<div>我曾在使用svn import android代码时,svn把.a以及.so文件全部忽略了, 重新check out的代码就不包含这些文件了 <p>&nbsp;</p> <p>通过终端打开配置文件: open ~/.subversion/config<br />把下面两行(也可能是一行)中的注释和*.a去掉,<br />然后保存.<br />#global-ignores = *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo &nbsp;<br />#*.rej *~ #*# .#* .*.swp .DS_Store </p> <p>注意：去掉#号后要顶行</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>或者在svn import 的时候加入参数 --no-ignore</p></div><img src ="http://www.blogjava.net/jasmine214--love/aggbug/377763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2012-05-10 10:27 <a href="http://www.blogjava.net/jasmine214--love/archive/2012/05/10/377763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下SVN搭建完整过程及SVN使用相关内容</title><link>http://www.blogjava.net/jasmine214--love/archive/2012/04/10/373673.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Tue, 10 Apr 2012 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2012/04/10/373673.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/373673.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2012/04/10/373673.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/373673.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/373673.html</trackback:ping><description><![CDATA[<div>  <p>SVN<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">环境搭建完整步骤</span></p>  <p>&nbsp;</p>  <p><strong>1</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">、</span>SVN</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">安装</span></strong></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">从</span>VM<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">新建虚拟机</span></p>  <p>1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">）安装路径：</span>D<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">：</span>\ubuntu-test</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">使用</span>ubuntu <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">软件：</span>c:\svn<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">安装软件</span>\ubuntu-10.04.1-desktop.i386.iso</p>  <p>Network adapter<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">：</span>Bridged</p>  <p>Ubuntu<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">登录账号</span>/<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">密码：</span>kiki/kiki</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">安装完成，重启</span>ubuntu<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，打开</span>terminal<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，自动获得了一个</span>IP<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">（</span>172.28.6.13<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">）。</span></p>  <p>&nbsp;</p>  <p>2) <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">设置，安装过程</span></p>  <p>a) <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">设置</span> ip <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">和</span>dns<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">上网。</span></p>  <p>&nbsp;&nbsp;&nbsp; Step1,</p>  <p>sudo &#8211;s <span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">转成</span>root<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">用户，方便操作。</span></p>  <p>&nbsp;&nbsp;&nbsp; Step2,</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">设置</span><span>IP, vi /etc/network/interfaces</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">加入：</span></p>  <p>auto eth0</p>  <p>iface eth0 inet static</p>  <p>address 172.28.6.239</p>  <p>netmask 255.255.0.0</p>  <p>gateway 172.28.16.1</p>  <p>&nbsp;&nbsp;&nbsp; Step3,</p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sudo nano /etc/resolv.conf</span></p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">是一个编辑工具，设置</span>DNS<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">。</span></p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">加入：</span><span>nameserver 10.58.100.1</span></p>  <p>&nbsp;&nbsp;&nbsp; Step4,</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">重新启动</span><span> networking </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">服务：</span></p>  <p>sudo /etc/init.d/networking restart</p>  <p>&nbsp;&nbsp;&nbsp; <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">总结：设置</span>OK<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，</span>ping 172.28.6.69<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">成功。</span></p>  <p>&nbsp;</p>  <p>b) apt-get update <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">先更新一下源。</span></p>  <p>c) <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">安装</span>VIM</p>  <p>&nbsp;&nbsp;&nbsp; apt-get install vim </p>  <p>d) <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">安装</span>openssh-server</p>  <p>e)&nbsp; <span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">安装</span>subversion</p>  <p>f) <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">安装</span>subversion-tools</p>  <p>g) <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">安装</span>apache2</p>  <p>h) <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">安装</span>libapache2-svn</p>  <p>i) <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">安装</span>tree </p>  <p>j) <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">设置</span>apache2<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">下的</span>SVN</p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vim /etc/apache2/dav_svn.conf</span></p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">设置如下：</span></p>  <p>&lt;Location <span style="background:red;">/test/&gt;</span></p>  <p>&nbsp;DAV svn</p>  <p>&nbsp; SVNListParentPath on</p>  <p>&nbsp;&nbsp; SVNParentPath /home/repo/</p>  <p><span>&nbsp; # SVNIndexXSLT "/apache2-default/svnindex.xsl" </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">（注释掉，否则会有</span>xml<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的错误，不能显示）</span></p>  <p>&nbsp; AuthType Basic</p>  <p><span>&nbsp; AuthName "Subversion Repository"</span></p>  <p><span>&nbsp; AuthUserFile /etc/apache2/dav_svn.passwd</span></p>  <p>&nbsp;&nbsp;&nbsp; Require valid-user</p>  <p><span>&nbsp; AuthzSVNAccessFile /etc/apache2/dav_svn.authz&nbsp; z</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">居然泄露了，害我找了好久的原因</span></p>  <p><span style="background:red;">&lt;/</span>Location&gt;</p>  <p>&nbsp;</p>  <p>PS<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">：</span></p>  <p>1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">）刚安装好的</span>apache2<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">没有</span>dav_svn.passwd<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">文件，</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">使用</span>vim <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">创建，</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">然后</span><span>htpasswd -b dav_svn.passwd kiki kiki&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">更新密码。</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">创建</span>dav_svn.auth<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">文件，设置</span>*=rw<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">方便测试。</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">权限文件设置注意：</span><span style="background:red;">[]</span>*=rw,<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">并且具备权限继承性，子目录的权限将代替父目录的权限。</span></p>  <p>2<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">）创建测试所用的版本库，路径在：</span>/home/repo/test1,<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">其中</span>test1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">是版本库。</span></p>  <p>3<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">）重启</span>apache<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">服务</span><span> &nbsp;/etc/init.d/apache2 restart</span></p>  <p>4) &nbsp;<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">设置创建的帐户文件所属者为</span>www-data.</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">设置创建的库所属者为</span>www-data,</p>  <p><span>root@kiki-desktop:/etc/apache2# chown www-data:www-data dav_svn.passwd</span></p>  <p><span>root@kiki-desktop:/etc/apache2# chmod 777 dav_svn.passwd</span></p>  <p><span>root@kiki-desktop:/home# chown -R www-data:www-data repo</span></p>  <p>5<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">）访问：</span><a href="http://ip/test/">http://IP/<span style="background:red;">test/</span></a><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">库名，</span>SSH<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">远程登录</span>ubuntu<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">出现中文乱码时，设置</span>LANG=&#8221;&#8221;;</p>  <p>&nbsp;</p>  <p><strong>2</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">、</span>SVN</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">版本对比</span></strong></p>  <p>2.1<span>&nbsp;&nbsp; Subversion 1.6</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的新东西</span></p>  <p><a href="http://www.subversion.org.cn/?action-viewnews-itemid-99#auth-related-improvements"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;"><span>改进的认证数据处理</span></span></a></p>  <p><a href="http://www.subversion.org.cn/?action-viewnews-itemid-99#repository-root-relative-urls"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;"><span>版本库根的相对</span>URL</span></a></p>  <p><a href="http://www.subversion.org.cn/?action-viewnews-itemid-99#externals">svn:externals<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;"><span>的改进</span></span></a></p>  <p><a href="http://www.subversion.org.cn/?action-viewnews-itemid-99#tree-conflicts"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;"><span>目录树冲突的检测</span></span></a></p>  <p><a href="http://www.subversion.org.cn/?action-viewnews-itemid-99#filesystem-improvements"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;"><span>文件系统存储改进</span></span></a></p>  <p><span><a href="http://www.subversion.org.cn/?action-viewnews-itemid-99#ctypes-python-bindings">Ctypes Python<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">绑定</span></a></span></p>  <p><span style="background:red;"><a href="http://www.subversion.org.cn/?action-viewnews-itemid-99#improved-interactive-conflict-resolution"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">改进的交互式冲突解决</span></a></span></p>  <p><span style="background:red;"><a href="http://www.subversion.org.cn/?action-viewnews-itemid-99#sparse-directory-exclusion"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">稀疏目录的排除选项</span></a></span></p>  <p><a href="http://www.subversion.org.cn/?action-viewnews-itemid-99#svnserve-logging">svnserve<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;"><span>的日志支持</span></span></a></p>  <p><a href="http://www.subversion.org.cn/?action-viewnews-itemid-99#historical-uris"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;"><span>察看历史的新</span>HTTP URI<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">语法</span></span></a></p>  <p><a href="http://www.subversion.org.cn/?action-viewnews-itemid-99#cmdline"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;"><span>命令行客户端改进</span></span></a></p>  <p><a href="http://www.subversion.org.cn/?action-viewnews-itemid-99#apis">API<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;"><span>变更、改进以及多种语言绑定</span></span></a></p>  <p><a href="http://www.subversion.org.cn/?action-viewnews-itemid-99#bug-fixes"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;"><span>超过</span>65<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">项新的</span>bug<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">修正和提升</span></span></a></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">参考：</span><a href="http://www.subversion.org.cn/?action-viewnews-itemid-99">http://www.subversion.org.cn/?action-viewnews-itemid-99</a></p>  <p>&nbsp;</p>  <p>2.2<span>&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">以下为共进实际情况：</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">服务器：</span>10.58.100.247  Subversion1.5</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">客户端：</span>10.58.102.3<span>&nbsp;&nbsp;&nbsp; Subversion1.6</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">改进和</span>bug<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">修正</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">改进的交互式冲突解决</span>(<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">客户端</span>)</p>  <p><img src="file:///C:/DOCUME%7E1/xufuli/LOCALS%7E1/Temp/msohtml1/01/clip_image002.jpg" border="0" height="558" width="701"  alt="" /></p>  <p>svn up:</p>  <p><span style="position: absolute;z-index:1;left:0px;margin-left:28px;margin-top:75px;width:111px; height:12px"><img src="file:///C:/DOCUME%7E1/xufuli/LOCALS%7E1/Temp/msohtml1/01/clip_image003.gif" height="12" width="111"  alt="" /></span><img src="file:///C:/DOCUME%7E1/xufuli/LOCALS%7E1/Temp/msohtml1/01/clip_image005.jpg" border="0" height="99" width="180"  alt="" /></p>  <p><span style="position: absolute;z-index:2;left:0px;margin-left:16px;margin-top:231px;width:567px; height:12px"><img src="file:///C:/DOCUME%7E1/xufuli/LOCALS%7E1/Temp/msohtml1/01/clip_image006.gif" height="12" width="567"  alt="" /></span><img src="file:///C:/DOCUME%7E1/xufuli/LOCALS%7E1/Temp/msohtml1/01/clip_image008.jpg" border="0" height="599" width="600"  alt="" /></p>  <p>&nbsp;</p>  <p><strong>3</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">、</span>SVN</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">备份</span></strong></p>  <p>1. 10.58.101.6&nbsp;<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">截图：</span> </p>  <p><img src="file:///C:/DOCUME%7E1/xufuli/LOCALS%7E1/Temp/msohtml1/01/clip_image010.gif" border="0" height="137" width="638"  alt="" /><img src="file:///C:/DOCUME%7E1/xufuli/LOCALS%7E1/Temp/msohtml1/01/clip_image012.gif" border="0" height="152" width="642"  alt="" /></p>  <p>&nbsp;</p>  <p>2. 10.58.100.247&nbsp;<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">截图</span></p>  <p><img src="file:///C:/DOCUME%7E1/xufuli/LOCALS%7E1/Temp/msohtml1/01/clip_image014.gif" border="0" height="194" width="582"  alt="" /><img src="file:///C:/DOCUME%7E1/xufuli/LOCALS%7E1/Temp/msohtml1/01/clip_image016.gif" border="0" height="136" width="650"  alt="" /><img src="file:///C:/DOCUME%7E1/xufuli/LOCALS%7E1/Temp/msohtml1/01/clip_image018.gif" border="0" height="267" width="718"  alt="" /><img src="file:///C:/DOCUME%7E1/xufuli/LOCALS%7E1/Temp/msohtml1/01/clip_image020.gif" border="0" height="654" width="657"  alt="" /></p>  <p>2. 10.58.101.6<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">截图：</span></p>  <p><img src="file:///C:/DOCUME%7E1/xufuli/LOCALS%7E1/Temp/msohtml1/01/clip_image022.gif" border="0" height="403" width="847"  alt="" /></p>  <p>&nbsp;</p>  <p>1. Rsync<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">（</span>remote synchronize<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">）是一个远程数据同步工具，可通过</span>LAN/WAN<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">快速同步多台主机间的文件。</span>Rsync<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">使用所谓的</span>&#8220;Rsync<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">算法</span>&#8221;<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">来使本地和远</span> <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">程两个主机之间的文件达到同步，这个算法只传送两个文件的不同部分，而不是每次都整份传送，因此速度相当快。</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">第一次连通完成时，会把整份文件传输一次，以后则就只需进行增量备份。</span></p>  <p>&nbsp;</p>  <p>2. Rsync<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">支持大多数的类</span>Unix<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">系统，无论是</span>Linux<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">、</span>Solaris<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">还是</span>BSD<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">上都经过了良好的测试。此外，它在</span>windows<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">平台下也有相应的版</span> <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">本，如</span>cwRsync<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">和</span>Sync2NAS<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">等工具。</span></p>  <p>&nbsp;</p>  <p>3. Rsync<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">的基本特点如下：</span> </p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">　　</span>1.<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">可以镜像保存整个目录树和文件系统；</span> </p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">　　</span>2.<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">可以很容易做到保持原来文件的权限、时间、软硬链接等；</span> </p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">　　</span>3.<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">无须特殊权限即可安装；</span> </p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">　　</span>4.<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">优化的流程，文件传输效率高；</span> </p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">　　</span>5.<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">可以使用</span>rsh<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">、</span>ssh<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">等方式来传输文件，当然也可以通过直接的</span>socket<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">连接；</span> </p>  <p>6.<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">支持匿名传输</span></p>  <p>4. rsync<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">是一个功能非常强大的工具，其命令也有很多功能特色选项，我们下面就对它的选项一一进行分析说明。</span> Rsync<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的命令格式可以为以下六种：</span> </p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">　　</span><span>rsync [OPTION]... SRC DEST</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">　　</span><span>rsync [OPTION]... SRC [USER@]HOST:DEST</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">　　</span><span>rsync [OPTION]... [USER@]HOST:SRC DEST</span></p>  <p>5. <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">从远程</span>rsync<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">服务器中拷贝文件到本地机。当</span>SRC<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">路径信息包含</span>&#8221;::&#8220;<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">分隔符时启动该模式。如：</span><span>rsync -av &nbsp;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#114;&#111;&#111;&#116;&#64;&#49;&#55;&#50;&#46;&#49;&#54;&#46;&#55;&#56;&#46;&#49;&#57;&#50;&#58;&#58;&#119;&#119;&#119;">root@172.16.78.192::www</a> &nbsp;/databack </span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">　</span> <span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">从本地机器拷贝文件到远程</span>rsync<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">服务器中。当</span>DST<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">路径信息包含</span>&#8221;::&#8220;<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">分隔符时启动该模式。如：</span><span>rsync -av &nbsp;/databack &nbsp;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#114;&#111;&#111;&#116;&#64;&#49;&#55;&#50;&#46;&#49;&#54;&#46;&#55;&#56;&#46;&#49;&#57;&#50;&#58;&#58;&#119;&#119;&#119;">root@172.16.78.192::www</a> </span></p>  <p>&nbsp;</p>  <p>-a, --archive <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">归档模式，表示以递归方式传输文件，并保持所有文件属性，等于</span>-rlptgoD</p>  <p>&nbsp;</p>  <p>-v, --verbose <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">详细模式输出</span></p>  <p>&nbsp;</p>  <p><strong>4</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">、</span>SVN</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">分支策略（常用分支模式</span>-</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">摘自</span>svn</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">指南</span>.doc</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">）</span></strong></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">参考资料：</span></p>  <p>Subversion1.4<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">手册</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.subversion.org.cn/svnbook/1.4/svn.branchmerge.maint.html">http://www.subversion.org.cn/svnbook/<span style="background:red;">1.4</span>/svn.branchmerge.maint.html</a></span></p>  <p>Subversion1.6<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">手册</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://i18n-zh.googlecode.com/svn/www/svnbook/zh/svn.tour.cycle.html#svn.tour.cycle.resolve</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">常用分支模式</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">版本控制在软件开发中广泛使用，这里是团队里程序员最常用的两种分支</span>/<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">合并模式的介绍，如果你不是使用</span>Subversion<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">软件开</span> <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">发，可随意跳过本小节，如果你是第一次使用版本控制的软件开发者，请更加注意，以下模式被许多老兵当作最佳实践，这个过程并不只是针对</span> Subversion<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，在任何版本控制系统中都一样，但是在这里使用</span>Subversion<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">术语会感觉更方便一点。</span></p>  <p>&nbsp;</p>  <p><a name="svn.branchmerge.commonuses.patterns.rele"></a><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">发布分支</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">大多数软件存在这样一个生命周期：编码、测试、发布，然后重复。这样有两个问题，第一，开发者需要在质量保证小组测试假定稳定</span> <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">版本时继续开发新特性，新工作在软件测试时不可以中断，第二，小组必须一直支持老的发布版本和软件；如果一个</span>bug<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">在最新的代码中发现，它一定也存在已发</span> <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">布的版本中，客户希望立刻得到错误修正而不必等到新版本发布。</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">这是版本控制可以做的帮助，典型的过程如下：</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">开发者提交所有的新特性到主干。</span> <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">每日的修改提交到</span>/trunk<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">：新特性，</span>bug<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">修正和其他。</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">这个主干被拷贝到&#8220;发布&#8221;分支。</span> <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">当小组认为软件已经做好发布的准备</span>(<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">如，版本</span>1.0)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">然后</span>/trunk<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">会被拷贝到</span>/branches/1.0<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">。</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">项目组继续并行工作，一个小组开始对分支进行严酷的测试，同时另一个小组在</span>/trunk<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">继续新的工作</span>(<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">如，准备</span>2.0)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，如果一个</span>bug<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">在任何一个位置被发现，错误修正需要来回运送。然而这个过程有时候也会结束，例如分支已经为发布前的最终测试&#8220;停滞&#8221;了。</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">分支已经作了标签并且发布，当测试结束，</span>/branches/1.0<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">作为引用快照已经拷贝到</span>/tags/1.0.0<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，这个标签被打包发布给客户。</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">分支多次维护。当继续在</span>/trunk<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">上为版本</span>2.0<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">工作，</span>bug<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">修正继续从</span>/trunk<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">运送到</span>/branches/1.0<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，如果积累了足够的</span>bug<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">修正，管理部门决定发布</span>1.0.1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">版本：拷贝</span>/branches/1.0<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">到</span>/tags/1.0.1<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，标签被打包发布。</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">整个过程随着软件的成熟不断重复：当</span>2.0<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">完成，一个新的</span>2.0<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">分支被创建，测试、打标签和最终发布，经过许多年，版本库结束了许多版本发布，进入了&#8220;维护&#8221;模式，许多标签代表了最终的发布版本。</span></p>  <p>&nbsp;</p>  <p><a name="svn.branchmerge.commonuses.patterns.feat"></a><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">特性分支</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">一个特性分支是本章中那个重要例子中的分支，你正在那个分支上工作，而</span>Sally<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">还在</span>/trunk<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">继续工作，这是一个临时分支，用来作复杂的修改而不会干扰</span>/trunk<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的稳定性，不象发布分支</span>(<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">也许要永远支持</span>)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，特性分支出生，使用了一段时间，合并到主干，然后最终被删除掉，它们在有限的时间里有用。</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">还有，关于是否创建特性分支的项目政策也变化广泛，一些项目永远不使用特性分支：大家都可以提交到</span>/trunk<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，好处是系统的简单&#8212;没有人需要知道分支和合并，坏处是主干会经常不稳定或者不可用，另外一些项目使用分支达到极限：没有修改曾经直接提交到主干，即使最细小的修改都要创建短暂的分支，然后小心的审核合并到主干，然后删除分支，这样系统保持主干一直稳定和可用，但是造成了巨大的负担。</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">许多项目采用折中的方式，坚持每次编译</span>/trunk<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">并进行回归测试，只有需要多次不稳定提交时才需要一个特性分支，这个规则可以用这样一个问题检验：如果开发者在好几天里独立工作，一次提交大量修改</span>(<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">这样</span>/trunk<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">就不会不稳定。</span>)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，是否会有太多的修改要来回顾？如果答案是&#8220;是&#8221;，这些修改应该在特性分支上进行，因为开发者增量的提交修改，你可以容易的回头检查。</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">最终，有一个问题就是怎样保持一个特性分支&#8220;同步&#8221;于工作中的主干，在前面提到过，在一个分支上工作数周或几个月是很有风险的，主干的修改也许会持续涌入，因为这一点，两条线的开发会区别巨大，合并分支回到主干会成为一个噩梦。</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">这种情况最好通过有规律的将主干合并到分支来避免，制定这样一个政策：每周将上周的修改合并到分支，注意这样做时需要小心，需要手工记录合并的过程，以避免重复的合并</span>(<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">在</span><a href="http://i18n-zh.googlecode.com/svn/www/svnbook-1.4/svn.branchmerge.copychanges.html#svn.branchmerge.copychanges.bestprac.track" title="手工跟踪合并"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;"><span>&#8220;手工跟踪合并&#8221;一节</span></span></a><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">描述过</span>)<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">，你需要小心的撰写合并的日志信息，精确的描述合并包括的范围</span>(<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">在</span><a href="http://i18n-zh.googlecode.com/svn/www/svnbook-1.4/svn.branchmerge.commonuses.html#svn.branchmerge.commonuses.wholebr" title="合并分支到另一分支"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;"><span>&#8220;合并分支到另一分支&#8221;一节</span></span></a><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">中描述过</span>)<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">，这看起来像是胁迫，可是实际上是容易做到的。</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">在一些时候，你已经准备好了将&#8220;同步的&#8221;特性分支合并回到主干，为此，开始做一次将主干最新修改和分支的最终合并，这样以后，除了你的分支修改的部分，最新的分支和主干将会绝对一致，所以在这个特别的例子里，你会通过直接比较分支和主干来进行合并：</span></p>  <p>$ cd trunk-working-copy</p>  <p>&nbsp;</p>  <p>$ svn update</p>  <p>At revision 1910.</p>  <p>&nbsp;</p>  <p><span>$ svn merge http://svn.example.com/repos/calc/trunk@1910 \</span></p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://svn.example.com/repos/calc/branches/mybranch@1910</span></p>  <p>U&nbsp;real.c</p>  <p>U&nbsp;integer.c</p>  <p>A&nbsp;newdirectory</p>  <p>A&nbsp;newdirectory/newfile</p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">&#8230;</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">通过比较</span>HEAD<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">修订版本的主干和</span>HEAD<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">修订版本的分支，你确定了只在分支上的增量信息，两条开发线都有了分枝的修改。</span></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">可以用另一种考虑这种模式，你每周按时同步分支到主干，类似于在工作拷贝执行</span>svn update<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">的命令，最终的合并操作类似于在工作拷贝运行</span>svn commit<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，毕竟，工作拷贝不就是一个非常浅的分支吗？只是它一次只可以保存一个修改。</span></p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p><strong>5</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">、</span>Subversion</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">管理代码最佳实践</span></strong></p>  <p><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">代码管理实践</span><span> <br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">代码仓库均采用</span>svn<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">来管理</span> </p>  <p><span><br /> 5.1&nbsp;&nbsp; </span><span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">代码目录的创建：</span><span><br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">一般创建三个目录分别为</span> <span><br /> trunk(</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">主干</span>)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，</span> <span><br /> tags</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">（标签</span>/<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">标记</span>)<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">，</span> <span><br /> branches(</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">分支</span>)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">。</span> <span><br /> tags</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">和</span>branches<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">下一般为根据需要从</span>trunk<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">目录拷贝过来的。</span> </p>  <p><span><br /> 5.2&nbsp;&nbsp; tags</span><span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">的创建要求：</span> <span><br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">代码在一种平台下通过编译（必须）</span> <span><br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">代码编译出来的版本通过一定的冒烟测试。</span> <span><br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">在项目要求的平台都可以编译通过。</span> <span><br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">一般有一个安装包给测试时，就需要在</span>tags<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">下建立对应代码的标签。</span> <span><br /> tags</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">下的代码一般不可以修改。</span><span> <br /> <br /> 5.3&nbsp;&nbsp; </span><span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">两种代码管理模式介绍</span><span>: <br /> a</span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">、始终分支系统</span>(OpenOffice<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">社区采用管理方式</span><span>) <br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">典型特征</span>:<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">项目较大，代码较多，编译时间较长，参与人员比较多时。</span> <span><br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">每个用户对每项编码任务的创建或操作都是在私有分支中进行的。</span> <span><br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">编码完成后，原编码者、同级或经理将对所有私有分支的更改进行审查并将它由合并到</span> /trunk <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">中。</span> <span><br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">里程碑的创建</span> <span><br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">集成人员集成将开发人员提交的功能集成到主干上，编译通过后，提交的主干上，集成了一定的功能后，创建一个里程碑版本，一般建议按周创建里程碑版本。并在</span>tags<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">下创建相应的代码快照，并将安装包传至指定位置。</span> <span><br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">开发人员基于里程碑版本开发。</span> <span><br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">开发人员一般基于最新的里程碑版本创建分支，并在分支上工作，并在自己的分支上提交，在提交到</span>svn<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">之前需要编译通过。开发人员需要根据自己开发情况来同步到主干的里程碑代码。如果需要集成到主干上，需要同步到最近的里程碑。</span> <span><br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">测试人员</span><span>. <br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">测试人员对开发人员的代码进行测试，达到一定的测试标准后，测试通过，然后交由集成人员来集成。</span> <span><br /> <br /> </span></p>  <p>b<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">、按需分支系统（</span>Subversion<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">社区采用管理方式）</span> <span><br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">适用方式代码较少，或者参与开发的人员较少</span> <span><br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">开发人员可以直接在主干上提交。开发负责人来编译版本给测试。</span><span> <br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">开发者把所有的新特性提交到主干。</span> <span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">每日的修改提交到</span>/trunk<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">：新特性，</span>bug<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">修正和其他。新近的开发人员不能提交代码，交由有经验的开发人员验证后来提交到主干上。</span> <span><br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">当开发小组认为软件已经做好基本发布的准备</span>(<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">如，版本</span>1.0)<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">然后</span>/trunk<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">会被拷贝到</span>/branches/1.0<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">。这个主干被拷贝到</span>&#8220;<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">发布</span>&#8221;<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">分支。然后在发布分支上继续修改</span><span>bug. <br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">如果</span>bug<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">修正经测试达到一定的要求认为可以完成时，可以拷贝到</span>/tags/1.0.0<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">，这个标签被建立并发布给相关人员。</span><span> <br /> <br /> </span></p>  <p>5.4<span>&nbsp;&nbsp; </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">向</span>svn<span style="font-family: 宋体;Times New Roman&quot;;Times New Roman&quot;">库提交提交代码要求</span> <span><br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">针对每次提交到主干上的代码均需要编译通过</span> <span><br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">代码每次提交到</span>svn<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">上均需要添加注释。</span> <span><br /> </span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">每个人都用自己账号来提交代码。</span> </p>  <p>&nbsp;</p>  <p><strong>6</strong><strong><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">、参考资料</span></strong></p>  <p style="margin-left:57.0pt;text-indent:-21.0pt;"><span style="font-family: Wingdings;"><span>l<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">分支模式在</span>SVN<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">环境下的应用</span></p>  <p style="margin-left:36.0pt"><a href="http://www.webwoo.net/SVN/svnsy/2009/1211/51007.html">http://www.webwoo.net/SVN/svnsy/2009/1211/51007.html</a></p>  <p style="margin-left:57.0pt;text-indent:-21.0pt;"><span style="font-family: Wingdings;"><span>l<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><a href="http://www.cnblogs.com/itech/archive/2011/08/01/2123354.html"><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;"><span>持续集成之&#8220;分支策略&#8221;</span></span></a></p>  <p style="margin-left:36.0pt"><a href="http://wwling2001.blogbus.com/logs/164479726.html">http://wwling2001.blogbus.com/logs/164479726.html</a></p>  <p style="margin-left:57.0pt;text-indent:-21.0pt;"><span style="font-family: Wingdings;"><span>l<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>SVN<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">常用分支模式</span></p>  <p style="margin-left:36.0pt"><a href="http://i18n-zh.googlecode.com/svn/www/svnbook-1.4/svn.branchmerge.commonuses.html">http://i18n-zh.googlecode.com/svn/www/svnbook-1.4/svn.branchmerge.commonuses.html</a></p>  <p style="margin-left:57.0pt;text-indent:-21.0pt;"><span style="font-family: Wingdings;"><span>l<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">配置管理一问一答</span></p>  <p style="margin-left:36.0pt">http://qa.uml.net.cn/Question/List.aspx?t=1&amp;tid=13&amp;tn=%E9%85%8D%E7%BD%AE%E7%AE%A1%E7%90%86&amp;area=0</p>  <p style="margin-left:57.0pt;text-indent:-21.0pt;"><span style="font-family: Wingdings;"><span>l<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">百度</span>-<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">主干开发，分支提测</span></p>  <p style="margin-left:36.0pt"><a href="http://www.cnblogs.com/topiemie/">http://www.cnblogs.com/topiemie/</a></p>  <p style="margin-left:57.0pt;text-indent:-21.0pt;"><span style="font-family: Wingdings;"><span>l<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>subversion<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">管理代码最佳实践</span></p>  <p style="margin-left:36.0pt">http://www.zxbc.cn/html/20081212/68890.html</p>  <p style="margin-left:57.0pt;text-indent:-21.0pt;"><span style="font-family: Wingdings;"><span>l<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>Subversion<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">中文站</span></p>  <p style="margin-left:36.0pt"><a href="http://www.subversion.org.cn/?action-category-catid-1">http://www.subversion.org.cn/?action-category-catid-1</a></p>  <p style="margin-left:57.0pt;text-indent:-21.0pt;"><span style="font-family: Wingdings;"><span>l<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>Subversion FAQ(<span style="font-family:宋体;Times New Roman&quot;;Times New Roman&quot;">常见问题解答</span>)</p>  <p style="margin-left:36.0pt">http://subversion.apache.org/faq.zh.html</p>  </div><img src ="http://www.blogjava.net/jasmine214--love/aggbug/373673.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2012-04-10 09:23 <a href="http://www.blogjava.net/jasmine214--love/archive/2012/04/10/373673.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2012工作计划</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/11/26/364896.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Sat, 26 Nov 2011 13:35:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/11/26/364896.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/364896.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/11/26/364896.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/364896.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/364896.html</trackback:ping><description><![CDATA[<div>  <p><a href="../archive/2011/01/14/342987.html">2012<span style="font-family: 宋体;"><span>工作计划</span></span></a></p>  <p><span style="font-family: 宋体;">工作总结需含概以下内容：</span></p>  <p>1<span style="font-family: 宋体;">、</span>&nbsp;&nbsp; <span style="font-family: 宋体;">简述您上一个年度所具体负责的工作、工作业绩，以及您对自己的工作业绩是否满意；</span></p>  <p>2<span style="font-family: 宋体;">、</span>&nbsp;&nbsp; <span style="font-family: 宋体;">简述您的下一步工作及学习计划，以及您今后的工作目标定位；</span></p>  <p>3<span style="font-family: 宋体;">、</span>&nbsp;&nbsp; <span style="font-family: 宋体;">期望公司及部门改善的地方；</span></p>  <p>&nbsp;</p>  <p>1. <span style="font-family: 宋体;">从事版本管理工作之后，</span>2011<span style="font-family: 宋体;">主要完成如下工作：</span></p>  <p style="margin-left: 10.5pt;">1<span style="font-family: 宋体;">）</span>.<span style="font-family: 宋体;">编写软件配置管理文档：如软件配置管理计划，及软件配置状态报告。</span></p>  <p style="margin-left: 10.5pt;">2<span style="font-family: 宋体;">）</span>.<span style="font-family: 宋体;">根据深圳</span>SCM<span style="font-family: 宋体;">主管的配置管理整理方案，完成对上海各事业部的配置库目录结构的整理及权限文件的整理，提高代码资源的管控。</span></p>  <p style="margin-left: 10.5pt;">3<span style="font-family: 宋体;">）</span>.<span style="font-family: 宋体;">在上海公司使用统一编译服务器，统一项目编译环境，保证代码及时提交入库。</span></p>  <p style="margin-left: 10.5pt;">4<span style="font-family: 宋体;">）</span>. <span style="font-family: 宋体;">推广持续集成，自动编译，提高网关研发同事出版本的效率</span>,<span style="font-family: 宋体;">及代码编译不通过的提醒，自测可以直接从</span>CI<span style="font-family: 宋体;">工具</span>hudson<span style="font-family: 宋体;">中取得，同时保证研发自测版本与测试部版本的一致性；</span> </p>  <p style="margin-left: 10.5pt;">5<span style="font-family: 宋体;">）</span>. <span style="font-family: 宋体;">增加</span>SVN<span style="font-family: 宋体;">密码修改模块，通过自己查找资料，经过环境搭建测试，完成</span>SVN<span style="font-family: 宋体;">密码修改模块，同时统一上海代码服务器的账号文件，清除废弃及重复的账号，避免相同的服务器使用多个账号，避免了混乱麻烦的状况。。</span></p>  <p style="margin-left: 10.5pt;">6<span style="font-family: 宋体;">）</span>. SVN<span style="font-family: 宋体;">服务器备份，使用本地备份及异地备份，全量备份与增量备份相结合的方式，进行代码库数据的备份，避免一旦服务器出现异常导致无法使用带来的巨大损失。</span></p>  <p style="margin-left: 10.5pt;">7<span style="font-family: 宋体;">）</span>. <span style="font-family: 宋体;">深圳同事提交代码出现卡死的情况，针对深圳同事的具体情况，使用账户模拟场景，再现问题，及研究</span>SVN<span style="font-family: 宋体;">触发的脚本，找出问题根源，并测试通过，改善了同事的工作过程。</span></p>  <p style="margin-left: 10.5pt;">8<span style="font-family: 宋体;">）</span>. <span style="font-family: 宋体;">深圳配置管理主管指导交流，提高了我自己对配置管理的认识，同时按照深圳高工给出的配置管理方案对上海代码库进行整理，目前已经完成</span>EOC<span style="font-family: 宋体;">，无线，网关的代码库整理工作，然后我们会严格按照配置管理策略来指导及执行项目的配置管理工作。</span></p>  <p>&nbsp;</p>  <p>2. 2012<span style="font-family: 宋体;">的工作及学习计划如下：</span></p>  <p style="margin-left: 10.5pt;">1<span style="font-family: 宋体;">）</span>.<span style="font-family: 宋体;">策划一组</span>SVN<span style="font-family: 宋体;">系列培训，提供研发同事使用</span>SVN<span style="font-family: 宋体;">的熟练程度。</span></p>  <p style="margin-left: 10.5pt;"><span>&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体;">大致会包括如下的培训内容：</span></p>  <p style="margin-left: 31.5pt;">SVN<span style="font-family: 宋体;">客户端使用；</span></p>  <p style="margin-left: 31.5pt;">SVN<span style="font-family: 宋体;">服务器使用；</span></p>  <p style="margin-left: 31.5pt;">SVN<span style="font-family: 宋体;">常见问题解决方法；</span></p>  <p style="margin-left: 10.5pt;">2<span style="font-family: 宋体;">）</span>.<span style="font-family: 宋体;">精通</span>shell<span style="font-family: 宋体;">，使版本管理工作更高效。</span></p>  <p style="margin-left: 10.5pt;">3<span style="font-family: 宋体;">）</span>.<span style="font-family: 宋体;">努力参与项目，使软件配置管理更加深入项目，做好软件配置管理的本职工作，改善研发过程。</span></p>  <p style="margin-left: 10.5pt;"><span style="font-family: 宋体;">按照软件配置管理计划来参与项目，完善软件配置状态报告，及项目基线管理及版本管理；</span></p>  <p style="margin-left: 10.5pt;">4<span style="font-family: 宋体;">）</span>.<span style="font-family: 宋体;">精通</span>SVN<span style="font-family: 宋体;">，提高应对版本库出现的各种问题的解决能力。</span></p>  <p style="margin-left: 10.5pt;">5<span style="font-family: 宋体;">）</span>.<span style="font-family: 宋体;">深入了解软件配置管理思想，在工作中要尽可能的去体会以及应用在工作中。需要多搜集资料，学习别人的经验，同时结合本公司现状，加以应用。力求把上海的配置管理工作做好，做到位。</span></p>  <p style="margin-left: 10.5pt;">6<span style="font-family: 宋体;">）．尝试实现</span>SVN<span style="font-family: 宋体;">二次开发，提高研发过程。</span></p>  <p style="margin-left: 10.5pt;">7<span style="font-family: 宋体;">）</span>.<span style="font-family: 宋体;">开展软件配置管理系统培训，普及软件配置管理知识，培训内容包括：</span></p>  <p style="margin-left: 10.5pt;"><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCM</span><span style="font-family: 宋体;">基本概念培训；</span></p>  <p style="margin-left: 10.5pt;"><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCM</span><span style="font-family: 宋体;">规范培训；</span></p>  <p style="margin-left: 10.5pt;"><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCM</span><span style="font-family: 宋体;">策略培训；</span></p>  <p>&nbsp;</p>  <p>&nbsp;</p>  </div><img src ="http://www.blogjava.net/jasmine214--love/aggbug/364896.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-11-26 21:35 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/11/26/364896.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件产品发布流程-2种说法的分析</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/11/24/364733.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Thu, 24 Nov 2011 07:23:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/11/24/364733.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/364733.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/11/24/364733.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/364733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/364733.html</trackback:ping><description><![CDATA[<div>  <p>严格按照软件产品发布流程发布软件版本是建立和完善软件产品版本控制，保证软件产品质量的关键过程之一。参与软件产品发布的人员主要是测试负责人和<span>BM（Build Master）。</span></p>  <p>公司软件产品发布的规程如下：</p>  <p>1、 发布准备。<span><br /> </span>发布之前，所有程序<span>freezed由测试人员进行确认测试；</span><span><br /> </span>检查<span>qcs系统内登记的所有bug都已经被fixed，或者遗留的bug不影响系统的使用，如果有严重bug未解决（级别为must fixed）不能发布；</span><span><br /> </span>程序打包前做冒烟测试。</p>  <p>2、 测试负责人编写<span>release产品质量报告进行质量分析和总结。</span></p>  <p>3、 源码、文档入库。<span><br /> </span>源码包括数据库创建脚本（含静态数据）、编译构建脚本和所有源代码；<span><br /> </span>文档包括需求、设计、测试文档，安装手册、使用手册、二次开发手册、产品介绍（<span>ppt）、使用demo等。</span></p>  <p>4、<span>BM进行程序打包；标记源码、文档版本tag。</span></p>  <p>5、<span> BM填写发布基线通知并通知相关人员；BM经理对发布基线进行审计。</span></p>  <p>6、在<span>qcs系统上新建产品发布计划，填写配置项，执行发布计划（发布产品）。</span></p>  <p>7、上传程序包、使用文档至<span>download站点。</span></p>  <p>8、&nbsp;编写发布说明<span>readme.txt（或者release note）。</span><span><br /> </span>Readme的内容应该包括产品版本说明、产品概要介绍、本次发布包含的文件包、文档说明、本次发布包含或者新增的功能特性说明、遗留问题及影响说明、版权声明以及其他需要说明的事项。</p>  <p>9、 正式发布通知。<span><br /> </span>通知开发、测试、市场、销售各相关部门并附上产品发布说明和产品介绍。</p>  <p>10、后续工作。<span><br /> </span>产品发布后，在使用过程中可能还会发现一些<span>bug。在不影响正常使用的情况下，这些bug将在下一版本发布时解决；如果bug严重影响使用，必须打patch或者按照流程重新发布。</span></p>  <p>11、 临时发布。<span><br /> </span>软件产品未正式发布前，可能需要一个临时版本供开发人员或者用户应急使用，这时候需要临时发布一个版本。这个版本只包括基本的程序包和必要的使用说明。临时发布需要通知相关开发、测试人员；<span>BM需要为源码、文档打tag标记。</span><span><br /> <br /> </span>12、 软件产品发布后，即建立了一条发布基线。<span> <br /> </span>所有用户安装及二次开发必须在此基线上进行，开发人员不能直接从<span>cvs或vss上check 代码编译交付用户使用或者进行二次开发。</span></p>  <p><strong><span style="font-family: 宋体; font-weight: normal;"><br /></span></strong></p><p><strong><span style="font-family: 宋体; font-weight: normal;">另一种说法：</span></strong></p>  <p>公司软件产品发布的规程如下：<span><br /> </span>1.FAE首先向版本管理员提交需求<span>;</span><span><br /> </span>2.版本管理员将需求提交给项目经理<span>,由经理确认需求以及发布基线;</span><span><br /> </span>3.发布准备<span>:发布之前，先将当前主干中的所有程序freezed,并从主干中拉出一条发布分支branch,由开发人员对其进行功能测试:检查所有bug是否都已经被fixed，或者遗留的bug不影响软件的使用，如果有严重bug未解决暂时不能发布。</span><span><br /> </span>4.如果测试通过<span>,则由相关开发人员进行程序打包；标记源码、文档版本tag。</span><span><br /> </span>5.开发人员将标记的源码和文档地址交予版本管理员<span>,由版本管理员编写发布说明release list.release list内容应包括本次发布包含的文件包、文档说明;各类文件的存放路径,提供者及tag信息;本次发布包含或者新增的功能特性说明；遗留问题及影响说 明；版权声明以及其他需要说明的事项。</span><span><br /> </span>6.管理员在<span>jira上建立测试任务并邮件通知相关测试人员。</span><span><br /> </span>7.FAE测试<span>,测试完成后，FAE向版本管理员反馈测试结果（确认所提需求是否全部实现，不然则列出哪些功能还存在不足或BUG）:如果测试没有通过， 将由版本管理员向开发组请求重新release内部版本，再交FAE重新测试;如果测试通过，则由版本管理员为当前的版本进行标记和命名,同时提交到发布 库中.</span><span><br /> </span>8.正式发布通知。邮件通知各相关部门并附上产品发布说明和产品介绍。<span><br /> </span>9.由<span>FAE将发布后的版本打包release给客户;</span><span><br /> </span>10.后续工作。产品发布后，在使用过程中可能还会发现一些<span>bug。在不影响正常使用的情况下，这些bug将在下一版本发布时解决；如果bug严重影响使用，必须打patch或者按照流程重新发布。</span><span><br /> </span>11. 临时发布。软件产品未正式发布前，可能需要一个临时版本供开发人员或者用户应急使用，这时候需要临时发布一个版本。这个版本只包括基本的程序包和必要的使用说明。临时发布需要通知相关开发、测试人员；管理员需要为源码、文档打<span>tag标记。</span><span><br /> </span>12. 软件产品发布后，即建立了一条发布基线。所有用户安装及二次开发必须在此基线上进行，开发人员不能直接从<span>svn上check 代码编译交付用户使用或者进行二次开发。</span></p>  <h1>&nbsp;</h1>  <p>&nbsp;</p>  </div><img src ="http://www.blogjava.net/jasmine214--love/aggbug/364733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-11-24 15:23 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/11/24/364733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>版本库迁移（合并）的实现</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/11/15/363790.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Tue, 15 Nov 2011 01:50:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/11/15/363790.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/363790.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/11/15/363790.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/363790.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/363790.html</trackback:ping><description><![CDATA[<div><div id="sina_keyword_ad_area2"> 			<p><strong>一、windows</strong></p> <p>版本库迁移（合并）：指的是将两个独立的、有各自版本信息的版本库合并为一个版本库，并保留被合并的两个库的版本信息。</p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 环境：windows+SVN+apache</p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 我的版本库路径：E:\svnrepository（即我的版本库是在这个路径下建立的）</p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 操作步骤：</p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1、在E:\svnrepository下建立两个版本库：local和local1，版本库local是我原先的版本，版本号已经到了25了,此版本库一层目录是liruixuan，二层目录是test；在新建的版本库local1中进行三次提交，增加文件夹ivy，在ivy里面增加文件test.txt，产生三条版本信息，记为test2(1,2,3)；</p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 现在把版本库local1根目录下的所有内容（文件夹ivy，还有里面的test.txt）迁移到版本库local的目录liruixuan\test下；</p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 2、运行cmd打开命令解释程序，首先输入命令：</p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>svnadmin dump E:\svnrepository\local1 &gt;&nbsp;<wbr>&nbsp;<wbr> E:\svnrepository\20091222 ，此命令是将版本库local1的所有内容转储为名叫20091222的文件，当然，这个文件名可以随便；运行结果如下图：</p> <p><span> <img src="http://hiphotos.baidu.com/ivy%5Flee1984/pic/item/67218d355e969f0b5bb5f52f.jpg" alt="版本库迁移（合并）的实现" title="版本库迁移（合并）的实现" border="0" /></span><br /></p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 3、然后输入命令：</p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> svnadmin load E:\svnrepository\local --parent-dir liruixuan\test &lt; E:\svnrepository\20091222，此命令是将local1的转储文件2009122读入版本库local的liruixuan\test目录下，参数&#8220;--parent-dir&#8221;是为了指定local下的具体路径，方法就是在&#8220;--parent-dir&#8221;后键入具体路径，这里的测试选择了二级目录liruixuan\test；运行结果如下图：</p> <p><span><img src="http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif" alt="版本库迁移（合并）的实现" title="版本库迁移（合并）的实现" border="0" /></span><br /></p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 4、更新版本库local，你会发现liruixuan\test下面多了个文件夹ivy，里面有个文件test.txt ，查看local的log，会发现原版本库local的版本信息已增加了三个版本，达到了28，新增了版本信息26、27、28，对应的就是原local1的版本信息local1(1、2、3)，但除了Revision号由原来的1、2、3变为26、27、28外，其它没有变化。</p> <p>&nbsp;<wbr></p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 如果你想把迁入的版本库local1里的内容再细致的分到local的不同目录下，干脆直接用命令 svnadmin load E:\svnrepository\local &lt; E:\svnrepository\20091222 把local1的内容迁移到local的根目录下，然后再用TortoiseSVN的版本库浏览器做细致调整，反正版本信息都已经合并在一起了，后面的操作都是在一个版本库下。</p> <p>&nbsp;<wbr></p> <p><strong>二、linux</strong></p> <p>版本库迁移（合并）：指的是将两个独立的、有各自版本信息的版本库合并为一个版本库，并保留被合并的两个库的版本信息。</p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 环境：linux+collabnet</p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 我的版本库路径：/svn/repositories（即我的版本库是在这个路径下建立的）</p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 操作步骤：</p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1、在/svn/repositories下 建立两个版本库：first和last，版本库first是我原先的版本，版本号已经到了25了,此版本库一层目录是liruixuan，二层目录是 test；在新建的版本库last中进行三次提交，增加文件夹ivy，在ivy里面增加文件test.txt，产生三条版本信息，记为test2(1,2,3)；</p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 现在把版本库last根目录下的所有内容（文件夹ivy，还有里面的test.txt）迁移到版本库first的目录liruixuan/test下；</p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 2、输入命令：</p> <p>&nbsp;<wbr>&nbsp;<wbr>svnadmin dump /svn/repositories/last&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><strong>&gt;&nbsp;<wbr>&nbsp;<wbr></strong> /svn/repositories/20091222 ，此命令是将版本库last的所有内容转储为名叫20091222的文件，当然，这个文件名可以随便；运行结果如下图：</p> <p>&nbsp;<wbr>*dumpd revision 0.</p> <p>*dumpd revision 1.</p> <p>........<br /></p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 3、然后输入命令：</p> <p>&nbsp;<wbr>svnadmin load /svn/repositories/first --parent-dir liruixuan/test <strong>&lt;</strong> /svn/repositories/20091222，此命令是将last的转储文件2009122读入版本库first的liruixuan/test目录下，参数&#8220;--parent-dir&#8221;是为了指定first下的具体路径，方法就是在&#8220;--parent-dir&#8221;后键入具体路径，这里的测试选择了二级目录liruixuan/test；运行结果如下图：</p> <p>无图</p> <p><br /></p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 4、更新版本库first，你会发现liruixuan/test下面多了个文件夹ivy，里面有个文件test.txt ，查看first的log，会发现原版本库first的版本信息已增加了三个版本，达到了28，新增了版本信息26、27、28，对应的就是原last的版本信息local1(1、2、3)，但除了Revision号由原来的1、2、3变为26、27、28外，其它没有变化。</p> <p>&nbsp;<wbr></p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 如果你想把迁入的版本库last里的内容再细致的分到first的不同目录下，干脆直接用命令 svnadmin load /svn/repositories/first &lt; /svn/repositories/20091222 把last的内容迁移到first的根目录下，然后再用TortoiseSVN的版本库浏览器做细致调整，反正版本信息都已经合并在一起了，后面的操作都是在一个版本库下。</p>							 		</div></div>原文：<div>http://blog.sina.com.cn/s/blog_5d8165e00100fxd3.html</div><img src ="http://www.blogjava.net/jasmine214--love/aggbug/363790.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-11-15 09:50 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/11/15/363790.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RSYNC常见问题 </title><link>http://www.blogjava.net/jasmine214--love/archive/2011/10/28/362222.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Fri, 28 Oct 2011 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/10/28/362222.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/362222.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/10/28/362222.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/362222.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/362222.html</trackback:ping><description><![CDATA[<div><p>问题一：</p><p><span style="color: #ff0000;">@ERROR: chroot failed</span></p><p><span style="color: #ff0000;">rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]</span></p><p>原因：</p><p><span style="color: #0055ff;">服务器端的目录不存在或无权限。创建目录并修正权限可解决问题。</span></p><p>&nbsp;</p><p>问题二：</p><p><span style="color: #ff0000;">@ERROR: auth failed on module tee</span></p><p><span style="color: #ff0000;">rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]</span></p><p>原因：</p><p><span style="color: #0055ff;">服务器端该模块（tee）需要验证用户名密码，但客户端没有提供正确的用户名密码，认证失败。提供正确的用户名密码解决此问题。</span></p><p>&nbsp;</p><p>问题三：</p><p><span style="color: #ff0000;">@ERROR: Unknown module &#8216;tee_nonexists&#8217;</span></p><p><span style="color: #ff0000;">rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]</span></p><p>原因：</p><p><span style="color: #0055ff;">服务器不存在指定模块。提供正确的模块名或在服务器端修改成你要的模块以解决问题。</span></p><p>&nbsp;</p><p>问题四：</p><p><span style="color: #ff0000;">password file must not be other-accessible</span></p><p><span style="color: #ff0000;">continuing without password file</span></p><p><span style="color: #ff0000;">Password:</span></p><p>原因：</p><p><span style="color: #0055ff;">这是因为rsyncd.pwd rsyncd.secrets的权限不对，应该设置为600。如：chmod 600 rsyncd.pwd</span></p><p>&nbsp;</p><p>问题五：</p><p><span style="color: #ff0000;">rsync: failed to connect to 218.107.243.2: No route to host (113)</span></p><p><span style="color: #ff0000;">rsync error: error in socket IO (code 10) at clientserver.c(104) [receiver=2.6.9]</span></p><p>原因：</p><p><span style="color: #0055ff;">对方没开机、防火墙阻挡、通过的网络上有防火墙阻挡，都有可能。关闭防火墙，其实就是把tcp udp的873端口打开。</span></p><p>&nbsp;</p><p>问题六：</p><p><span style="color: #ff0000;">rsync error: error starting client-server protocol (code 5) at main.c(1524) [Receiver=3.0.7]</span></p><p>原因：</p><p><span style="color: #0055ff;">/etc/rsyncd.conf配置文件内容有错误。请正确核对配置文件。</span></p><p>&nbsp;</p><p>问题七：</p><p><span style="color: #ff0000;">rsync: chown "" failed: Invalid argument (22)</span></p><p>原因：</p><p><span style="color: #0055ff;">权限无法复制。去掉同步权限的参数即可。(这种情况多见于Linux向Windows的时候)</span></p></div>原文：<div>http://hi.baidu.com/_k_morisato_/blog/item/a54b0ffb1dab3c9f9e5146ae.html</div><img src ="http://www.blogjava.net/jasmine214--love/aggbug/362222.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-10-28 10:22 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/10/28/362222.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下subversion分支合并-专题培训</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/09/19/359022.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Mon, 19 Sep 2011 13:29:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/09/19/359022.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/359022.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/09/19/359022.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/359022.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/359022.html</trackback:ping><description><![CDATA[http://www.subversion.org.cn/svnbook/1.4/svn.branchmerge.commonuses.html<br /><div>http://www.vevepay.com/blog/?p=786</div><div>http://www.subversion.org.cn/svnbook/1.4/svn.branchmerge.commonuses.html</div><div>http://panweizeng.com/svn-branching-merging.html</div><br /><div><div><h1>Linux下subversion分支合并</h1></div><div clearfix=""><p>将svn的分支合并到主干的操作不是很麻烦，但是网上的文章大部分都写的比较复杂，而且抄来抄去，今天有同事问我怎么合并，在这里我顺便把步骤写下来吧，假设分支名称为：projectA/20110826，现在要合并到trunk上，步骤如下：</p><p>1）查询该分支创建时revision（在输出的最后一行，比如：1447）；<br />svn log &#8211;verbose &#8211;stop-on-copy http://192.168.x.x/svnrepos/project/branches/projectA/20110826</p><p>2）可以先演练一遍，看看有哪些冲突（HEAD表示trunk中的最新的revision）；<br />svn merge &#8211;dry-run -r1447:HEAD http://192.168.x.x/svnrepos/project/branches/projectA/20110826</p><p>3）觉得没什么大问题，可以开始正式合并了；<br />svn merge -r1447:HEAD http://192.168.x.x/svnrepos/project/branches/projectA/20110826</p><p>4）解决冲突，然后提交，合并完成。<br />svn commit -m &#8220;merge the branch projectA/20110826 to the trunk&#8221; .</p></div></div> <img src ="http://www.blogjava.net/jasmine214--love/aggbug/359022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-09-19 21:29 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/09/19/359022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】持续集成工具</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/08/17/356730.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Wed, 17 Aug 2011 09:40:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/08/17/356730.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/356730.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/08/17/356730.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/356730.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/356730.html</trackback:ping><description><![CDATA[<div><p>引言</p> <p>Thomas  Carlyle说：&#8220;人类是使用工具的动物。没有工具，人什么都不是；有了工具，人无所不能。&#8221;金融家们创造了复杂的金融工具，并利用这些工具制造了财富 神话，制造了著名的跨国公司，也制造了世界范围的危机。软件精英们为了让自己的工作效率更高，有更多时间去做想做的事，也创造了各式各样的工具。持续集成 已经不是一个新概念，在这个概念发展的十多年间，出现了支持这一概念的众多工具。这些工具的组合使用，为软件开发提供了强大的支持。</p> <p>持续集成工具的分类和功能</p> <p>一般来说，持续集成工具可以分成两大类：自动化构建工具和构建计划安排工具。</p> <p>自动化构建工具有这样一些基本功能：代码编译、组件打包、程序执行和文件操作。编译源代码是构建的主要工作之一，为了提高效率，编译应该根据相应的 源代码是否发生改变而有条件地执行。组件打包是将编译的结果和其他需要包含的文件组织在一起，形成可以部署的组件。构建工具应该知道何时需要重新打包。程 序执行是指构建工具能够在它支持的平台上，调用所有提供命令行接口的程序。构建工具应该支持创建、拷贝、删除文件和目录等操作。</p> <p>某些自动化构建工具还有一些扩展功能：执行开发者测试、版本控制工具集成、文档集成、部署功能、代码品质分析、支持扩展、多平台构建、加速构建。虽 然构建工具可以通过命令行执行的方式来集成构建工具和测试工具，但如果它提供更直接的集成方式，开发者就更省力。同样，如果构建工具能够直接与版本控制工 具集成，开发者也会觉得更方便。文档集成是指构建工具能够自动从源代码中抽取并生成API文档。构建工具还可以将打包好的组件自动部署到目标测试环境中 去。构建工具一般通过一些第三方插件，支持对代码品质进行分析。而提供插件接口，是构建工具实现可扩展性的通用方式。如果您开发的软件需要在多个平台上构 建并测试，那么构建工具对多平台的支持就会带来极大的方便。对于较大的代码集，一次构建可能需要好几个小时，这为持续集成带来了一些挑战。有的构建工具支 持加速构建，即在多个构建服务器的多个处理器上进行分布式构建。</p> <p>常见的自动化构建工具包括Ant、NAnt、MSBuild、make、Maven、Rake等。</p> <p>构建计划安排工具有这样一些基本功能：构建执行、版本控制集成、构建工具集成、提供反馈、为构建打上标签。构建计划安排工具的核心功能就是在特定时 间执行自动化的构建，这可以通过轮询版本控制库、计划驱动或事件通知等方式来实现。大部分构建计划安排工具都支持大多数流行的版本控制系统，也支持大多数 流行的构建工具。构建计划安排工具至少支持通过电子邮件提供反馈信息，有一些工具可以通过即时消息、手机短信或其他设备来提供反馈。大多数构建计划安排工 具会提供某种类型的升序计数，作为构建版本的标签。</p> <p>某些构建计划安排工具还有一些扩展功能：支持项目间依赖关系、提供用户界面、制品发布、安全。如果项目间存在依赖关系，您可能希望在被依赖的项目重 新构建时，重新构建依赖于它的项目。设计良好的用户界面会在工作时为您节约时间。制品发布是指除了得到可部署的组件之外，一些成熟的某些构建计划安排工具 可以将文档、测试结果、品质分析结构和其他测量指标数据格式化，便于查看。有一些工具提供了身份认证和授权等安全方面的功能，允许您指定谁能查看结果和修 改配置。</p> <p>常见的构建计划安排工具包括AnthillPro、Continuum、CruiseControl、CruiseControl.NET、Draco.NET、Luntbuild、Hudson等。</p> <p>下面介绍两个颇具代表性的工具：Ant和Hudson。</p> <p>Ant</p> <p>Ant是Java构建工具的事实标准，一般建议，不论项目团队成员使用哪种集成开发环境，项目都要有一个可以脱离IDE执行的Ant脚本。Ant采用插件式的设计结构，通过不同的插件来实现各种任务，其任务分类如表1所示。</p> <p>Archive Tasks<br />&nbsp;打包解包任务，支持的格式包括：BZip2、Cab、Ear、GZip、Jar、Rpm、Tar、War、Zip。<br />&nbsp;<br />Audit/Coverage Tasks<br />&nbsp;JDepend任务，调用JDepend实现代码静态分析，针对每个Java包生成设计品质指标数据。<br />&nbsp;<br />Compile Tasks<br />&nbsp;编译任务，实现对Java、JSP、NetRexx等源文件的编译。<br />&nbsp;<br />Deployment Tasks<br />&nbsp;部署任务，实现在JavaEE服务器上热部署。<br />&nbsp;<br />Documentation Tasks<br />&nbsp;文档生成任务，生成javadoc文档、Apache Stylebook文档。<br />&nbsp;<br />EJB Tasks<br />&nbsp;EJB任务，提供对1.x和2.x的EJB的支持，并支持不同供应商的应用服务器。<br />&nbsp;<br />Execution Tasks<br />&nbsp;执行任务，包括对子项目调用Ant、调用同一脚本中的另一个target、执行系统提供的命令行程序、执行Java程序、暂停和并行同步执行等功能。<br />&nbsp;<br />File Tasks<br />&nbsp;文件任务，实现对文件和目录的操作。<br />&nbsp;<br />Java2 Extensions Tasks<br />&nbsp;Java2 扩展信息任务，对jar包中的版本、供应商等扩展信息进行检查和操作。<br />&nbsp;<br />Logging Tasks<br />&nbsp;日志任务，将构建过程事件记录到文件中。<br />&nbsp;<br />Mail Tasks<br />&nbsp;邮件任务，发送SMTP邮件。<br />&nbsp;<br />Miscellaneous Tasks<br />&nbsp;其他任务，各种或许会用到的小任务，例如播放wav文件。<br />&nbsp;<br />.NET Tasks<br />&nbsp;.NET任务，支持执行.NET程序、执行NUnit测试、调用NAnt、调用MSBuild、调用WiX工具。<br />&nbsp;<br />Pre-process Tasks<br />&nbsp;预处理任务，实现编译之前的一些预处理。例如调用ANTLR、JavaCC、Native2Ascii等程序。<br />&nbsp;<br />Property Tasks<br />&nbsp;属性任务，对脚本中的属性变量进行判断和操作。<br />&nbsp;<br />Remote Tasks<br />&nbsp;远程任务，支持FTP、Rexec、Scp、SSH和Telnet。<br />&nbsp;<br />SCM Tasks<br />&nbsp;SCM任务，支持各种配置管理（版本控制）软件，包括CVS、ClearCase、Continuus、Visual SourceSafe、Perforce、PVCS、SourceOffSite和StarTeam。<br />&nbsp;<br />Testing Tasks<br />&nbsp;测试任务，支持执行JUnit测试。<br />&nbsp;<br />表1. Ant任务分类</p> <p>以上介绍的只是Ant发行版所带的一些任务。由于Ant采用的是插件结构，所以开发者可以开发自己需要的Ant任务，支持各种工具，如FindBugs、TestNG等其他代码检查工具和测试工具。早期的Ant没有很好的依赖关系支持，后来则通过Ivy弥补了这一缺点。</p> <p>关键是Ant为我们提供了一个跨平台的Java构建工具，为持续集成提供了根本的支持。对于Java开发者来说，如果不想采用Ant，也可以考虑采用Maven。</p> <p>Hudson</p> <p>Hudson是一个开放源代码的CI服务器，受到世界各地各种规模和类型的开发团队的欢迎。关键是因为它非常易于安装和使用，提供了灵活的配置方式和复杂的功能，同时支持Java项目和非Java项目，由强大的Hudson社区提供技术支持。</p> <p>简而言之，Hudson不仅仅是一个CI服务器，它的可扩展架构使它不仅是一个构建管理系统，也成为一个通用的开发生命周期管理系统，让开发者能够完成提升基线、打标签、执行工作流、根据依赖关系追踪变更、监视并图示测试结果、查看代码覆盖率和违反编码标准的情况等任务。</p> <p>Hudson是最活跃，成长最快的开源社区之一，目前每周下载达4000次，有超过2万个在工作的安装实例。它的开发者超过160人，贡献的工作量超过137人年，目前已发布了超过300个发行版本。Hudson实际上是现在世界上最受欢迎的开源CI服务器。</p> <p>图1是Apache软件基金会运行Hudson的屏幕截图，您可以在<a href="http://wiki.hudson-ci.org/display/HUDSON/Meet+Hudson">http://wiki.hudson-ci.org/display/HUDSON/Meet+Hudson</a> 看到更多Hudson的使用案例。</p> <p>图1. Apache运行的Hudson</p> <p>Huddon的主要优点包括：</p> <p>易于安装。只要执行&#8220;java &#8211;jar hudson.war&#8221;，或者将hudson.war部署到应用服务器上就可以了，不需要其他的安装工作，也不需要建立数据库。 <br />易于配置。所有东西都通过Web GUI界面来配置，不需要手工修改XML文件。 <br />支持分布式构建。Hudson支持将构建和测试负载分布到多台机器上，图2是Apache采用Hudson的分布式构建功能。 <br />支持环境配置矩阵。Hudson支持在不同的环境配置下执行相同的任务，例如不同的JDK版本、不同的操作系统、不同的数据库。执行的结果可以汇总在一起。 <br />支持JUnit/TestNG测试报告。测试的结果可以分标签列出、汇总，并与历史信息一同显示。历史趋势可以显示在图中。 <br />追踪依赖关系。Hudson追踪记录哪次构建生成了哪些jar，某次构建使用了哪些版本的jar，即使这些jar包来自于外部也可以。 </p> <p>图2. Hudson支持的分布式构建</p> <p>Hudson通过大量的插件来实现其丰富的功能，这些插件大致可以分为以下几类：</p> <p>SCM。Hudson缺省支持CVS和Subversion，通过安装插件支持Accurev、Bitkeeper、ClearCase、Git、Mercurial、Perforce、StarTeam、Synergy等 <br />构建触发器。可以通过IRC、Ivy、Jabber、Join、Locks and Latches、Navigator来触发执行构建。 <br />构 建工具。缺省支持Ant、Maven、shell s和Windows 批处理命令，通过安装插件支持batch  tasks、Gant、Gradle、Grails、Groovy、Jython、Kundo、MSBuild、Phing、Powershell、 Python、Rake、Ruby、SCons、SCTMExecutor,Selenium等。 <br />构建包装。对构建的方式进行一些控制，如并发 同步、启停虚拟机等。包括Hudson Centralized Job Action、Hudson Distributed Workspace  Clean、Locks and Latches、M2 Extra Steps、M2  Release、Release、VMware、Xvnc、Zen Timestamp等。 <br />构建通知。缺省支持电子邮件通知，通过插件支持 Campfire、Google Calendar、HudsonTracker (RSS  feeds)、IRC、Jabber、Nabaztag、SameTime、Status Monitor、The new  Emailer、TuxDroid、Twitter等。 <br />Slave启动和控制。缺省支持JNLP和命令行，通过插件支持SSH。 <br />构建 报告。缺省支持JUnit、javadoc和FindBugs，通过插件支持CCCC、Checkstyle、Clover、DRY、Emma、 Gallio、Gnat、Grinder、Japaex、JavaNCS、JavaTest Report、MSTest、N  Cover、NUint、Plot、PMD、PureCoverage、Ruby metrics、Selenium AES、Selenium  hq、Serenitec、SLOCCount、Task Scanner、Testability  Explorer、Violations、Warnings、WebTest Presenter等。图3是Sonar生成的项目报告的样例。 <br />集群管理/分布式构建。支持DistFork、Hadoop、PXE、Selenium、Swarm等。 <br />制品上传。支持FTP-Publisher、java.net uploader、SCP,SFEE、SVN等。 <br />身份认证和用户管理。支持操作审计追踪、LDAP、MySQL认证等。 </p> <p>图3. Sonar Dashboard</p> <p>结束语</p> <p>工欲善其事，必先利其器。人是工具的主宰。A fool with a tool is still a fool（傻子拿着工具还是傻子）。人们总是在学习工具、使用工具、创造更好的工具，以期提高工作的效率和品质。人要有智慧，工具要先进。</p></div>原文：http://www.blogjava.net/justuszhang2009/archive/2011/06/24/352182.html<div></div><img src ="http://www.blogjava.net/jasmine214--love/aggbug/356730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-08-17 17:40 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/08/17/356730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>window/fedora搭建hudson的过程记录（kiki整理）</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/07/23/354889.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Sat, 23 Jul 2011 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/07/23/354889.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/354889.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/07/23/354889.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/354889.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/354889.html</trackback:ping><description><![CDATA[<div>  <p><span style="font-family: 宋体;">【</span>windows OS<span style="font-family: 宋体;">系统下的：</span> Hudson<span style="font-family: 宋体;">环境搭建过程记录】</span></p>  <p>1. <span style="font-family: 宋体;">安装</span>jakarta-tomcat-5.0.30.exe, <span style="font-family: 宋体;">使用的</span>jdk<span style="font-family: 宋体;">（</span>C:\Program Files\Java\jdk1.6.0_14<span style="font-family: 宋体;">）。</span></p>  <p><span style="font-family: 宋体;">设置</span>HUDSON_HOME<span style="font-family: 宋体;">环境变量，按住</span>windows<span style="font-family: 宋体;">键</span>+Pause<span style="font-family: 宋体;">键快速出现环境变量设置界面。</span> </p>  <p>HUDSON_HOME=C:\hudson_ci\hudson</p>  <p>TOMCAT_HOME=C:\hudson_ci\Tomcat 5.0</p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JAVA_HOME=C:\Program Files\Java\jdk1.6.0_14</span></p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CALSSPATH=C:\ProgramFiles\Java\jdk1.6.0_14\lib\dt.jar;C:\ProgramFiles\Java\jdk1.6.0_14\lib\tools.jar</span></p>  <p>&nbsp;</p>  <p>2. hudson-2.0.0.war&nbsp;copy<span style="font-family: 宋体;">到</span>C:\hudson_ci\Tomcat 5.0\webapps<span style="font-family: 宋体;">目录。</span></p>  <p>&nbsp;</p>  <p>3. <span style="font-family: 宋体;">访问</span><a href="http://localhost:8080/hudson-2.0.0/">http://localhost:8080/hudson-2.0.0/</a><span style="font-family: 宋体;">出现</span>hudson web<span style="font-family: 宋体;">页面。</span></p>  <p>=============================================================</p>  <p><span style="font-family: 宋体;">【</span><span>linux (fedora)</span><span style="font-family: 宋体;">系统下</span>hudson<span style="font-family: 宋体;">搭建过程】</span></p>  <p>&nbsp;</p>  <p>1. fedora<span style="font-family: 宋体;">机器的一些信息</span></p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IP</span><span style="font-family: 宋体;">：</span>172.28.6.36<span style="font-family: 宋体;">（</span>7<span style="font-family: 宋体;">楼时）</span></p>  <p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PC</span><span style="font-family: 宋体;">账户：</span>root/123456</p>  <p>&nbsp;</p>  <p>2. <span style="font-family: 宋体;">安装</span>JDK <a href="http://zh.sourceforge.jp/frs/g_redir.php?m=jaist&amp;f=%2Fcrawlzilla%2Fother%2Fjdk-6u21-linux-i586-rpm.bin" target="_blank">jdk-6u21-linux-i586-rpm.bin</a> (JDK6)</p>  <p style="margin-left: 10.5pt;">(<span style="font-family: 宋体;">下载页面</span></p>  <p style="margin-left: 10.5pt;"><a href="http://zh.sourceforge.jp/projects/sfnet_crawlzilla/downloads/other/jdk-6u21-linux-i586-rpm.bin/">http://zh.sourceforge.jp/projects/sfnet_crawlzilla/downloads/other/jdk-6u21-linux-i586-rpm.bin/</a>)</p>  <p style="margin-left: 10.5pt;"><span style="font-family: 宋体;">执行：</span>./ jdk-6u21-linux-i586-rpm.bin</p>  <p style="margin-left: 10.5pt;">[root@localhost ~]# vim /etc/profile</p>  <p style="margin-left: 10.5pt;"><span style="font-family: 宋体;">在最下面加入如下内容</span></p>  <p style="margin-left: 10.5pt;"><span>JAVA_HOME=/usr/java/jdk1.6.0_21 #</span><span style="font-family: 宋体;">你的</span>jdk<span style="font-family: 宋体;">所在目录</span></p>  <p style="margin-left: 10.5pt;">PATH=$PATH:$JAVA_HOME/bin</p>  <p style="margin-left: 10.5pt;">CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar</p>  <p style="margin-left: 10.5pt;">export JAVA_HOME</p>  <p style="margin-left: 10.5pt;">export PATH</p>  <p style="margin-left: 10.5pt;">export CLASSPATH</p>  <p style="margin-left: 10.5pt;">&nbsp;</p>  <p style="margin-left: 10.5pt;">1) <span style="font-family: 宋体;">马上生效：</span></p>  <p style="margin-left: 10.5pt;">[root@localhost ~]# source /etc/profile</p>  <p style="margin-left: 10.5pt;">3<span style="font-family: 宋体;">）查看是否已生效</span></p>  <p style="margin-left: 31.5pt;">[root@localhost kikitest]# java -version</p>  <p style="margin-left: 31.5pt;">java version "1.6.0_21"</p>  <p style="margin-left: 31.5pt;">Java(TM) SE Runtime Environment (build 1.6.0_21-b06)</p>  <p style="margin-left: 31.5pt;">Java HotSpot(TM) Server VM (build 17.0-b16, mixed mode)</p>  <p>3. <span style="font-family: 宋体;">安装</span>Tomcat6</p>  <p style="margin-left: 21pt;">tar xzvf &nbsp;apache-tomcat-6.0.32.tar.gz</p>  <p>4. </p>  <p style="margin-left: 21pt;">PS:</p>  <p style="margin-left: 21pt;">1.<span style="font-family: 宋体;">）</span> <span style="font-family: 宋体;">之前试过</span>2<span style="font-family: 宋体;">次</span>jdk<span style="font-family: 宋体;">和</span>tomcat6<span style="font-family: 宋体;">都安装好的情况，每次浏览</span>hudson<span style="font-family: 宋体;">就出现内存泄露的情况，是因为</span>hudson-2.0.1.war<span style="font-family: 宋体;">和</span>hudson-2.0.0.war<span style="font-family: 宋体;">虽然在</span>windows<span style="font-family: 宋体;">环境访问</span>OK<span style="font-family: 宋体;">，但是在</span>fedora<span style="font-family: 宋体;">中不兼容，于是从</span>hudson<span style="font-family: 宋体;">官网下了个</span>hudson.war<span style="font-family: 宋体;">，部署到</span>webapps<span style="font-family: 宋体;">最终搞定。</span></p>  <p style="margin-left: 21pt;">2.<span style="font-family: 宋体;">）</span></p>  <p style="margin-left: 21pt;">yum list | grep tomcat<span>&nbsp;&nbsp;&nbsp; //</span><span style="font-family: 宋体;">列出</span>tomcat<span style="font-family: 宋体;">可安装包</span></p>  <p style="margin-left: 21pt;">yum -y install tomcat5<span>&nbsp;&nbsp; //</span><span style="font-family: 宋体;">安装</span>tomcat5</p>  <p style="margin-left: 21pt;">yum remove tomcat5<span>&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="font-family: 宋体;">卸载</span>tomcat5</p>  <p style="margin-left: 21pt;">yum remove java <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="font-family: 宋体;">卸载所有</span>JAVA</p>  <p style="margin-left: 21pt;">rpm &#8211;qa | grep jdk<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="font-family: 宋体;">查找</span>jdk</p>  <p style="margin-left: 10.5pt;"><span style="font-family: 宋体;">查看方法</span>:rpm &#8211;qa |grep &#8211;I java</p>  <p style="margin-left: 10.5pt;"><span style="font-family: 宋体;">卸载方法</span>:rpm &#8211;e &#8211;nodeps java*<span style="font-family: 宋体;">包名</span></p>  <p style="margin-left: 10.5pt;"><span style="font-family: 宋体;">将</span>jdk-6u21-linux-i586-rpm.bin<span style="font-family: 宋体;">给予可执行权限</span></p>  <p style="margin-left: 10.5pt;"><span style="font-family: 宋体;">修改权限：</span><span>chmod u+x jdk-6u21-linux-i586-rpm.bin</span></p>  <p style="margin-left: 21pt;">&nbsp;</p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p>&nbsp;</p>  </div><img src ="http://www.blogjava.net/jasmine214--love/aggbug/354889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-07-23 10:57 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/07/23/354889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SVN钩子集合-kiki整理</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/07/22/354874.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Fri, 22 Jul 2011 11:09:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/07/22/354874.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/354874.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/07/22/354874.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/354874.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/354874.html</trackback:ping><description><![CDATA[<div>  <p>SVN<span style="font-family: 宋体;">里的钩子脚本（</span>T&amp;W<span style="font-family: 宋体;">）</span></p>  <p><span style="font-family: 宋体;">【</span>post-commit<span style="font-family: 宋体;">】</span>S204<span style="font-family: 宋体;">提交之后邮件通知</span></p>  <p>#!/bin/sh</p>  <p>REPOS="$1"</p>  <p>REV="$2"</p>  <p>DOMAIN=twsh.com</p>  <p>PROJECTNAME=`basename $REPOS`</p>  <p>&nbsp;</p>  <p>/urr/local/ActivePerl/site/bin/svnnotify </p>  <p style="margin-left: 10.5pt;">--repos-path "$1" </p>  <p style="margin-left: 10.5pt;">--revision "$2" </p>  <p style="margin-left: 10.5pt;">--to $PROJECTNAME@$DOMAIN </p>  <p style="margin-left: 10.5pt;">--user-domain $DOMAIN </p>  <p style="margin-left: 10.5pt;">--smtp 10.58.100.8 </p>  <p style="margin-left: 10.5pt;">--smtp-user svn@twsh.com &#8211;</p>  <p style="margin-left: 10.5pt;">-smtp-pass 15021151553 </p>  <p style="margin-left: 10.5pt;">--subject-prefix [SVN:$PROJECTNAME] -g en_US </p>  <p style="margin-left: 10.5pt;">--handler "HTML::ColorDiff" </p>  <p style="margin-left: 10.5pt;">--with-diff </p>  <p style="margin-left: 10.5pt;">--diff-encoding GBK</p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">【</span>post-commit<span style="font-family: 宋体;">】</span>DSL<span style="font-family: 宋体;">库提交之后的邮件通知（</span>DSL<span style="font-family: 宋体;">是一个大库，里面包含很多小项目库）</span></p>  <p>.</p>  <p>#!/bin/sh</p>  <p>REPOS="$1"</p>  <p>REV="$2"</p>  <p>DOMAIN=twsh.com</p>  <p>PROJECTNAME=`basename $REPOS`</p>  <p>&nbsp;</p>  <p>PATHFILTER='4.02L.03_CT_BCM963293+TK3715_E8C_EPON\|Gewv2.3L19A-B2-V03'</p>  <p>SVNLOOK=/usr/bin/svnlook</p>  <p>&nbsp;</p>  <p><span>if ( $SVNLOOK dirs-changed -r $REV "$REPOS" | grep "$PATHFILTER" &gt; /dev/null ); then</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp; </span>/urr/local/ActivePerl/site/bin/svnnotify \</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>--repos-path "$REPOS" \</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>--revision "$REV" \</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>--to ponsw@twsh.com \</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>--user-domain $DOMAIN \</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>--smtp 10.58.100.8 \</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>--smtp-user svn@twsh.com \</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>--smtp-pass 15021151553 \</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>--subject-prefix [SVN:$PROJECTNAME] \</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>-g en_US \</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>--handler "HTML::ColorDiff" \</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>--with-diff \</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>--diff-encoding GBK</span></p>  <p>fi</p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">【</span>pre-commit<span style="font-family: 宋体;">】提交之前</span>LOG<span style="font-family: 宋体;">限制</span></p>  <p>#!/bin/sh</p>  <p>REPOS="$1"</p>  <p>TXN="$2"</p>  <p>&nbsp;</p>  <p>SVNLOOK=/usr/bin/svnlook</p>  <p>&nbsp;</p>  <p><span>if ( $SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" &gt; /dev/null ); then</span></p>  <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>exit 0;</span></p>  <p>fi</p>  <p>&nbsp;</p>  <p><span>echo "Empty log message not allowed. Commit aborted!" &gt;&amp;2</span></p>  <p>exit 1;</p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">【</span>pre-revprop-chang<span style="font-family: 宋体;">】实例验证过，可修改</span>:author and log message.</p>  <p>#!/bin/sh</p>  <p>REPOS="$1"</p>  <p>REV="$2"</p>  <p>USER="$3"</p>  <p>PROPNAME="$4"</p>  <p>ACTION="$5"</p>  </div><img src ="http://www.blogjava.net/jasmine214--love/aggbug/354874.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-07-22 19:09 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/07/22/354874.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SVN 基本的工作循环</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/06/13/352185.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Mon, 13 Jun 2011 06:21:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/06/13/352185.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/352185.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/06/13/352185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/352185.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/352185.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 基本的工作循环  Subversion有许多特性、选项和华而不实的高级功能，但日常的工作中你只使用其中的一小部分，在这一节里，我们会介绍许多你在日常工作中常用的命令。  典型的工作周期是这样的：  更新你的工作拷贝svn update 做出修改svn add svn delete svn copy svn move 检验修改svn status svn diff 可能会取消一些修改svn reve...&nbsp;&nbsp;<a href='http://www.blogjava.net/jasmine214--love/archive/2011/06/13/352185.html'>阅读全文</a><img src ="http://www.blogjava.net/jasmine214--love/aggbug/352185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-06-13 14:21 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/06/13/352185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Continuous integration with Hudson</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/05/16/350316.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Mon, 16 May 2011 05:54:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/05/16/350316.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/350316.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/05/16/350316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/350316.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/350316.html</trackback:ping><description><![CDATA[http://www.javaworld.com/javaworld/jw-12-2008/jw-12-hudson-ci.html?page=1<br />
<br />
<br />
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/350316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-05-16 13:54 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/05/16/350316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>做配置管理你需要那些知识？我的几年工作总结。 [转]</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/05/13/350199.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Fri, 13 May 2011 12:52:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/05/13/350199.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/350199.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/05/13/350199.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/350199.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/350199.html</trackback:ping><description><![CDATA[做配置管理你需要那些知识？<font style="font-size: 10px; color: #ffffff;">: k/ o3 Y6 g) j" ^0 z2 E) o( v9 L5 O</font><br />
我在做配置管理以前做过两年的测试，期间做过两家公司的iso 9000的内审员，然后老板觉得我比较有耐心，所以赶鸭子上架，和前任学习拉一周，我就是配置管理拉，然后不知不觉，已经6年拉，总结一下，看看会需要些什么呢？<br />
1、软件公司的开发流程，对软件工程一定要熟悉，尤其是开发模型，你不能保证公司的所有项目使用一个模型。比如：瀑布、迭代或者极限编程。只有熟悉这些开发模型，你才能参与到公司的流程制定中去。<br />
2、
熟悉一些标准，比如：iso
9000和cmmi。一个公司想要发展大，想要稳定，就一定会有一套稳定的流程。而熟悉标准，会更有利于你理解和说服你的同事。记得以前一个同事说过这样
一句话，一个公司想要长大，那一定必须是一头小象而不能是一只大蚂蚁。而一个做有流程，愿意将公司的事情流程化的公司才能保证不因人成事，才能长大。<font style="font-size: 10px; color: #ffffff;">. @5 "9 E: Q( L0 j1 ~</font><br />
3、沟通能力。配置管理员的工作就是沟通协助需求、开发及测试人员工作。而一个新的项目的建立意味这大家都是新人，来自不同的行业不同的公司，公司文化不
同，做事的方法也不同，你只有有好的沟通能力，才能说服项目经理支持你的工作，才只能说服开发测试人员按你要求的流程工作。<br />
4、编程能力。想做好配置管理，你就不得不编写一些配置脚本，以方便开发测试人员，同时减少自己的工作量。<br />
5、数据库知识。一般来说配置管理员，同时要管理BUG跟踪或需求管理的系统，那免不了老板会让你提供一些统计数据，所以数据库知识也是必不可少的。<br />
6、系统知识。多说公司的配置管理员还要负责开发测试环境的维护，那么有系统知识，无疑可以减少你求助的机会。<br />
现在说说我做过什么？<font style="font-size: 10px; color: #ffffff;">&amp; g! @2 `9 [: f+ ]5 g! z4 "/ f. q</font><br />
一、上海项目的时候，只是负责系统的配置管理，包括代码编译，上线，这个系统比较大，但是还好，我是从别人手上接手的，所以还在顺序。<br />
二、集团项目的的时候，我同时维护9个省的测试上线环境。<br />
由于用户一直是用unix系统，所以顺便学会拉shell ，学会来在ibm，hp，sun的小型机上安装配置软件。<br />
尤其是bes521的安装，简直是无言啊？宝
蓝从总部派人过来，现场安装，配置、测试，美国总部修改bug，然后打补丁，终于，我写了一本安装手册，两年后公司同事还在用。安装ibm的
websphere的时候，我发现需要打操作系统补丁，于是比较傻瓜的我，安装拉最新版的补丁，要命的是这个websphere比较变态，尽然只能用它指
定版本，所以到现在我都恨websphere啊。<br />
要说最大的收获，就是在压力下面，我做事情很负责，我的努力让公司项目经理面对甲方也很硬气。<font style="font-size: 10px; color: #ffffff;">! b&nbsp;&nbsp;^/ I7 E/ s" V</font><br />
三、做公司的openboss系统。这个系统对我的锻炼很大，工作如下：<font style="font-size: 10px; color: #ffffff;">/ d2 ?% d/ f1 K&amp; d0 Y) I</font><br />
1、写cvs脚本，保证代码能在提交的时候,同时建立开发和构建分支，同时不能是分支之上建立分支。<br />
2、和一个没有任何配置管理经验的开发团队扯皮，扯开发流程，扯目录结构，扯Makefile模板，扯代码命名规范，然后想办法让他们执行。<font style="font-size: 10px; color: #ffffff;">9 U1 J- G8 r0 ^2 D% i+ N6 Z</font><br />
这个系统很大，到今天，已经有11个移动，3个网通，3个电信在使用。分出来的系统现在也有15个拉，仅仅营业和账务两个系统，unix后台就有500多个动态库，当时扯皮，现在受益。<br />
3、和总工办
一起搞unix主机下的编译选项，由于用户的环境复杂，所以要求做到，代码写出来后，可以跨cpu，跨操作系统、跨中间件、跨数据库。所以这个过程让我对
unix下的编译器熟悉起来，不然无法做到。让我自豪的是到现在，开发人员只要修改Makefile模板很少的地方，就可以跨平台编译拉。<br />
4、编写自动编译脚本。通过我们开发的自动编译系统，开发人员只要在浏览器中提交编译单就可以自动编译拉。而如果开始的时候，如果没有将目录规划好，我想自动编译就是无源之水。<font style="font-size: 10px; color: #ffffff;">6 H&amp; H1 ?% b; n5 N</font><br />
这个系统我们web部分用jsp，unix用tcl/tk脚本。现在已经集成到QCS的源码管理中，还在改进，还在使用。<font style="font-size: 10px; color: #ffffff;">7 r) H# K. ~- i6 r</font><br />
<br />
四、公司的QCS系统（质量控制系统）。<br />
这是一个配置管理系统，通过rsh将CVS和QCS结合在一起，用jsp和oracle的存储过程开发，其中包括：需求管理、功能点管理、任务管理、源码管理、bug管理、工程故障管理、接口管理、数据库变更管理、版本管理、发布管理、回退管理等模块的系统。<font style="font-size: 10px; color: #ffffff;">2 z( T! {' a7 c* J: A0 v" M</font><br />
<br />
五、参加公司的EPG小组，并且以配置管理员的身份参与评审。<font style="font-size: 10px; color: #ffffff;">+ E* F) S&nbsp;&nbsp;j( B' |# F# u&nbsp;&nbsp;^</font><br />
公司两年前已经通过CMMI 5的认证。我加入公司的公司只是通过拉CMM
2级。后来由于甲方的要求，公司开始CMMI的认证。这中间有大量的文档要写。尤其是配置管理员，在几乎所有的过程中，都要参与评审，所以准备工作做拉好
久。到 CMMI
5级的时候，就要提供大量的统计数据来说明持续改进的结果，所以对QCS就需要不少地方做改动，来收集数据。还好公司一直注意这块，我们的各种脚本，模
板，都是尽量的优化以满足开发测试人员的需要。所以后来的评审中基本没有费什么事就过拉。<font style="font-size: 10px; color: #ffffff;">* G6 J3 w5 "# z</font><br />
<font style="font-size: 10px; color: #ffffff;">( [" N- P( V% F4 "$ d, `</font><br />
在这个项目中，让我对配置管理中的很多概念理解很深。尤其是在评审的时候，将自己平时做的工作用CMMI的语言讲解，感觉的确是锻炼人。<br />
<font style="font-size: 10px; color: #ffffff;">- a% k3 H% s/ Q5 S# ^, |+ T</font><br />
这中间的很多事情，我的感谢我的师傅，虽然他比我年龄还小，而且也没有带我很久，但是很多问题都是和他讨论中加深理解的，不管是从技术上，还是为人都让我学之不尽啊。<br />
<font style="font-size: 10px; color: #ffffff;">1 h( "&nbsp;&nbsp;C) "8 r&nbsp;&nbsp;t- @7 C</font><br />
要做好配置管理，一定要耐心、细心、恒心。<br />
冰冻三尺非一日之寒。<font style="font-size: 10px; color: #ffffff;">, H3 N' z: f+ I&nbsp;&nbsp;y' V) K</font><br />
<font style="font-size: 10px; color: #ffffff;">* j; V, r: J* w, x; P9 p! ]</font><br />
希望以上内容能给新入行的同行一点帮助。<br />
原文：<br />
<h1><a href="http://bbs.scmlife.com/thread-16353-1-1.html" id="thread_subject">http://bbs.scmlife.com/thread-16353-1-1.html<font style="font-size: 10px; color: #ffffff;"> k/ o3 Y6 g) j" ^0 z2 E) o( v9 L5 O</font><br />
我在做配置管理以前做过两年的测试，期间做过两家公司的iso 9000的内审员，然后老板觉得我比较有耐心，所以赶鸭子上架，和前任学习拉一周，我就是配置管理拉，然后不知不觉，已经6年拉，总结一下，看看会需要些什么呢？<br />
1、软件公司的开发流程，对软件工程一定要熟悉，尤其是开发模型，你不能保证公司的所有项目使用一个模型。比如：瀑布、迭代或者极限编程。只有熟悉这些开发模型，你才能参与到公司的流程制定中去。<br />
2、
熟悉一些标准，比如：iso
9000和cmmi。一个公司想要发展大，想要稳定，就一定会有一套稳定的流程。而熟悉标准，会更有利于你理解和说服你的同事。记得以前一个同事说过这样
一句话，一个公司想要长大，那一定必须是一头小象而不能是一只大蚂蚁。而一个做有流程，愿意将公司的事情流程化的公司才能保证不因人成事，才能长大。<font style="font-size: 10px; color: #ffffff;">. @5 "9 E: Q( L0 j1 ~</font><br />
3、沟通能力。配置管理员的工作就是沟通协助需求、开发及测试人员工作。而一个新的项目的建立意味这大家都是新人，来自不同的行业不同的公司，公司文化不
同，做事的方法也不同，你只有有好的沟通能力，才能说服项目经理支持你的工作，才只能说服开发测试人员按你要求的流程工作。<br />
4、编程能力。想做好配置管理，你就不得不编写一些配置脚本，以方便开发测试人员，同时减少自己的工作量。<br />
5、数据库知识。一般来说配置管理员，同时要管理BUG跟踪或需求管理的系统，那免不了老板会让你提供一些统计数据，所以数据库知识也是必不可少的。<br />
6、系统知识。多说公司的配置管理员还要负责开发测试环境的维护，那么有系统知识，无疑可以减少你求助的机会。<br />
现在说说我做过什么？<font style="font-size: 10px; color: #ffffff;">&amp; g! @2 `9 [: f+ ]5 g! z4 "/ f. q</font><br />
一、上海项目的时候，只是负责系统的配置管理，包括代码编译，上线，这个系统比较大，但是还好，我是从别人手上接手的，所以还在顺序。<br />
二、集团项目的的时候，我同时维护9个省的测试上线环境。<br />
由于用户一直是用unix系统，所以顺便学会拉shell ，学会来在ibm，hp，sun的小型机上安装配置软件。<br />
尤其是bes521的安装，简直是无言啊？宝
蓝从总部派人过来，现场安装，配置、测试，美国总部修改bug，然后打补丁，终于，我写了一本安装手册，两年后公司同事还在用。安装ibm的
websphere的时候，我发现需要打操作系统补丁，于是比较傻瓜的我，安装拉最新版的补丁，要命的是这个websphere比较变态，尽然只能用它指
定版本，所以到现在我都恨websphere啊。<br />
要说最大的收获，就是在压力下面，我做事情很负责，我的努力让公司项目经理面对甲方也很硬气。<font style="font-size: 10px; color: #ffffff;">! b&nbsp;&nbsp;^/ I7 E/ s" V</font><br />
三、做公司的openboss系统。这个系统对我的锻炼很大，工作如下：<font style="font-size: 10px; color: #ffffff;">/ d2 ?% d/ f1 K&amp; d0 Y) I</font><br />
1、写cvs脚本，保证代码能在提交的时候,同时建立开发和构建分支，同时不能是分支之上建立分支。<br />
2、和一个没有任何配置管理经验的开发团队扯皮，扯开发流程，扯目录结构，扯Makefile模板，扯代码命名规范，然后想办法让他们执行。<font style="font-size: 10px; color: #ffffff;">9 U1 J- G8 r0 ^2 D% i+ N6 Z</font><br />
这个系统很大，到今天，已经有11个移动，3个网通，3个电信在使用。分出来的系统现在也有15个拉，仅仅营业和账务两个系统，unix后台就有500多个动态库，当时扯皮，现在受益。<br />
3、和总工办
一起搞unix主机下的编译选项，由于用户的环境复杂，所以要求做到，代码写出来后，可以跨cpu，跨操作系统、跨中间件、跨数据库。所以这个过程让我对
unix下的编译器熟悉起来，不然无法做到。让我自豪的是到现在，开发人员只要修改Makefile模板很少的地方，就可以跨平台编译拉。<br />
4、编写自动编译脚本。通过我们开发的自动编译系统，开发人员只要在浏览器中提交编译单就可以自动编译拉。而如果开始的时候，如果没有将目录规划好，我想自动编译就是无源之水。<font style="font-size: 10px; color: #ffffff;">6 H&amp; H1 ?% b; n5 N</font><br />
这个系统我们web部分用jsp，unix用tcl/tk脚本。现在已经集成到QCS的源码管理中，还在改进，还在使用。<font style="font-size: 10px; color: #ffffff;">7 r) H# K. ~- i6 r</font><br />
<br />
四、公司的QCS系统（质量控制系统）。<br />
这是一个配置管理系统，通过rsh将CVS和QCS结合在一起，用jsp和oracle的存储过程开发，其中包括：需求管理、功能点管理、任务管理、源码管理、bug管理、工程故障管理、接口管理、数据库变更管理、版本管理、发布管理、回退管理等模块的系统。<font style="font-size: 10px; color: #ffffff;">2 z( T! {' a7 c* J: A0 v" M</font><br />
<br />
五、参加公司的EPG小组，并且以配置管理员的身份参与评审。<font style="font-size: 10px; color: #ffffff;">+ E* F) S&nbsp;&nbsp;j( B' |# F# u&nbsp;&nbsp;^</font><br />
公司两年前已经通过CMMI 5的认证。我加入公司的公司只是通过拉CMM
2级。后来由于甲方的要求，公司开始CMMI的认证。这中间有大量的文档要写。尤其是配置管理员，在几乎所有的过程中，都要参与评审，所以准备工作做拉好
久。到 CMMI
5级的时候，就要提供大量的统计数据来说明持续改进的结果，所以对QCS就需要不少地方做改动，来收集数据。还好公司一直注意这块，我们的各种脚本，模
板，都是尽量的优化以满足开发测试人员的需要。所以后来的评审中基本没有费什么事就过拉。<font style="font-size: 10px; color: #ffffff;">* G6 J3 w5 "# z</font><br />
<font style="font-size: 10px; color: #ffffff;">( [" N- P( V% F4 "$ d, `</font><br />
在这个项目中，让我对配置管理中的很多概念理解很深。尤其是在评审的时候，将自己平时做的工作用CMMI的语言讲解，感觉的确是锻炼人。<br />
<font style="font-size: 10px; color: #ffffff;">- a% k3 H% s/ Q5 S# ^, |+ T</font><br />
这中间的很多事情，我的感谢我的师傅，虽然他比我年龄还小，而且也没有带我很久，但是很多问题都是和他讨论中加深理解的，不管是从技术上，还是为人都让我学之不尽啊。<br />
<font style="font-size: 10px; color: #ffffff;">1 h( "&nbsp;&nbsp;C) "8 r&nbsp;&nbsp;t- @7 C</font><br />
要做好配置管理，一定要耐心、细心、恒心。<br />
冰冻三尺非一日之寒。<font style="font-size: 10px; color: #ffffff;">, H3 N' z: f+ I&nbsp;&nbsp;y' V) K</font><br />
<font style="font-size: 10px; color: #ffffff;">* j; V, r: J* w, x; P9 p! ]</font><br />
希望以上内容能给新入行的同行一点帮助。<br />
原文：<br />
<h1><a href="http://bbs.scmlife.com/thread-16353-1-1.html" id="thread_subject"><br />
</a>
</h1>
<br />
</a>
</h1>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/350199.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-05-13 20:52 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/05/13/350199.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我关于自动编译的一点经验 [转] 	</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/05/13/350197.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Fri, 13 May 2011 12:44:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/05/13/350197.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/350197.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/05/13/350197.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/350197.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/350197.html</trackback:ping><description><![CDATA[<!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><!--[if !mso]>
<style>
st1":*{behavior:url(#ieooui) }
</style>
<![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
<p><span style="font-family: 宋体;">原文：http://bbs.scmlife.com/thread-16603-1-1.html<br />
</span></p>
<p><span style="font-family: 宋体;">一个项目想要成功，那配置管理的努力是必不可少的。如何做一个好的配置管理，同时减轻自己的负担，那就是一个值得认真思考的问题拉。</span><span style="font-size: 7.5pt; color: white;">+ Z, Z7 d1 W/ J/ e) Q0 A* O1 J# i+ X</span><span><br />
</span><span style="font-family: 宋体;">一个产品想要实现持续集成及日创建，那么非得有一套好的自动编译系统支撑才可以，否则对于一个庞大的系统而言，一个配置管理就算累死也无法满足需求的。</span><span><br />
</span><span style="font-family: 宋体;">下面以我的经验说说任何构建一个自动编译系统。</span><span><br />
</span><span style="font-size: 7.5pt; color: white;">$ E( i$ {4 U: N</span><span><br />
</span><span style="font-family: 宋体;">为了更好的自动编译，我想应该建立一个这样的系统，那就是：</span><span><br />
1</span><span style="font-family: 宋体;">、开发人员或定时触发。</span><span><br />
2</span><span style="font-family: 宋体;">、自动更新编译环境。</span><span style="font-size: 7.5pt; color: white;">- P$ e; s&nbsp;&nbsp;`% ^" c* U2 A0 L</span><span><br />
3</span><span style="font-family: 宋体;">、自动编译。</span><span><br />
<span style="display: none;">( b: C$ m* F&nbsp;&nbsp;t: W9
w&nbsp;&nbsp;l</span>4</span><span style="font-family: 宋体;">、自动分析编译结果。</span><span style="font-size: 7.5pt; color: white;">. U5 A! [6 X4 h6 Z2 ]+ |4 V9 v</span><span><br />
5</span><span style="font-family: 宋体;">、自动通知开发、测试及配置管理员。</span><span style="font-size: 7.5pt; color: white;">$ C+ ~9 h&amp; D! y4 m" c% d</span><span><br />
<br />
</span><span style="font-family: 宋体;">下面我假设情况如下：</span><span><br />
1</span><span style="font-family: 宋体;">、操作系统：平台包括：</span>HP-UX<span style="font-family: 宋体;">、</span>SunOS<span style="font-family: 宋体;">、</span>AIX<span style="font-family: 宋体;">、</span>Linux <span style="font-family: 宋体;">、</span>Windows <span style="font-family: 宋体;">（均包括多个版本）、。</span><span style="font-size: 7.5pt; color: white;">&nbsp;&nbsp;M! c$ t9 ": k</span><span><br />
2</span><span style="font-family: 宋体;">、数据库包括：</span><span>oracle
8i</span><span style="font-family: 宋体;">、</span>9i<span style="font-family: 宋体;">、</span>10G<br />
3<span style="font-family: 宋体;">、编译器包括：</span>aCC<span style="font-family: 宋体;">、</span>CC<span style="font-family: 宋体;">、</span>xlC<span style="font-family: 宋体;">、</span>gcc<span style="font-family: 宋体;">、</span>bcb(windows <span style="font-family: 宋体;">上的集成开发环境</span>) <span style="font-family: 宋体;">、</span>java<span style="font-family: 宋体;">（包括多个版本）</span><span style="font-size: 7.5pt; color: white;">/ R" N3 J* F$ "% L- R, D' b</span><span><br />
4</span><span style="font-family: 宋体;">、项目规模超过千万行代码、模块众多、调用复杂。</span><span style="font-size: 7.5pt; color: white;"># H! A# y: "8 J% f7 C, G! j" `( E</span><span><br />
</span><span style="font-family: 宋体;">那么在这样一个情况下，如果我们考虑用一般的商用工具做，显然成本是很高的。</span><span style="font-size: 7.5pt; color: white;">0 y; l( I* Y: x</span><span><br />
</span><span style="font-family: 宋体;">对于这样一个庞大，复杂的系统，我想在项目启动后，首先要做的是：</span><span><br />
1</span><span style="font-family: 宋体;">、定义编码规范。</span><span style="font-size: 7.5pt; color: white;">0 L</span><span style="font-size: 7.5pt; color: white;"># S* D9 |' y2 @3 @1 G&nbsp;&nbsp;h</span><span><br />
2</span><span style="font-family: 宋体;">、定义</span>C++<span style="font-family: 宋体;">及</span>java<span style="font-family: 宋体;">的编译选项（由于</span>C++<span style="font-family: 宋体;">语言中编译器及平台版本不同，</span>32<span style="font-family: 宋体;">、</span>64<span style="font-family: 宋体;">位要求及数据库的版本等不同要求，所以编译选项显然要提取出来单独处理）。</span><span><br />
3</span><span style="font-family: 宋体;">、定义</span>Makefile <span style="font-family: 宋体;">规范。</span><span><br />
4</span><span style="font-family: 宋体;">、定义模块目录结构。</span><span><br />
5</span><span style="font-family: 宋体;">、定义接口提供方式。</span><span><br />
<span style="display: none;">4 C( J&nbsp;&nbsp;w$ v1 n*
_&nbsp;&nbsp;{, {+ m</span></span><span style="font-family: 宋体;">在定义以上内容的时</span> <span style="font-family: 宋体;">候，一定要遵循一个原则，符合命名规范、尽量可配置、易懂、易于理解。最后组合出的编译命令的字符串不要太长（</span>unix<span style="font-family: 宋体;">操作系统下，不同版本的</span><span>shell
</span><span style="font-family: 宋体;">对一个命令的长度有不同要求、同时由于</span>Makefile<span style="font-family: 宋体;">中如果有很多</span>shell <span style="font-family: 宋体;">脚本的话，编译性能也会受影响）。</span><span style="font-size: 7.5pt; color: white;">3 U&amp; P* h8 Q6 x&amp; A8 E+ P</span><span><br />
</span><span style="font-family: 宋体;">在我用过的系统中，</span>make <span style="font-family: 宋体;">工具，</span>unix <span style="font-family: 宋体;">平台我们使用的是</span> GNU make <span style="font-family: 宋体;">版本</span>3.80<span style="font-family: 宋体;">，</span>java <span style="font-family: 宋体;">用的是</span> ant<span style="font-family: 宋体;">，</span>windows <span style="font-family: 宋体;">平台</span>C++<span style="font-family: 宋体;">用的是</span>bcb <span style="font-family: 宋体;">自带的</span>make<span style="font-family: 宋体;">，不过在编译前先要将</span>bcb<span style="font-family: 宋体;">的工程文件</span>bpr<span style="font-family: 宋体;">文件转换为</span>Makefile<span style="font-family: 宋体;">文件，使用的工具是</span>bpr2make<span style="font-family: 宋体;">（之所以不用</span>bcb<span style="font-family: 宋体;">直接编译，</span> <span style="font-family: 宋体;">主要是为拉自动编译，自动分发编译结果）。</span><span><br />
</span><span style="font-size: 7.5pt; color: white;">2 [3 `" W; x% d- O</span><span><br />
</span><span style="font-family: 宋体;">为了更好的跟踪代码及需求、</span>bug<span style="font-family: 宋体;">变更情况，自动编译系统，应该从开发人员提交代码开始，到发布结束。</span><span style="font-size: 7.5pt; color: white;">( W- J% J4 O4 O/ E, a" m% s</span><span><br />
</span><span style="font-family: 宋体;">流程如下：</span><span style="font-size: 7.5pt; color: white;">( V+ t: ~4 G+ }3 V* e' H; G8 ": k</span><span><br />
1</span><span style="font-family: 宋体;">、开发人员提交代码。</span><span><br />
2</span><span style="font-family: 宋体;">、编译脚本触发，从版本库更新代码到编译服务器。</span><span><br />
3</span><span style="font-family: 宋体;">、设置编译需要的环境变量。</span><span><br />
4</span><span style="font-family: 宋体;">、构造编译需要的</span>Makefile<span style="font-family: 宋体;">。</span><span style="font-size: 7.5pt; color: white;">6
z% i( G5 ~. U2 l( q#
I3 ^+ z9 ~</span><span><br />
5</span><span style="font-family: 宋体;">、执行编译。</span><span><br />
6</span><span style="font-family: 宋体;">、分析编译结果、记录编译结果。</span><span style="font-size: 7.5pt; color: white;">* N2 |9 P5 d% i: N. L</span><span><br />
7</span><span style="font-family: 宋体;">、发邮件通知开发、配置管理、测试人员等相关人。</span><span style="font-size: 7.5pt; color: white;"># k5 |$ u9 ]2 `1 L2 ]0 I</span><span><br />
8</span><span style="font-family: 宋体;">、更新到测试环境测试。</span><span style="font-size: 7.5pt; color: white;">&nbsp;&nbsp;t, {9 D4 y3 ?7 v( Y5 q8 H- @</span><span><br />
9</span><span style="font-family: 宋体;">、配置管理员发布。</span><span><br />
</span><span style="font-size: 7.5pt; color: white;">2 ]2 b# _: ]5 q5 S# G! S* F</span><span><br />
</span><span style="font-family: 宋体;">下面我以</span>cvs<span style="font-family: 宋体;">或</span>svn<span style="font-family: 宋体;">为源码版本库做作说明，需要写一些适当的脚本，并且需要数据库的配合才能工作的比较顺利。</span><span><br />
1</span><span style="font-family: 宋体;">、建议用户表</span><span><br />
<span style="display: none;">( z&nbsp;&nbsp;q&nbsp;&nbsp;O: |- F0 R6
r</span>2</span><span style="font-family: 宋体;">、在数据库中建立产品表。</span><span><br />
3</span><span style="font-family: 宋体;">、在数据库中建立模块表（需要记录模块优先级、模块路径、</span>Makefile <span style="font-family: 宋体;">文件的名称等功能）。</span><span style="font-size: 7.5pt; color: white;">/ w* n9 y' D3 y3 R( L3 u9 x</span><span><br />
4</span><span style="font-family: 宋体;">、建立需求表、任务单表、</span>bug<span style="font-family: 宋体;">表、编译记录表。</span><span style="font-size: 7.5pt; color: white;">, s' t5 N4 m5 L&amp; t) N- Q* X* [</span><span><br />
5</span><span style="font-family: 宋体;">、编写代码提交脚本。实现提交代码的同时，在编译记录表中增加记录，并关联需求单、任务单、</span>BUG<span style="font-family: 宋体;">单功能。</span><span style="font-size: 7.5pt; color: white;">3 O+ N0 n3 e2 p' f</span><span><br />
6</span><span style="font-family: 宋体;">、编写自动编译脚本。实现定时查询数据库，根据编译单，进行编译的功能。需要实现，获取编译单后，自动生成编译环境所需的环境变量，构造编译用</span> Makefile<span style="font-family: 宋体;">，更新待编译代码，编译完成后分析编译结果，给被编译代码打</span>tag<span style="font-family: 宋体;">，获取编译结果的特征串，然后记录到数据库中，并发邮件通知开发人员、</span>
<span style="font-family: 宋体;">测试人员及配置管理人员。</span><span><br />
<br />
</span><span style="font-family: 宋体;">如果以上脚本实现，那么，不管你是要日创建还是随时编译，还是全系统编译，都是轻松的事情拉。</span><span><br />
</span><span style="font-family: 宋体;">虽然</span>windows <span style="font-family: 宋体;">平台和</span>unix <span style="font-family: 宋体;">平台差别很大，</span>c++<span style="font-family: 宋体;">和</span>java<span style="font-family: 宋体;">的差异也很大，但是如果大家将以上要求都用函数实现。我想迁移还是很方便的。</span><span style="font-size: 7.5pt; color: white;">1 t" v+ t&nbsp;&nbsp;U' U*
`" N% ~. L</span><span><br />
</span><span style="font-family: 宋体;">尤其是脚本语言，多数是支持跨平台的。</span><span><br />
<span style="display: none;">2 _* W: V3 t/ Q0 _0 C' q/ k" @) j)
T&amp; m</span></span><span style="font-family: 宋体;">这里主要可能碰到的问题是。</span><span style="font-size: 7.5pt; color: white;">7 r8 O- u! R2 t6 B% @</span><span><br />
1</span><span style="font-family: 宋体;">、模块结构规划不合理。</span><span><br />
<span style="display: none;">: ?# j&nbsp;&nbsp;z: ?' |* g. |0 w. T*
E9 n&nbsp;&nbsp;m</span>2</span><span style="font-family: 宋体;">、公共调用文件的安装问题。</span><span><br />
3</span><span style="font-family: 宋体;">、模块编译顺序的问题。对于复杂的系统，那么调用关系就决定了编译顺序，可能要多次调整。</span><span><br />
4</span><span style="font-family: 宋体;">、编译结果的安装问题。最好是编译完成通知测试人员，让他们自己安装。否则你自动杀掉他们正在测试的进程，他们会找你算账的。</span><span style="font-size: 7.5pt; color: white;">( k/ |( ?$ e' {$ T: q</span><span><br />
5</span><span style="font-family: 宋体;">、编译结果的分析问题。编译结果的分析就需要自己写正则表达式来分析日志了，级联编译中是无法通过失败信号获取编译失败的，只能分析日志。</span><span><br />
6</span><span style="font-family: 宋体;">、邮件发送问题。</span>unix <span style="font-family: 宋体;">平台，配置好</span>DNS<span style="font-family: 宋体;">和</span>sendmail<span style="font-family: 宋体;">就好啦，</span>windows<span style="font-family: 宋体;">平台，如果没有找到你所用脚本语言的邮件发送函数，那么你就的自己用</span><span>telnet
</span><span style="font-family: 宋体;">加</span> smtp <span style="font-family: 宋体;">协议实现拉。</span><span style="font-size: 7.5pt; color: white;">- h5 F!
e" h1 R3 N% F5 e</span><span><br />
<br />
<span style="display: none;">6 `! g" j" Q- l$ f, U8 ^) W0
@# y# y</span></span><span style="font-family: 宋体;">可能有人奇怪我为什么要设计一个数据出来，我想如果有数据库的话，方便维护人员根据编译目标文件的特征串，查找出，这是那一次编译的，生成他的源码有那些，具体版本是什么。</span><span style="font-size: 7.5pt; color: white;">/ n3 i&amp; _+ p9 n5 N) V&amp;
D&nbsp;&nbsp;w</span><span><br />
</span><span style="font-family: 宋体;">同时也可以查找出是为那个需求或</span>BUG<span style="font-family: 宋体;">而修改代码的，修改了那些地方等。同时也可以通过数据库统计，分析出，模块代码的变更情况和工作量，进度等。</span><span style="font-size: 7.5pt; color: white;">8 W/ |; s&amp; w&amp; x* v( |</span><span><br />
</span><span style="font-family: 宋体;">同时也可以分析出那些人老是提交错，经常容易犯那些错误，编译流程改进，作为</span>cmmi 5<span style="font-family: 宋体;">级的数据提供。</span><span style="font-size: 7.5pt; color: white;">1 P/ e5 r$ D8 u0 j7 x' q' R0 ?</span><span><br />
</span><span style="font-family: 宋体;">拉拉杂杂写啦一大堆，希望对大家有用。</span></p>
<p><span style="font-family: 宋体;">看到论坛里面有很多人询问，工具的选择和使用问题。个人建议：如果没有采购的想法。那么我建议使用</span>SVN<span style="font-family: 宋体;">做版本管理工具。理由如下：</span><span><br />
</span><span style="font-family: 宋体;">一、</span>SVN<span style="font-family: 宋体;">的开发团队就是当初</span>CVS<span style="font-family: 宋体;">的开发团队。</span><span style="font-size: 7.5pt; color: white;">( q3 "9 K- W( V" O* i/ n/ S" D</span><span><br />
1</span><span style="font-family: 宋体;">、正式由于</span>CVS<span style="font-family: 宋体;">的很多缺陷，所以才放弃</span>CVS<span style="font-family: 宋体;">，改开发</span>SVN<span style="font-family: 宋体;">的。</span><span><br />
2</span><span style="font-family: 宋体;">、</span>CVS<span style="font-family: 宋体;">以后只会修改</span>BUG<span style="font-family: 宋体;">，不会在出新功能拉。</span><span><br />
3</span><span style="font-family: 宋体;">、</span>CVS<span style="font-family: 宋体;">的权限功能很不完全，犹如鸡肋。</span><span><br />
</span><span style="font-family: 宋体;">二、</span>SVN<span style="font-family: 宋体;">相对于</span>CVS<span style="font-family: 宋体;">有很多优点。</span><span style="font-size: 7.5pt; color: white;">) o+ p; C1 M3 f</span><span><br />
SVN</span><span style="font-family: 宋体;">的优点如下：</span><span><br />
1</span><span style="font-family: 宋体;">、天然支持</span>web<span style="font-family: 宋体;">。</span>SVN<span style="font-family: 宋体;">服务器是可以和</span>apache<span style="font-family: 宋体;">集成的，所以天然就支持</span>HTTP<span style="font-family: 宋体;">协议，就可以通过互联网访问，同时可以使用</span>apache<span style="font-family: 宋体;">的权限系统。而</span>CVS<span style="font-family: 宋体;">只能通过</span>CVSWEB<span style="font-family: 宋体;">来通过浏览器访问。</span><span style="font-size: 7.5pt; color: white;">4 ^1 h3 V2 ]0 P( Z# [&nbsp;&nbsp;q, `; "$ q</span><span><br />
2</span><span style="font-family: 宋体;">、</span>SVN<span style="font-family: 宋体;">支持文件的移动，支持文件的改名，支持目录版本。</span><span><br />
3</span><span style="font-family: 宋体;">、</span>SVN<span style="font-family: 宋体;">提供拉</span>API<span style="font-family: 宋体;">，提供拉各种语言的开发库，这个是</span>CVS<span style="font-family: 宋体;">所不支持的。</span>CVS<span style="font-family: 宋体;">的二次开发，只能通过命令行的方式做脚本，否则你就要在</span>CVS<span style="font-family: 宋体;">的</span>C<span style="font-family: 宋体;">代码中做接口，才能增加或修改功能。</span><span><br />
4</span><span style="font-family: 宋体;">、</span>SVN<span style="font-family: 宋体;">便于和自己开发的配置管理工具集成。原因如上。</span><span style="font-size: 7.5pt; color: white;">8 |3 g7 P&nbsp;&nbsp;o/ _</span><span><br />
5</span><span style="font-family: 宋体;">、</span>SVN<span style="font-family: 宋体;">可以通过</span>LDAP<span style="font-family: 宋体;">和公司的域结合起来，实现单点认证。</span><span><br />
</span><span style="font-family: 宋体;">三、相对于</span>CVS<span style="font-family: 宋体;">和</span>SVN<span style="font-family: 宋体;">，</span>VSS<span style="font-family: 宋体;">有几个个很大的缺点。</span><span><br />
1</span><span style="font-family: 宋体;">、</span>VSS<span style="font-family: 宋体;">是基于</span>CHECKOUT<span style="font-family: 宋体;">、锁模式的，而</span>SVN<span style="font-family: 宋体;">和</span>CVS<span style="font-family: 宋体;">及基于</span>CHECKOUT<span style="font-family: 宋体;">、合并模式的。后者显然更适合协同开发，适合多人修改同一份代码。而且作为配置管理员，也不用疲于奔命的去删除锁。</span><span><br />
2</span><span style="font-family: 宋体;">、</span>VSS<span style="font-family: 宋体;">只支持</span>windows<span style="font-family: 宋体;">平台，而</span>CVS<span style="font-family: 宋体;">和</span>SVN<span style="font-family: 宋体;">是跨平台的。也许一时无所谓，但是如果有一天公司转向类</span>unix<span style="font-family: 宋体;">平台，你就得迁移配置库，重新编写使用手册，并且做培训，为什么不把问题消灭在萌芽状态呢。</span><span style="font-size: 7.5pt; color: white;">* }0 x4 `" `4 e2 `7 Q5 `% _</span><span><br />
3</span><span style="font-family: 宋体;">、</span>VSS<span style="font-family: 宋体;">是要共享目录以便访问。这样在网络病毒猖獗的日子里，你就和病毒做斗争去吧。同时代码安全和是一个大问题啊。</span><span><br />
4</span><span style="font-family: 宋体;">、</span>VSS<span style="font-family: 宋体;">是不支持</span>web<span style="font-family: 宋体;">访问的。</span><span style="font-size: 7.5pt; color: white;">9 V5 b: _" E1 U# ?1 X" o</span><span><br />
5</span><span style="font-family: 宋体;">、权限配置也不够友好。</span><span style="font-size: 7.5pt; color: white;">" S. y$ J, X8</span></p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/350197.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-05-13 20:44 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/05/13/350197.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Git历险记（四）——索引与提交的幕后故事</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/05/11/350012.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Wed, 11 May 2011 06:58:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/05/11/350012.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/350012.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/05/11/350012.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/350012.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/350012.html</trackback:ping><description><![CDATA[<h2>不一样的索引</h2>
<p>我想如果看过<a href="http://www.infoq.com/cn/git-adventures">《Git历险记》的前面三篇文章</a>的朋友可能已经知道怎么用<a href="http://www.kernel.org/pub/software/scm/git/docs/git-add.html">git add</a>，<a href="http://www.kernel.org/pub/software/scm/git/docs/git-commit.html">git commit</a>这两个命令了；知道它们一个是把文件暂存到索引中为下一次提交做准备，一个创建新的提交（commit）。但是它们台前幕后的一些有趣的细节大家不一定知晓，请允许我一一道来。</p>
<p>Git 索引是一个在你的工作目录（working tree）和项目仓库间的暂存区域(staging area)。有了它,
你可以把许多内容的修改一起提交(commit)。 如果你创建了一个提交(commit)，那么提交的一般是暂存区里的内容,
而不是工作目录中的内容。</p>
<p>一个Git项目中文件的状态大概分成下面的两大类，而第二大类又分为三小类：</p>
<ol>
    <li>未被跟踪的文件（untracked file）</li>
    <li>已被跟踪的文件（tracked file）
    <ol>
        <li>被修改但未被暂存的文件（changed but not updated或modified）</li>
        <li>已暂存可以被提交的文件（changes to be committed 或staged）</li>
        <li>自上次提交以来，未修改的文件(clean 或 unmodified)</li>
    </ol>
    </li>
</ol>
<p>看到上面的这么多的规则，大家早就头大了吧。老办法，我们建一个Git测试项目来试验一下：</p>
<p>我们先来建一个空的项目：</p>
<pre>$rm -rf stage_proj<br />
$mkdir stage_proj<br />
$cd stage_proj<br />
$git init<br />
Initialized empty Git repository in /home/test/work/test_stage_proj/.git/<br />
</pre>
<p>我们还创建一个内容是&#8220;hello, world&#8221;的文件：</p>
<pre>$echo "hello,world" &gt; readme.txt</pre>
<p>现在来看一下当前工作目录的状态，大家可以看到&#8220;readme.txt&#8221;处于未被跟踪的状态（untracked file）：</p>
<pre>$git status<br />
# On branch master<br />
#<br />
# Initial commit<br />
#<br />
# Untracked files:<br />
#&nbsp;&nbsp; (use "git add &lt;file&gt;..." to include in what will be committed)<br />
#<br />
#&nbsp;&nbsp; readme.txt<br />
nothing added to commit but untracked files present (use "git add" to track)<br />
</pre>
<p>把&#8220;readme.txt"加到暂存区： $git add readme.txt</p>
<p>现在再看一下当前工作目录的状态：</p>
<pre>$git status<br />
# On branch master<br />
#<br />
# Initial commit<br />
#<br />
# Changes to be committed:<br />
#&nbsp;&nbsp; (use "git rm --cached &lt;file&gt;..." to unstage)<br />
#<br />
#&nbsp;&nbsp; new file:&nbsp;&nbsp; readme.txt<br />
#<br />
</pre>
<p>可以看到现在"readme.txt"的状态变成了已暂存可以被提交（changes to be committed），这意味着我们下一步可以直接执行&#8220;git commit&#8220;把这个文件提交到本地的仓库里去了。</p>
<p>暂存区（staging
area）一般存放在&#8220;git目录&#8220;下的index文件（.git/index）中，所以我们把暂存区有时也叫作索引（index）。索引是一个二进制格
式的文件，里面存放了与当前暂存内容相关的信息，包括暂存的文件名、文件内容的SHA1哈希串值和文件访问权限，整个索引文件的内容以暂存的文件名进行排
序保存的。</p>
<p>但是我不想马上就把文件提交，我想看一下暂存区（staging area）里的内容，我们执行<a href="http://www.kernel.org/pub/software/scm/git/docs/git-ls-files.html">git ls-files</a>命令看一下：</p>
<pre>$git ls-files --stage<br />
100644 2d832d9044c698081e59c322d5a2a459da546469 0&nbsp;&nbsp; readme.txt<br />
</pre>
<p>我们如果有看过<a href="http://www.infoq.com/cn/news/2011/02/git-adventures-local-repository">上一篇文章</a>里
的"庖丁解牛",
你会发现&#8220;git目录&#8220;里多出了&#8221;.git/objects/2d/832d9044c698081e59c322d5a2a459da546469&#8221;这
么一个文件，再执行&#8220;git cat-file -p 2d832d&#8221;
的话，就可以看到里面的内容正是&#8220;hello,world"。Git在把一个文件添加暂存区时，不但把它在索引文件(.git/index)里挂了号，而
且把它的内容先保存到了&#8220;git目录&#8220;里面去了。</p>
<p>如果我们执行&#8221;git add&#8220;命令时不小心把不需要的文件也加入到暂存区中话，可以执行&#8220;git rm --cached filename" 来把误添加的文件从暂存区中移除。</p>
<p>现在我们先在"readme.txt"文件上做一些修改后：</p>
<pre>$echo "hello,world2" &gt;&gt; readme.txt</pre>
<p>再来看一下暂存区的变化:</p>
<pre>$git status<br />
# On branch master<br />
#<br />
# Initial commit<br />
#<br />
# Changes to be committed:<br />
#&nbsp;&nbsp; (use "git rm --cached &lt;file&gt;..." to unstage)<br />
#<br />
#&nbsp;&nbsp; new file:&nbsp;&nbsp; readme.txt<br />
#<br />
# Changed but not updated:<br />
#&nbsp;&nbsp; (use "git add &lt;file&gt;..." to update what will be committed)<br />
#&nbsp;&nbsp; (use "git checkout -- &lt;file&gt;..." to discard changes in working directory)<br />
#<br />
#&nbsp;&nbsp; modified:&nbsp;&nbsp; readme.txt<br />
#</pre>
<p>大家可以看到命令输出里多了一块内容：&#8220;changed but not updated ...... modified:
readme.txt&#8221;。大家可能会觉得很奇怪，我前面不是把"readme.txt"这个文件给添加到暂存区里去了吗，这里怎么又提示我未添加到暂存区
（changed but not updated）呢，是不是Git搞错了呀。</p>
<p>Git 没有错，每次执行&#8220;git
add&#8221;添加文件到暂存区时，它都会把文件内容进行SHA1哈希运算，在索引文件中新加一项，再把文件内容存放到本地的&#8220;git目录&#8220;里。如果在上次执行
&#8220;git add&#8221;之后再对文件的内容进行了修改，那么在执行&#8220;git
status&#8221;命令时，Git会对文件内容进行SHA1哈希运算就会发现文件又被修改了，这时&#8220;readme.txt&#8220;就同时呈现了两个状态：被修改但未
被暂存的文件（changed but not updated），已暂存可以被提交的文件（changes to be
committed）。如果我们这时提交的话，就是只会提交第一次&#8220;git add"所以暂存的文件内容。</p>
<p>我现在对于&#8220;hello,world2"的这个修改不是很满意，想要撤消这个修改，可以执行<a href="http://www.kernel.org/pub/software/scm/git/docs/git-checkout.html">git checkout</a>这个命令：</p>
<pre>$git checkout -- readme.txt</pre>
<p>现在再来看一下仓库里工作目录的状态：</p>
<pre>$git status<br />
# On branch master<br />
#<br />
# Initial commit<br />
#<br />
# Changes to be committed:<br />
#&nbsp;&nbsp; (use "git rm --cached &lt;file&gt;..." to unstage)<br />
#<br />
#&nbsp;&nbsp; new file:&nbsp;&nbsp; readme.txt<br />
#</pre>
<p>好的，现在项目恢复到我想要的状态了，下面我就用<a href="http://www.kernel.org/pub/software/scm/git/docs/git-commit.html">git commit</a> 命令把这个修改提交了吧：</p>
<pre>$git commit -m "project init"<br />
[master (root-commit) 6cdae57] project init&nbsp;&nbsp; 1 files changed, 1 insertions(+), 0 deletions(-)&nbsp;&nbsp;&nbsp; create mode 100644 readme.txt<br />
</pre>
<p>现在我们再来看一下工作目录的状态：</p>
<pre>$git status<br />
# On branch master<br />
nothing to commit (working directory clean)</pre>
<p>大家可以看到&#8220;nothing to commit (working directory clean)&#8221;；如果一个工作树（working
tree）中所有的修改都已提交到了当前分支里（current head），那么就说它是干净的（clean），反之它就是脏的(dirty)。</p>
<h2>SHA1值内容寻址</h2>
<p>正如<a href="http://www.advogato.org/person/apenwarr/diary/371.html">Git is the next Unix</a>
一文中所说的一样，Git是一种全新的使用数据的方式（Git is a totally new way to operate on
data）。Git把它所管理的所有对象（blob，tree，commit，tag&#8230;&#8230;），全部根据它们的内容生成SHA1哈希串值作为对象名；根据目
前的数学知识，如果两块数据的SHA1哈希串值相等，那么我们就可以认为这两块数据是相同 的。这样会带来的几个好处：</p>
<ol>
    <li>Git只要比较对象名，就可以很快的判断两个对象的内容是否相同。</li>
    <li>因为在每个仓库（repository）的&#8220;对象名&#8221;的计算方法都完全一样，如果同样的内容存在两个不同的仓库中，就会存在相同的&#8220;对象名&#8221;。</li>
    <li>Git还可以通过检查对象内容的SHA1的哈希值和&#8220;对象名&#8221;是否匹配，来判断对象内容是否正确。</li>
</ol>
<p>我们通过下面的例子，来验证上面所说的是否属实。现在创建一个和&#8220;readme.txt&#8220;内容完全相同的文件&#8221;readme2.txt&#8220;，然后再把它提交到本地仓库中：</p>
<pre>$echo "hello,world" &gt; readme2.txt<br />
$git add readme2.txt<br />
$git commit -m "add new file: readme2.txt"<br />
[master 6200c2c] add new file: readme2.txt<br />
1 files changed, 1 insertions(+), 0 deletions(-)<br />
create mode 100644 readme2.txt<br />
</pre>
<p>下面的这条很复杂的命令是查看当前的提交（HEAD）所包含的blob对象：</p>
<pre>$git cat-file -p HEAD | head -n 1 | cut -b6-15 | xargs git cat-file -p<br />
100644 blob 2d832d9044c698081e59c322d5a2a459da546469&nbsp;&nbsp;&nbsp; readme.txt<br />
100644 blob 2d832d9044c698081e59c322d5a2a459da546469&nbsp;&nbsp;&nbsp; readme2.txt</pre>
<p>我们再来看看上一次提交（HEAD^）所包含的blob对象：</p>
<pre>$git cat-file -p HEAD^ | head -n 1 | cut -b6-15 | xargs git cat-file -p<br />
100644 blob 2d832d9044c698081e59c322d5a2a459da546469&nbsp;&nbsp;&nbsp; readme.txt</pre>
<p>很明显大家看到尽管当前的提交比前一次多了一个文件，但是它们之间却是在共用同一个blob对象：&#8220;2d832d9&#8221;。</p>
<h2>No delta, just snapshot</h2>
<p>Git 与大部分你熟悉的版本控制系统，如Subversion、CVS、Perforce 之间的差别是很大的。传统系统使用的是：
&#8220;增量文件系统&#8221; （Delta Storage
systems），它们存储是每次提交之间的差异。而Git正好与之相反，它是保存的是每次提交的完整内容（snapshot）；它会在提交前根据要提交
的内容求SHA1哈希串值作为对象名，看仓库内是否有相同的对象，如果没有就将在&#8220;.git/objects"目录创建对应的对象，如果有就会重用已有的
对象，以节约空间。</p>
<p>下面我们来试验一下Git是否真的是以&#8220;snapshot&#8221;方式保存提交的内容。</p>
<p>先修改一下"readme.txt"，给里面加点内容，再把它暂存，最后提交到本地仓库中：</p>
<pre>$echo "hello,world2" &gt;&gt; readme.txt<br />
$git add readme.txt<br />
$git commit -m "add new content for readme.txt"<br />
[master c26c2e7] add new content for readme.txt&nbsp;&nbsp; 1 files changed, 1 insertions(+), 0 deletions(-)</pre>
<p>我们现在看看当前版本所包含的blob对象有哪些：</p>
<pre>$git cat-file -p HEAD | head -n 1 | cut -b6-15 | xargs git cat-file -p<br />
100644 blob 2e4e85a61968db0c9ac294f76de70575a62822e1&nbsp;&nbsp;&nbsp; readme.txt<br />
100644 blob 2d832d9044c698081e59c322d5a2a459da546469&nbsp;&nbsp;&nbsp; readme2.txt</pre>
<p>从上面的命令输出，我们可以看到"readme.txt"已经对应了一个新的blob对象：&#8220;2e4e85a&#8221;，而之前版本的"readme.txt&#8220;对应的blob对象是：&#8220;2d832d9&#8221;。下面我们再来看一看这两个&#8221;blob&#8220;里面的内容和我们的预期是否相同：</p>
<pre>$git cat-file -p 2e4e85a<br />
hello,world<br />
hello,world2<br />
$git cat-file -p 2d832d9<br />
hello,world</pre>
<p>大家可以看到，每一次提交的文件内容还是全部保存的（snapshot）。</p>
<h2>小结</h2>
<p>Git内在机制和其它传统的版本控制系统（VCS）间存在本质的差异，所以Git的里"add"操作的含义和其它VCS存在差别也不足为奇，&#8220;git add&#8220;不但能把未跟踪的文件（untracked file）添加到版本控制之下，也可以把修改了的文章暂存到索引中。</p>
<p>同时，由于采用&#8220;SHA1哈希串值内容寻值&#8220;和&#8221;快照存储（snapshot）&#8220;，让Git成为一个速度非常非常快的版本控制系统（VCS）。</p>
<h2>参考</h2>
<ul>
    <li><a href="http://book.git-scm.com/">GitCommunityBook</a><a href="http://gitbook.liuhui998.com/"> 中文版</a></li>
    <li><a href="http://progit.org/book/">ProGit</a><a href="http://progit.chunzi.me/zh"> 中文版</a></li>
</ul>
<h2>致谢</h2>
<p>感谢上帝对我的眷顾，让我可以有写作专栏的这样一个机会。</p>
<p>感谢朋友们在写作过程的无私帮助：<a href="http://www.infoq.com/cn/author/%E5%BC%A0%E5%87%AF%E5%B3%B0">张凯峰</a>，<a href="http://blog.liuw.name/">刘炜</a>，<a href="http://www.juvenxu.com/">许晓斌</a>，<a href="http://www.dbanotes.net/">Fenng&#8230;&#8230;</a></p>
<p>特别要感謝家人默默支持：）</p>
<p>原文：http://www.infoq.com/cn/news/2011/03/git-adventures-index-commit<br />
</p><img src ="http://www.blogjava.net/jasmine214--love/aggbug/350012.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-05-11 14:58 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/05/11/350012.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Git 历险记（三）——创建一个自己的本地仓库</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/05/11/349999.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Wed, 11 May 2011 02:56:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/05/11/349999.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/349999.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/05/11/349999.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/349999.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/349999.html</trackback:ping><description><![CDATA[<!--[if !mso]>

v":* {behavior:url(#default#VML);}
o":* {behavior:url(#default#VML);}
w":* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}

<![endif]--><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><!--[if !mso]>

st1":*{behavior:url(#ieooui) }

<![endif]--><!--[if gte mso 10]>

/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}

<![endif]-->
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">如果我们要把一个项目加入到Git的版本管理中，可以在项目所在的目录用<span><a href="http://www.google.com/url?q=http%3A%2F%2Fwww.kernel.org%2Fpub%2Fsoftware%2Fscm%2Fgit%2Fdocs%2Fgit-init.html&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNFDjD0EMwGOr9fmxxqsJuBxIn1gbQ">git
init</a></span>命令建立一个空的本地仓库，然后再用<span><a href="http://www.google.com/url?q=http%3A%2F%2Fwww.kernel.org%2Fpub%2Fsoftware%2Fscm%2Fgit%2Fdocs%2Fgit-add.html&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNHqz555w3br1EOt9FY9ev-ktCsr1Q">git
add</a></span>命令把它们都加入到Git本地仓库的暂存区（<span>stage
or index</span>）中，最后再用<span><a href="http://www.google.com/url?q=http%3A%2F%2Fwww.kernel.org%2Fpub%2Fsoftware%2Fscm%2Fgit%2Fdocs%2Fgit-commit.html&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNFIooWs08Q2yIFcgtDrUgD9Sa6ooQ">git
commit</a></span>命令提交到本地仓库里。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">创建一个新的项目目录，并生成一些简单的文件内容：</span></p>
<p style="text-align: left;" align="left"><strong><span style="font-size: 12pt; font-family: 宋体;">$ mkdir test_proj</span></strong></p>
<p style="text-align: left;" align="left"><strong><span style="font-size: 12pt; font-family: 宋体;">$ cd test_proj</span></strong></p>
<p style="text-align: left;" align="left"><strong><span style="font-size: 12pt; font-family: 宋体;">$ echo &#8220;hello,world&#8221; &gt; readme.txt</span></strong></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">在项目目录创建新的本地仓库，并把项目里的所有文件全部添加、提交到本地仓库中去：</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">$ git init #</span><span style="font-size: 12pt; font-family: 宋体;">在当前的目录下创建一个新的空的本地仓库</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Initialized empty Git repository in
/home/user/test_proj/.git/</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">$ git add . #</span><span style="font-size: 12pt; font-family: 宋体;">把前目录下的所有文件全部添加到暂存区</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">$ git commit -m 'project init' #</span><span style="font-size: 12pt; font-family: 宋体;">创建提交</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">[master (root-commit) b36a785] project init</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">1 files changed, 1 insertions(+), 0 deletions(-)</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">create mode 100644 readme.txt</span></p>
<p style="text-align: left;" align="left"><strong><span style="font-size: 18pt; font-family: 宋体;">Git</span></strong><strong><span style="font-size: 18pt; font-family: 宋体;">目录的结构</span></strong></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;"><a href="http://www.google.com/url?q=http%3A%2F%2Fwww.kernel.org%2Fpub%2Fsoftware%2Fscm%2Fgit%2Fdocs%2Fgit-init.html&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNFDjD0EMwGOr9fmxxqsJuBxIn1gbQ">git
init</a></span><span style="font-size: 12pt; font-family: 宋体;">命令在项目的顶层目录中建了一个名为：&#8220;.git&#8221;的目录，它的别名是 &#8220;Git目录&#8221;（<span>Git
directory</span>）。这时&#8221;Git目录&#8221;中虽然有一些文件，但是没有任何提交（commit）在里面，所以我们叫它是空仓库（empty Git repository）。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">和<span>
SVN</span>不同，一个Git项目一般只在项目的根目录下建一个&#8220;.git&#8221;目录，而SVN则会在项目的每一个目录下建一个&#8221;.svn&#8221;目录；这也我喜欢Git的原因之一：）</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Git</span><span style="font-size: 12pt; font-family: 宋体;">把所有的历史提交信息全部存储在&#8220;Git目录&#8221;里，它就是一个Git项目的仓库；你对本地的源代码进行编辑修改后创建的提交也都会先保存在这
里面，然后再推送到远端的服务器。当我们我把项目目录和&#8220;Git目录&#8221;一起拷到其它电脑里，它能马上正常的工作（所有的提交信息全都保存在Git目录 里）；甚至可以只把&#8220;Git目录&#8221;拷走也行，但是要再签出（checkout）一次。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Git</span><span style="font-size: 12pt; font-family: 宋体;">为了 调试的方便，它可以指定项目的Git目录的位置。有两种办法：一是设置&#8220;GIT_DIR&#8221;环境变量，二是在命令行里设定&#8220;--git-dir--git-dir&#8221;参数指定它的位置，大家可以看一下这里<span>(<a href="http://www.google.com/url?q=http%3A%2F%2Fwww.kernel.org%2Fpub%2Fsoftware%2Fscm%2Fgit%2Fdocs%2F&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNHWf-A8f_I0yQb_aiFQZrXvWN-fbw">git(1)
Manual Page</a>)</span>。</span></p>
<p style="text-align: left;" align="left"><strong><span style="font-size: 18pt; font-family: 宋体;">庖丁解牛</span></strong></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">前面的这些东东我在<a href="http://www.google.com/url?q=http%3A%2F%2Fwww.infoq.com%2Fcn%2Fnews%2F2011%2F01%2Fgit-adventures-1&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNEyNOhf4K7Bojpy-USGG665F0BBsw">第一篇</a>里也大概的讲过一些，但是今天我们想不但要开动这辆叫&#8220;Git&#8221;的跑车，还想看看它里面有些什么样的零件，是怎么构成的。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">OK</span><span style="font-size: 12pt; font-family: 宋体;">，我们来看看&#8220;test_proj&#8221;项目里的&#8220;Git目录&#8221;的结构：</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">$cd test_proj/.git </span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">$ ls | more </span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">branches/ # </span><span style="font-size: 12pt; font-family: 宋体;">新版的Git已经不再使用这个目录，所以大家看到它 #一般会是空的</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">COMMIT_EDITMSG # </span><span style="font-size: 12pt; font-family: 宋体;">保存着上一次提交时的注释信息</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">config # </span><span style="font-size: 12pt; font-family: 宋体;">项目的配置信息</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">description # </span><span style="font-size: 12pt; font-family: 宋体;">项目的描述信息</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">HEAD # </span><span style="font-size: 12pt; font-family: 宋体;">项目当前在哪个分支的信息</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">hooks/ # </span><span style="font-size: 12pt; font-family: 宋体;">默认的&#8220;hooks&#8221; 脚本文件</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">index # </span><span style="font-size: 12pt; font-family: 宋体;">索引文件，git add 后把要添加的项暂存到这里</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">info/ # </span><span style="font-size: 12pt; font-family: 宋体;">里面有一个exclude文件，指定本项目要忽略的文件 #，看一下这里</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">logs/ # </span><span style="font-size: 12pt; font-family: 宋体;">各个refs的历史信息</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">objects/ # </span><span style="font-size: 12pt; font-family: 宋体;">这个目录非常重要，里面存储都是Git的数据对象</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;"># </span><span style="font-size: 12pt; font-family: 宋体;">包括：提交(commits), 树对象(trees)，二进制对象 #（blobs）,标签对象（tags）。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">#</span><span style="font-size: 12pt; font-family: 宋体;">不明白没有关系，后面会讲的。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">refs/ # </span><span style="font-size: 12pt; font-family: 宋体;">标识着你的每个分支指向哪个提交（commit）。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">我先用<span><a href="http://www.google.com/url?q=http%3A%2F%2Fwww.kernel.org%2Fpub%2Fsoftware%2Fscm%2Fgit%2Fdocs%2Fgit-log.html&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNHGOF0PbZgg56SCNAUc6b8YcZ0HCw">git
log命令</a></span>来看一下这个Git项目里有哪些提交：</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">$ git log</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">commit 58b53cfe12a9625865159b6fcf2738b2f6774844</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Author: liuhui998 &lt;liuhui998@nospam.com&gt;</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Date: Sat Feb 19 18:10:08 2011 +0800</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">project init</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">大家可以看到目前只有一个提交（commit）对象，而它的名字就 是：&#8221;58b53cfe12a9625865159b6fcf2738b2f6774844&#8221;。这个名字就是对象内容的一个SHA签名串值，只要对象里面
的内容不同，那么我们就可以认为对象的名字不会相同，反之也成立。我在使用时一般不用把这个40个字符输全，只要把前面的5~8个字符输完就可以（前提是 和其它的对象名不冲突）。为了方便表示，在不影响表达的情况下，我会只写SHA串值的前6个字符。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">我们可以用<span><a href="http://www.google.com/url?q=http%3A%2F%2Fwww.kernel.org%2Fpub%2Fsoftware%2Fscm%2Fgit%2Fdocs%2Fgit-cat-file.html&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNEoC8gCO_c4b7cZ6sYxcs4tNQ2EEQ">git
cat-file</a></span>来看一下这个提交里的内容是什么:</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">$ git cat-file -p 58b53c </span></p>
<p style="text-align: left;" align="left"><strong><span style="font-size: 12pt; font-family: 宋体;">tree 2bb9f0c9dc5caa1fb10f9e0ccbb3a7003c8a0e13</span></strong></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">author liuhui998 &lt;liuhui998@nospam.com&gt; 1298110208
+0800</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">committer liuhui998 &lt;liuhui998@nospam.com&gt;
1298110208 +0800</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">project init</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">大家可以看到：提交&#8220;58b53c&#8221; 是引用一个名为&#8220;2bb9f0&#8221;的树对象（tree）。一个树对象（tree）可以引用一个或多个二进制对象（blob）, 每个二进制对象都对应一个文件。 更进一步, 树对象也可以引用其他的树对象，从而构成一个目录层次结构。我们再看一下这个树对象（tree）里面有什么东东：</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">$ git cat-file -p 2bb9f0</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">100644 <strong>blob 2d832d9044c698081e59c322d5a2a459da546469
readme.txt</strong></span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">不难看出，2bb9f0&#8221;这个树对象（tree）包括了了一个二进制对象（blob），对应于我们在前面创建的那个叫 &#8221;readme.txt&#8221;的文件。现在我们来看看这个&#8221;blob&#8221;里的数据是不是和前面的提交的内容一致：</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">$ git cat-file -p 2d832d</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">hello,world</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">哈哈，熟悉的&#8220;hello,world&#8221;又回来了。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">想不想看看提交对象、树对象和二进制对象是怎么在&#8221;Git目录&#8220;中存储的；没有问题，执行下面的命令，看看&#8221;.git/objects&#8221;目录里的内容：</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">$ find .git/objects</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">.git/objects</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">.git/objects/2b</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">.git/objects/<strong>2b/b9f0c9dc5caa1fb10f9e0ccbb3a7003c8a0e13</strong></span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">.git/objects/2d</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">.git/objects<strong>/2d/832d9044c698081e59c322d5a2a459da546469</strong></span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">.git/objects/58</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">.git/objects/<strong>58/b53cfe12a9625865159b6fcf2738b2f6774844</strong></span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">.git/objects/info</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">.git/objects/pack</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">如果大家仔细看上面命令执行结果中的粗体字，所有的对象都使用SHA签名串值作为索引存储在&#8221;.git/objects&#8221;目录之下；SHA串的前两个字符作为目录名，后面的38个字符作为文件名。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">这些文件的内容其实是压缩的数据外加一个标注类型和长度的头。类型可以是提交对象（commit）、二进制对象（blob）、 树对象（tree）或者标签对象（tag）。</span></p>
<p style="text-align: left;" align="left"><strong><span style="font-size: 18pt; font-family: 宋体;">如何clone一个远程项目</span></strong></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">我身边的很多朋友是因为要得到某个开源项目的代码，所以才开始学习使用Git。而获取一个项目的代码的一般的做法就是用<span><a href="http://www.google.com/url?q=http%3A%2F%2Fwww.kernel.org%2Fpub%2Fsoftware%2Fscm%2Fgit%2Fdocs%2Fgit-clone.html&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNH6iEjeR36XCbWHKGgsAFet6EA_og">git
clone</a></span>命令进行直接复制。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">例如，有些朋友可能想看一下最新的<a href="http://www.google.com/url?q=http%3A%2F%2Fgit.kernel.org%2F%3Fp%3Dlinux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git%3Ba%3Dsummary&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNFH3yns1QmLp-eP2iG75j_IfOnR5Q">linux内核源代码</a>，当我们打开它的<a href="http://www.google.com/url?q=http%3A%2F%2Fgit.kernel.org%2F%3Fp%3Dlinux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git%3Ba%3Dsummary&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNFH3yns1QmLp-eP2iG75j_IfOnR5Q">网站</a>时，发现有如下面的一段提示：</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">URL</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">URL</span><span style="font-size: 12pt; font-family: 宋体;">下面的三行字符串表示三个地址，我们可以通过这三个地址得到同样的一份Linux内核源代码。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">也就是说下面这三条命令最终得到的是同一份源代码：</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">git clone
http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">git cone
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">我们先来看一下URL，git://、http://、https://这些代表是传输git仓库的协议形式，而&#8220;<a href="http://www.google.com/url?q=http%3A%2F%2Fgit.kernel.org%2Fpub%2Fscm%2Flinux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNHMKd3sqQYTqxWfWCYHzntVAuXQCA">git.kernel.org</a>&#8220;则代表了Git仓库存储的服务器名字（域名），<span>&#8220;<a href="http://www.google.com/url?q=https%3A%2F%2Fgit.kernel.org%2Fpub%2Fscm%2Flinux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNF2MiBP8HaUZ0irlRK3_Ka-5XQ-eQ">/pub/scm/linux/kernel/git/torvalds/linux-2.6.git&#8221;</a>
</span>则代表了Git仓库在服务器上位置。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Git </span><span style="font-size: 12pt; font-family: 宋体;">仓库除了可以通过上面的</span><span style="font-size: 12pt; font-family: 宋体;">git</span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt; font-family: 宋体;">http</span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt; font-family: 宋体;">https</span><span style="font-size: 12pt; font-family: 宋体;">协议传输外还可以通过</span><span style="font-size: 12pt; font-family: 宋体;">ssh</span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt; font-family: 宋体;">ftp(s)</span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt; font-family: 宋体;">rsync</span><span style="font-size: 12pt; font-family: 宋体;">等协议来传输。<span><a href="http://www.google.com/url?q=http%3A%2F%2Fwww.kernel.org%2Fpub%2Fsoftware%2Fscm%2Fgit%2Fdocs%2Fgit-clone.html&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNH6iEjeR36XCbWHKGgsAFet6EA_og">git
clone</a></span>的本质就是把&#8220;Git目录&#8221;里面的内容拷贝过来，大家想想看，一般的&#8220;Git目录&#8221;里有成千上万的各种对象（提交对象，树对象，二进制对象......)，如果逐一复制的话，其效率就可想而知。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">如果通过git、ssh协议传输，服务器端会在传输前把需要传输的各种对象先打好包再进行传输；而http（s）协议则会反复请求要传输的不同对 象。如果仓库里面的提交不多的话，前者和后者的效率相差不多；但是若仓库里有很多提交的话，git、ssh协议进行传输则会更有效率。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">不过现在Git对http（s）协议传输Git仓库做了一定的优化，http（s）传输现在也能达到ssh协议的效率，有兴趣的朋友可以看一下这里（<span><a href="http://www.google.com/url?q=http%3A%2F%2Fprogit.org%2F2010%2F03%2F04%2Fsmart-http.html&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNH3nDvNOr6JXlew6_A3otOmOTRfXw">Smart
HTTP Transport</a></span>）。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">好的，现在我们执行了下面这条命令，把linux-2.6的最新版源代码clone下来：</span></p>
<p style="text-align: left;" align="left"><strong><span style="font-size: 12pt; font-family: 宋体;">$cd ~/</span></strong></p>
<p style="text-align: left;" align="left"><strong><span style="font-size: 12pt; font-family: 宋体;">$mkdir temp</span></strong></p>
<p style="text-align: left;" align="left"><strong><span style="font-size: 12pt; font-family: 宋体;">$git clone
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git</span></strong></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Initialized empty Git repository in
/home/liuhui/temp/linux-2.6/.git/</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">remote: Counting objects: 1889189, done.</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">remote: Compressing objects: 100% (303141/303141), done.</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Receiving objects: 100% (1889189/1889189), 385.03 MiB |
1.64 MiB/s, done.</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">remote: Total 1889189 (delta 1570491), reused 1887756
(delta 1569178)</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Resolving deltas: 100% (1570491/1570491), done.</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Checking out files: 100% (35867/35867), done.</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">当我们执行了<span>&#8220;git clone
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git&#8221;</span>这条命令后大家可以看到这条输出：</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Initialized empty Git repository in
/home/user/temp/linux-2.6/.git/</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">这就是意味着我们在本地先建了一个&#8220;linux-2.6&#8221;目录，然后在这个目录建了一个空的Git本地仓库（Git目录）；里面将会存储从网上拉下来的历史提交。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">下面两条输入代表服务器现在调用<span><a href="http://www.google.com/url?q=http%3A%2F%2Fgit-pack-objects%2F&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNFejHf4TiO1wTav6c-SWWSSTWLhNQ">
git-pack-objects</a> </span>对它的仓库进行打包和压缩：</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">remote: Counting objects: 1888686, done.</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">remote: Compressing objects: 100% (302932/302932), done.</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">然后客户端接收服务器端发过送过来的数据：</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Receiving objects: 100% (1889189/1889189), 385.03 MiB |
1.64 MiB/s, done.</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">在我们执行完上面的clone linux-2.6代码的的操作后，Git会从&#8220;Git目录&#8221;里把最新的代码到签出（checkout）到&#8220;linux-2.6&#8221;这个目录里面。我们一般
把本地的&#8220;linux-2.6&#8221;这个目录叫做&#8221;工作目录&#8220;（<span>work
directory</span>），它里面保存着你从其它地方clone（<span>or
checkout</span>）过来的代码。当你在项目的不同分支间切换时，&#8220;工作目录&#8221;中的文件可能会被替换或者删除；&#8220;工作目录&#8221;只是保存着当前的工作，你可以修 改里面文件的内容直到下次提交为止。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">大家还记得前面的&#8220;庖丁解牛&#8221;吗，是不是觉得只杀一头叫&#8220;hello,world&#8221;的小牛太不过瘾了。没有问题，拿起前面的那把小刀，来剖析一下现在躺在你硬盘里这头叫&#8220;linux-2.6&#8221;大牛看看，我想一定很好玩。</span></p>
<div style="text-align: center;" align="center"><span style="font-size: 12pt; font-family: 宋体;">
<hr width="100%" align="center" size="2" />
</span></div>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">在写篇文章的过程中，我要感谢在那些关心我并提出真诚意见的朋友，如果没有你们真诚的意见，我也许没有这么强烈的紧迫感，也不会深深的感到自己的不足。我是第一次写专栏，<a href="http://www.infoq.com/cn/bycategory.action?authorName=%E5%BC%A0%E5%87%AF%E9%94%8B">张凯锋</a>同学给了我很大的帮助。最后还是要感谢我的家人，是他们让我有时间来进行写作：）</span></p>
<p style="text-align: left;" align="left">原文：http://www.infoq.com/cn/news/2011/02/git-adventures-local-repository<br />
</p><img src ="http://www.blogjava.net/jasmine214--love/aggbug/349999.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-05-11 10:56 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/05/11/349999.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Git历险记（二）——Git的安装和配置（转）</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/05/11/349992.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Wed, 11 May 2011 02:26:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/05/11/349992.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/349992.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/05/11/349992.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/349992.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/349992.html</trackback:ping><description><![CDATA[<p>各位同学，上回<a href="http://www.infoq.com/cn/news/2011/01/git-adventures-1">Git历险记（一）</a>讲了一个 &#8220;hello Git&#8221; 的小故事。有的同学可能是玩过了其它分布式版本控制系统（DVCS），看完之后就触类旁通对Git就了然于胸了；也有的同学可能还如我当初入手Git一样，对它还是摸不着头脑。</p>
<p>从这一篇开始，我就将比较&#8220;啰嗦&#8221;的和大家一起从零开始经历Git使用的每一步，当然对我而言这也是一个重新认识Git的过程。</p>
<p>使用Git的第一步肯定是安装Git，因为在多数平台上Git是没有预装的。我平时主要的工作环境是windows和Linux（ubuntu），我想看这篇文章的同学多半也是在这两个平台下工作；下面我讲一下如何在这两个平台下安装和配置Git。</p>
<p>BTW:如果是苹果平台的用户的安装可以参看一下这里(<a href="http://gitbook.liuhui998.com/2_1.html">1</a>,<a href="http://progit.chunzi.me/zh/ch1-4.html">2</a>)，配置和命令行的使用与windows、Linux（*nix）平台差别不大。</p>
<h3><strong>Linux (*nix) 平台</strong></h3>
<p>Linus开发Git的最初目的就是为了开发Linux内核服务的，自然它对Linux的平台支持也是最棒的。在Linux下安装Git大约有几种方法：</p>
<p><strong>从源代码开始(这种方法也适合于多数*nix平台)</strong></p>
<p>从<a href="http://git-scm.com/">Git官网</a>的<a href="http://git-scm.com/download">下载页面</a>下载它最新稳定版的<a href="http://kernel.org/pub/software/scm/git/git-1.7.3.5.tar.bz2">源代码</a>，就可以从源代码开始编译、安装：</p>
<pre>$ wget http://kernel.org/pub/software/scm/git/git-1.7.3.5.tar.bz2<br />
$ tar -xjvf git-1.7.3.5.tar.bz2<br />
$ cd git-1.7.3.5<br />
$ make prefix=/usr all ;# prefix设置你的Git安装目录<br />
$ sudo make prefix=/usr install ;# 以root权限运行<br />
</pre>
<p>为了编译Git的源代码，我们还需要一些库: <a href="http://expat.sourceforge.net/">expat</a>、<a href="http://curl.linux-mirror.org/">curl</a>、 <a href="http://www.zlib.net/">zlib</a> 和 <a href="http://www.openssl.org/">openssl</a>； 除了expat 外，其它的库可能在你的机器上都安装了。</p>
<p><strong>使用安装包管理器（apt 或 yum）</strong></p>
<p>在 fedora 等系统下用<a href="http://fedoraproject.org/wiki/Tools/yum">yum</a> ：</p>
<pre>$ yum install git-core </pre>
<p>在debian, ubuntu等系统下用<a href="http://en.wikipedia.org/wiki/Advanced_Packaging_Tool">apt</a> ：</p>
<pre>$ apt-get install git-core</pre>
<p>有时候，你系统里的安装包管理器出现了问题，或是要安装Git的机器不能上网、没有编译器的话，你可以从下面的站点去下载 &#8220;.deb&#8221; 或 &#8220;.rpm&#8221;的安装包：</p>
<ul>
    <li><a href="http://kernel.org/pub/software/scm/git/RPMS/">RPM Packages</a></li>
    <li><a href="http://www.backports.org/debian/pool/main/g/git-core/">Stable Debs</a></li>
</ul>
<h3><strong>Windows平台</strong></h3>
<p>windows平台有两个模拟*nix like运行环境的工具：<a href="http://www.cygwin.com/">cygwin</a>，<a href="http://www.mingw.org/wiki/MSYS">msys</a>；Git在<a href="http://www.cygwin.com/">cygwin</a>，<a href="http://www.mingw.org/wiki/MSYS">msys</a>下都有相应的移植版本。我个人觉得msys平台下的<a href="http://code.google.com/p/msysgit/">msysGit</a>最好用，现在我在windows下也是用的这个版本。</p>
<p>很多同学可能要问，现在windows下有那多Git用户，为什么Git不直接出一个windows native版。俺当年翻看了一下<a href="http://www.kernel.org/pub/software/scm/git/git-0.01.tar.bz2">Git的源代码</a>，它里面使用了大量的*nix平台的native api，而这些api在windows下是没有的，所以必须要用cygwin、msys这样的一个中间层来满足软件移植的要求。</p>
<p>下面我&#8220;啰嗦&#8221;一下如何在windows下安装msysGit。</p>
<h3><strong>下载</strong></h3>
<p>到它的<a href="http://code.google.com/p/msysgit/downloads/list">下载页面</a>去下载一个最新的完整安装包，笔者在撰写本文时下载的是<a href="http://msysgit.googlecode.com/files/Git-1.7.3.1-preview20101002.exe">这个</a>。</p>
<h3><strong>安装</strong></h3>
<p>安装的过程没有什么好说的，一般是开始安装后，一路的点击&#8220;下一步&#8221;。由于windows平台的换行符（CRLF）和Linux(*nix)平台的换行符（LF）不同，那么在windows下开发其它平台软件的朋友有一个地方要注意（见下图)：</p>
<p><img _p="true" alt="" _href="img://image1.jpg" src="http://www.infoq.com/resource/news/2011/01/git-adventures-install-config/zh/resources/image1.JPG" border="0" /></p>
<p>在这里一最好选&#8220;Checkout as-is, commit as-is&#8221;这个选项，这样，Git就不会修改你代码的换行符风格。</p>
<p>以前有个朋友因为选错了这个选项，以致他在windows平台下的一签出（checkout）其它平台的代码，就会显示&#8221;已修改&#8220;（modified），不过后来可能msysGit也认识到这个问题了，就把默认选项改成了这个选项。</p>
<p>BTW: 其实前面两项也是有用的，如果对windows和Linux(*nix)平台<a href="http://en.wikipedia.org/wiki/Newline">如何处理换行符</a>很熟悉的话，也可以尝试一下前面两个选项：）</p>
<h2><strong>配置Git</strong></h2>
<p>在Linux下和windows下配置Git的方法差不多，只是在Linux下，可以在命令行里直接使用<a href="http://www.kernel.org/pub/software/scm/git/docs/git-config.html">git config</a>进行配置, 而在windows下则要先打开&#8220;Git Bash&#8221;，进入msysGit命令行界面，再用<a href="http://www.kernel.org/pub/software/scm/git/docs/git-config.html">git config</a>命令进行相应的配置操作。</p>
<p>好了，前面安装好了Git，现在我们开始配置：</p>
<p>第一个需要配置的就是用户的用户名和email，因为这些内容会出现在你的每一个提交（commit）里面的，像下面这样：</p>
<pre>$ git log #我们用git log查看当前仓库的提交（commit）日志<br />
commit 71948005382ff8e02dd8d5e8d2b4834428eece24<br />
Author: author &lt;author@corpmail.com&gt;<br />
Date: Thu Jan 20 12:58:05 2011 +0800<br />
Project init<br />
</pre>
<p>下面的这两行命令就是设置用户名和email：</p>
<pre>$ git config <strong>--global </strong>user.name author #将用户名设为author<br />
$ git config <strong>--global </strong>user.email author@corpmail.com #将用户邮箱设为author@corpmail.com<br />
</pre>
<p>Git的配置信息分为全局和项目两种，上面命令中带了&#8220;--global"参数，这就意味是在进行全局配置，它会影响本机上的每个一个Git项目。</p>
<p>大家看到，上面我们用的是@corpmail（公司邮箱）；但是有时候我们可能也参与了一些开源项目，那么就需要新的用户名和自己的私人邮箱，Git 可以为每个项目设定不同的配置信息。</p>
<p>在命令行环境，进入Git项目所在目录，执行下面的命令：</p>
<pre>$ git config　user.name nickname#将用户名设为nickname<br />
$ git config　user.email nickname@gmail.com #将用户邮箱设为nickname@gmail.com<br />
</pre>
<p>Git的设计哲学和Linux（*nix）一样，尽量的使用<a href="http://www.faqs.org/docs/artu/textualitychapter.html">&#8220;文本化&#8221;（Textuality）</a>；它里面尽量用文本化的形式存储信息，对于配置信息也更是如此，用户的这些配置信息全部是存储在文本文件中。Git的全局配置文件是存放在"~/.gitconfig"（用户目录下的.gitconfig）文件中：</p>
<p>我们用cat、head命令查看全局配置信息文件，并假设相关配置信息存储在文件的前3行（当然也有可能不在前3行，这里只是为了方便表示）</p>
<pre>$ cat ~/.gitconfig | head -3 <br />
[user]<br />
name = author<br />
email = author@corpmail.com<br />
</pre>
<p>而项目配置文件是存放在Git项目所在目录的".git/config"文件中，这里也像上面一样用cat、head命令查看一下：</p>
<pre>$ cat .git/config | head -3<br />
[user]<br />
name = nickname<br />
<br />
</pre>
<p>如果大家对于Git熟悉后，可以直修改&#8221;~/.gitconfig&#8221;,&#8221;.git/config&#8221;这两个文件进行配置。</p>
<p>Git里还有很多可以配置的地方，大家可以参考一下<a href="http://www.kernel.org/pub/software/scm/git/docs/git-config.html">git config</a> 和 <a href="http://gitbook.liuhui998.com/5_7.html">定制git</a>。</p>
<hr />
<p>这一篇写起来有点平淡无奇，但这是一个Git用户迈出的第一步。后面我还会有一系列的文章出来，都是我个人使用过程中的感悟。</p>
<p>有朋友问我：&#8220;为什么把文章叫作：&#8216;Git历险记&#8217;&#8221;。这是因为在使用Git的历程中，我碰到过N多的问题；同时也觉得它有点小复杂。但是当这些问题解开后，就有时不得不赞叹它设计的巧妙之处。</p>
<p>如果大家对于我的文章有什么问题和建议，欢迎给我写邮件：<img _p="true" alt="" _href="img://image1.jpg" src="http://www.infoq.com/resource/news/2011/01/git-adventures-install-config/zh/resources/image2.JPG" border="0" /></p>
<p>之前我建立了一个 <a href="https://groups.google.com/group/git123">git中文用户组</a> ，如果大家在使用Git的过程中碰到什么麻烦事，欢迎你在这个用户组里提问。</p>
<p>参考资料：</p>
<ul>
    <li><a href="http://book.git-scm.com/">GitCommunityBook</a> <a href="http://gitbook.liuhui998.com/">中文版</a></li>
    <li><a href="http://progit.chunzi.me/zh">ProGit</a> <a href="http://progit.chunzi.me/zh">中文版</a></li>
    <li><a href="http://www.kernel.org/pub/software/scm/git/docs/git-config.html">git config</a></li>
</ul>
<p>感谢<a href="http://www.infoq.com/cn/bycategory.action?authorName=%E5%BC%A0%E5%87%AF%E5%B3%B0">张凯峰</a>对本文的策划及无比耐心的审校。</p>
<p>感谢家人在我的写作过程中的默默支持。</p>
<pre>原文：http://www.infoq.com/cn/news/2011/01/git-adventures-install-config<br />
email = nickname@gmail.com</pre><img src ="http://www.blogjava.net/jasmine214--love/aggbug/349992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-05-11 10:26 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/05/11/349992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Git 历险（一）</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/05/10/349915.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Tue, 10 May 2011 06:30:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/05/10/349915.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/349915.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/05/10/349915.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/349915.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/349915.html</trackback:ping><description><![CDATA[<p>【编者按】作为分布式版本控制系统的重要代表——Git已经为越来越多的人所认识，它相对于我们熟悉的CVS、SVN甚至同时分布式控制系统的
Mercurial，有哪些优势和不足呢。这次InfoQ中文站有幸邀请到《Git Community
Book》的译者刘辉，在InfoQ开辟《Git历险记》专栏，分享他使用Git的经验，以及他对Git的看法。</p>
<hr />
<p><a href="http://git-scm.com/">Git</a>是Linus.Torvald为了管理<a href="http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=summary">Linux内核</a>发起并开发的一个开源分布式版本控件系统（DVCS）。从2002年起，Linux 内核一直使用<a href="http://www.bitkeeper.com/">BitKeeper</a>来进行版本管理，但是在2005年BitKeeper和Linux 内核开源社区的合作关系结束，BitKeeper再也不能免费使用了，这迫使Linus决定开发一个开源界自已的版本控制系统。</p>
<p>传统的SVN、CVS 等版本控制系统，只有一个仓库（repository)，用户必须要连上这个仓库才能开始提交；而Git之类的分布式版本控制系统（当然也还包括 BitKeeper、<a href="http://mercurial.selenic.com/">Mercurial</a>等
等），它的每个工作目录都包含一个完整的仓库，它们可以支持离线工作，先把工作提交到本地仓库后再提交上远程的服务器上的仓库里。分布式的处理也让开发更
为便捷，开发人员可以很方便的在本地创建分支来进行日常开发，每个人的本地仓库都是平等且独立，不会因为你的本地提交而直接影响别人。</p>
<p>老实说，Git的速度是我用的版本控制系统中最快的（SVN Mercurial
Git）。我这里说的速度，包括本地提交(commit)、本地签出(checkout)、提交到远程仓库(git push)和从远程仓库获取（git
fetch ，git
pull）；它的本地操作速度和本地文件系统在一个级别，远程仓库的操作速度和SFTP文件传输在一个级别。这当然和Git的内部实现机制有关，这里就不
多展开了，有兴趣的朋友可以看一下这里：<a href="http://www.advogato.org/person/apenwarr/diary/371.html">Git is the next Unix</a>。</p>
<p>我们在学一门新的语言时，往往是从一个&#8220;hello world&#8221; 程序开始的，那么Git历程也就从一个&#8220;hello Git&#8221;开始吧。</p>
<p>在这里假设各位同学的电脑都装好了Git，如果没有装好，可以先看一下这里（<a href="http://gitbook.liuhui998.com/2_1.html">安装Git</a>）。当然，后面的章节我会专门讲安装可能会碰到的问题。</p>
<p>我们首先打开Git的命令行：windows下是点击&#8220;Git Bash 快捷方式&#8221;；Linux或是Unix like平台的话就直接打开命令行界面就可以了。</p>
<p><strong>备注：</strong>$符号后面的字符串代表的是命令行输入；命令行输入后的以#开始的<strong>黑体字符串</strong>代表注释；其它的部分则是命令行输出。</p>
<p>我们先用建一个仓库吧：</p>
<pre>$mkdir testGit <strong>#建立仓库目录</strong><br />
<br />
<br />
<br />
$cd testGit <strong>#进入仓库目录</strong><br />
<br />
<br />
<br />
$git init<strong> #这会在当前的目录下建一个仓库</strong><br />
<br />
<br />
<br />
Initialized empty Git repository in e:/doc/Git/test/testGit/.git/ <br />
<br />
<br />
<br />
</pre>
<p>好的，前面的三行命令就建立了一个本地的Git仓库。这个仓库现在是一个空的仓库。</p>
<p>我们在命令行下执行：</p>
<pre>$ git status <strong>#查看当前仓库的状态</strong><br />
<br />
<br />
<br />
# On branch master (在master分支上) <br />
<br />
<br />
<br />
# <br />
<br />
<br />
<br />
# Initial commit <br />
<br />
<br />
<br />
# <br />
<br />
<br />
<br />
nothing to commit (create/copy files and use "git add" to track) <br />
<br />
<br />
<br />
(现在没有任何台被提交的文件，复制或创建新的文件，再用&#8221;git add&#8221; 命令添加到暂存区中) <br />
<br />
<br />
<br />
$ git log <strong>#查看当前仓库的历史日志</strong><br />
<br />
<br />
<br />
fatal: bad default revision 'HEAD'<br />
<br />
<br />
<br />
(由于仓库里没有任提交在里面，所以它会报这个错。BTW: 这种提示是不是有点不友好呀：) ) <br />
<br />
<br />
<br />
</pre>
<p>现在就让我们在这个仓库里添加点内容吧。</p>
<pre>$ echo &#8220;hello Git&#8221; &gt; readme.txt <strong>#建立一个含有 hello Git 的文本文件</strong><br />
<br />
<br />
<br />
$ git add readme.txt <strong>#将readme.txt添加到<a href="http://www.google.com/url?q=http%3A%2F%2Fprogit.org%2Fbook%2Fzh%2Fch2-2.html&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNEYEQ9ebcoED7X5W658v903gnBUaQ">暂存区</a>中</strong><br />
<br />
<br />
<br />
$ git status <strong>#查看当前仓库的状态 </strong><br />
<br />
<br />
<br />
# On branch master <br />
<br />
<br />
<br />
# <br />
<br />
<br />
<br />
# Initial commit <br />
<br />
<br />
<br />
# <br />
<br />
<br />
<br />
# Changes to be committed:(暂存里下次将被提交的修改) <br />
<br />
<br />
<br />
# (use "git rm --cached &lt;file&gt;..." to unstage) <br />
<br />
<br />
<br />
# <br />
<br />
<br />
<br />
# new file: readme.txt <br />
<br />
<br />
<br />
# <br />
<br />
<br />
<br />
</pre>
<p>好的，文件即然被暂存到暂存区中，我们现在就可以把它提交到仓库里面去：）</p>
<pre>$ git commit -m "project init" <strong>#将刚才的修改提交到本地仓库中</strong> <br />
<br />
<br />
<br />
[master (root-commit) 8223db3] project init <br />
<br />
<br />
<br />
1 files changed, 1 insertions(+), 0 deletions(-) <br />
<br />
<br />
<br />
create mode 100644 readme.txt <br />
<br />
<br />
<br />
$ git status <br />
<br />
<br />
<br />
# On branch master <br />
<br />
<br />
<br />
nothing to commit (working directory clean) <br />
<br />
<br />
<br />
(现在这个工作目录里没有什么要提交的东东，它是整洁的) <br />
<br />
<br />
<br />
</pre>
<p>现在你执行一下git log 命令就会看到刚才的提交记录</p>
<pre>$ git log <br />
<br />
<br />
<br />
commit 8223db3b064a9826375041c8fea020cb2e3b17d1 <br />
<br />
<br />
<br />
Author: liuhui998 &lt;liuhui998@gmail.com&gt; <br />
<br />
<br />
<br />
Date: Sat Jan 1 18:12:38 2011 +0800 <br />
<br />
<br />
<br />
project init <br />
<br />
<br />
<br />
</pre>
<p>&#8220;8223db3b064a9826375041c8fea020cb2e3b17d1&#8221;这一串字符就是我们这次创建的提交的名字。看起来是不是很
熟，如果经常用电驴的朋友就会发现它就是和电驴里内容标识符一样，都是SHA1串。Git通过对提交内容进行 SHA1
Hash运算，得到它们的SHA1串值，作为每个提交的唯一标识。根据一般的密码学原理来说，如果两个提交的内容不相同，那么它们的名字就不会相同；反
之，如果它们的名字相同，就意味着它们的内容也相同。</p>
<p>现在我想改一下仓库里文件的内容，现提交到仓库中去</p>
<pre>$ echo "Git is Cool" &gt;&gt; readme.txt <strong>#在文件的最后添加一行</strong> <br />
<br />
<br />
<br />
$ git status <strong>#查看当前仓库的状态</strong> <br />
<br />
<br />
<br />
# On branch master <br />
<br />
<br />
<br />
# Changed but not updated: (修改了，但是还没有暂存的内容) <br />
<br />
<br />
<br />
# (use "git add &lt;file&gt;..." to update what will be committed) <br />
<br />
<br />
<br />
# (use "git checkout -- &lt;file&gt;..." to discard changes in working directory) <br />
<br />
<br />
<br />
# <br />
<br />
<br />
<br />
# modified: readme.txt <br />
<br />
<br />
<br />
# <br />
<br />
<br />
<br />
no changes added to commit (use "git add" and/or "git commit -a") <br />
<br />
<br />
<br />
<p>(没有修改可以被提交，使用 &#8220;git add&#8221; 命令添加文件到暂存区，或是使用&#8220;git commit -a&#8221; 命令强制提交当前目录下的所有文件)</p>
<br />
<br />
<br />
</pre>
<p>OK，即然我们修改了仓库里被提交的文件，那么我想看一下我们</p>
<p>到底改了哪些地方，再决定是否提交。</p>
<pre>$ git diff <strong>#查看仓库里未暂存内容和仓库已提交内容的差异</strong> <br />
<br />
<br />
<br />
diff --git a/readme.txt b/readme.txt <br />
<br />
<br />
<br />
index 7b5bbd9..49ec0d6 100644 <br />
<br />
<br />
<br />
--- a/readme.txt <br />
<br />
<br />
<br />
+++ b/readme.txt <br />
<br />
<br />
<br />
@@ -1 +1,2 @@ <br />
<br />
<br />
<br />
hello Git <br />
<br />
<br />
<br />
+Git is Cool <br />
<br />
<br />
<br />
</pre>
<p>很好，正如我们所愿，我们只是在readme.txt的最后一行添加了一行&#8220;Git is Cool&#8221;。</p>
<p>好的，我们现在再把 readme.txt放到暂存区里：</p>
<pre>$ git add readme.txt </pre>
<p>我们现在看一下仓库的状态：</p>
<pre>$ git status <br />
<br />
<br />
<br />
# On branch master <br />
<br />
<br />
<br />
# Changes to be committed: <br />
<br />
<br />
<br />
# (use "git reset HEAD &lt;file&gt;..." to unstage) <br />
<br />
<br />
<br />
# <br />
<br />
<br />
<br />
# modified: readme.txt <br />
<br />
<br />
<br />
# <br />
<br />
<br />
<br />
</pre>
<p>可以提交了：</p>
<pre>$ git commit -m "Git is Cool" <br />
<br />
<br />
<br />
[master 45ff891] Git is Cool <br />
<br />
<br />
<br />
1 files changed, 1 insertions(+), 0 deletions(-) <br />
<br />
<br />
<br />
(一个文件被修改，一行插入，零行删除) <br />
<br />
<br />
<br />
</pre>
<p>再看一下新的日志：</p>
<pre>$ git log <br />
<br />
<br />
<br />
commit 45ff89198f08365bff32364034aed98126009e44 <br />
<br />
<br />
<br />
Author: liuhui998 &lt;liuhui998@gmail.com&gt; <br />
<br />
<br />
<br />
Date: Sat Jan 1 18:17:07 2011 +0800 <br />
<br />
<br />
<br />
Git is Cool <br />
<br />
<br />
<br />
commit 8223db3b064a9826375041c8fea020cb2e3b17d1 <br />
<br />
<br />
<br />
Author: liuhui998 &lt;liuhui998@gmail.com&gt; <br />
<br />
<br />
<br />
Date: Sat Jan 1 18:12:38 2011 +0800 <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
project init <br />
<br />
<br />
<br />
</pre>
<p>&#8220;45ff89198f08365bff32364034aed98126009e44&#8221; 这个就是我们刚才提交修改时创建的提交。</p>
<p>大家这么一路看过来，是不是有点糊涂了。不过没有关系，如果你的电脑装了Git，那么你把上面的这些命令全部执行一下遍就会对它有感性的认识了。</p>
<p>下面的的章节，我会讲一下如何在windows和Linux安装配置Git，以及需要注意的问题：）</p>
<p><br />
</p>
<p>原文：http://www.infoq.com/cn/news/2011/01/git-adventures-1</p>
<p>http://www.infoq.com/cn/git-adventures(Git )
</p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/349915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-05-10 14:30 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/05/10/349915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>定制Git</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/05/10/349914.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Tue, 10 May 2011 06:23:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/05/10/349914.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/349914.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/05/10/349914.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/349914.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/349914.html</trackback:ping><description><![CDATA[<div>
<h2>定制Git</h2>
<p><a href="http://www.kernel.org/pub/software/scm/git/docs/git-config.html">git config</a></p>
<h3>更改你的编辑器</h3>
<pre><code>$ git config --global core.editor emacs<br />
</code></pre>
<h3>添加别名</h3>
<pre><code>$ git config --global alias.last 'cat-file commit HEAD'<br />
<br />
$ git last<br />
tree c85fbd1996b8e7e5eda1288b56042c0cdb91836b<br />
parent cdc9a0a28173b6ba4aca00eb34f5aabb39980735<br />
author Scott Chacon &lt;schacon@gmail.com&gt; 1220473867 -0700<br />
committer Scott Chacon &lt;schacon@gmail.com&gt; 1220473867 -0700<br />
<br />
fixed a weird formatting problem<br />
<br />
$ git cat-file commit HEAD<br />
tree c85fbd1996b8e7e5eda1288b56042c0cdb91836b<br />
parent cdc9a0a28173b6ba4aca00eb34f5aabb39980735<br />
author Scott Chacon &lt;schacon@gmail.com&gt; 1220473867 -0700<br />
committer Scott Chacon &lt;schacon@gmail.com&gt; 1220473867 -0700<br />
<br />
fixed a weird formatting problem<br />
</code></pre>
<h3>添加颜色</h3>
<p>所有的color.*选项请参见<a href="http://www.kernel.org/pub/software/scm/git/docs/git-config.html">git config</a>的文档</p>
<pre><code>$ git config color.branch auto<br />
$ git config color.diff auto<br />
$ git config color.interactive auto<br />
原文：http://gitbook.liuhui998.com/5_7.html<br />
$ git config color.status auto<br />
</code></pre>
<p>或者你可以通过color.ui选项把颜色全部打开:</p>
<pre><code>$ git config color.ui true<br />
</code></pre>
<h3>提交模板</h3>
<pre><code>$ git config commit.template '/etc/git-commit-template'<br />
</code></pre>
<h3>日志格式</h3>
<pre><code>$ git config format.pretty oneline<br />
</code></pre>
<h3>其他配置选项</h3>
<p>除上面提到的选项外, 还有很多很有趣的选项去配置打包, 垃圾回收, 合并, 分支, http传输, diff, 分页, 空白字符等等的行为. 如果你需要更加深入地调教git, 请阅读<a href="http://www.kernel.org/pub/software/scm/git/docs/git-config.html">git config</a>文档.</p>
</div>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/349914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-05-10 14:23 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/05/10/349914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>安装Git</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/05/10/349913.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Tue, 10 May 2011 06:22:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/05/10/349913.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/349913.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/05/10/349913.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/349913.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/349913.html</trackback:ping><description><![CDATA[<div>
<h2>安装Git</h2>
<h3>从源代码开始安装</h3>
<p>如果你在一个其基于Unix的系统中，你可以从Git的官网上<a href="http://git-scm.com/download">Git Download Page</a>下载它的源代码,并运行像下面的几行命令,你就可以安装:</p>
<pre><code>$ make prefix=/usr all ;# as yourself <br />
$ make prefix=/usr install ;# 以root权限运行<br />
</code></pre>
<p>你需一些库: <a href="http://expat.sourceforge.net/">expat</a>,<a href="http://curl.linux-mirror.org/">curl</a>,
<a href="http://www.zlib.net/">zlib</a>, 和 <a href="http://www.openssl.org/">openssl</a>; 除了expat 外，其它的可能在你的机器上都安装了。</p>
<h3>Linux</h3>
<p>如果你用的是Linux，你可以用你的本地包管理系统(native package management system)来安装.</p>
<pre><code>$ yum install git-core  #译者注，在redhat等系统下用yum<br />
<br />
$ apt-get install git-core  #译者注，在debian, ubuntu等系统下用apt-get<br />
</code></pre>
<p>如果你用上面的命令不起作用的话，你可以从下面两个站点下载 .deb 或 .rpm 包:</p>
<p><a href="http://kernel.org/pub/software/scm/git/RPMS/">RPM Packages</a></p>
<p><a href="http://www.backports.org/debian/pool/main/g/git-core/">Stable Debs</a></p>
<p>如果你在Linux兴趣从源代码开始安装的话,下面的这篇文章也许对你有帮助:
<a href="http://chrisolsen.org/2008/03/10/installing-git-on-ubuntu/">Article: Installing Git on Ubuntu</a></p>
<h3>Mac 10.4</h3>
<p>在Mac10.4和 10.5,如果你安装了MacPorts,你可以通过 <a href="http://www.macports.org/">MacPorts</a>来安装Git。如果你没有安装MacPort, 你可以从 <a href="http://www.macports.org/install.php">这里</a>来安装它.</p>
<p>当你安装好MacPorts后，你可通过下面的命令来安装:</p>
<pre><code>$ sudo port install git-core<br />
</code></pre>
<p>如果你想从源代码开始安装，下面这些文章可能对你有帮助:</p>
<p><a href="http://rails.wincent.com/wiki/Installing_Git_1.5.2.3_on_Mac_OS_X_Tiger">Article: Installing Git on Tiger</a></p>
<p><a href="http://larrytheliquid.com/2007/12/29/compiling-git-and-git-svn-on-osx-tiger/">Article: Installing Git and git-svn on Tiger from source</a></p>
<h3>Mac 10.5</h3>
<p>在Leopard系统下，你也可以通过MacPorts来安装,但是你有一个新的选项:"一个漂亮的安装包", 你可以从这里来下载:<a href="http://code.google.com/p/git-osx-installer/downloads/list?can=3">Git OSX Installer</a></p>
<p>如果你想从源代码开始安装，我希望下面些资料能对你有帮助:</p>
<p><a href="http://solutions.treypiepmeier.com/2008/02/25/installing-git-on-os-x-leopard/">Article: Installing Git on OSX Leopard</a></p>
<p><a href="http://dysinger.net/2007/12/30/installing-git-on-mac-os-x-105-leopard/">Article: Installing Git on OS 10.5</a></p>
<h3>Windows</h3>
<p>在Windows下安装Git是很简单的，你只要下载<a href="http://code.google.com/p/msysgit/downloads/list">msysGit</a>就可以了。</p>
<p><em>Git on Windows</em> 这一章有一个"screencast"来在演示如何在windows下使用Git.</p>
<p>原文：http://gitbook.liuhui998.com/2_1.html<br />
</p>
</div>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/349913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-05-10 14:22 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/05/10/349913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CFE--------------bootloader</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/04/27/349132.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Wed, 27 Apr 2011 09:32:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/04/27/349132.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/349132.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/04/27/349132.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/349132.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/349132.html</trackback:ping><description><![CDATA[Common Firmware Environment<br />
简称CFE，它是BroadCom公司专用的bootloader，即引导内核的程序。
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/349132.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-04-27 17:32 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/04/27/349132.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Baud rate(波特率)是什么</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/04/26/349070.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Tue, 26 Apr 2011 10:59:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/04/26/349070.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/349070.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/04/26/349070.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/349070.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/349070.html</trackback:ping><description><![CDATA[<br />
<br />
波特率概念　　(BaudRate)
模拟线路信号的速率，也称<a href="http://baike.baidu.com/view/1448057.htm" target="_blank">调制速率</a>，以波形每秒的振荡数来衡量。如果数据不压缩，波特率等于每秒钟传输的<a href="http://baike.baidu.com/view/190231.htm" target="_blank">数据位</a>数，如果数据进行了压缩，那么每秒钟传输的数据位数通常大于调制速率，使得交换使用波特和比特/秒偶尔会产生错误。
波特率是指数据信号对载波的调制速率，它用单位时间内载波调制状态改变的次数来表示，其单位是波特（Baud）。波特率与<a href="http://baike.baidu.com/view/56355.htm" target="_blank">比特率</a>的关系是比特率=波特率X单个调制状态对应的二进制位数。
在信息传输通道中，携带数据信息的信号单元叫码元，每秒钟通过信道传输的码元数称为码元传输速率，简称波特率。波特率是传输通道频宽的指标。
每秒钟通过信道传输的信息量称为位传输速率，简称比特率。比特率表示有效数据的传输速率。
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/349070.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-04-26 18:59 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/04/26/349070.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FileZilla的了解</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/04/26/349054.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Tue, 26 Apr 2011 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/04/26/349054.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/349054.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/04/26/349054.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/349054.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/349054.html</trackback:ping><description><![CDATA[<font size="2">filezilla是一个免费的FTP客户端软件，虽然它是免费软件，可功能却一点也不含糊，比起那些共享软件来有过之而无不及，在新的版本中作者改进了手动下载的界面和功能等，不过该软件暂时还是不支持断点续传功能。总的来说是一款优秀的免费软件。<br />
</font>
<p>以前一直通过serv-u<a href="http://vv15.com/2010/05/filezilla-server-pdf/">搭建FTP服务器</a>，不过最近发现serv-u不是很好用，经常出现CPU资源占用过高的情况，所以考虑着更换一个FTP服务器软件。</p>
<p>这次更换的软件就是<a href="http://vv15.com/2010/05/filezilla-server-pdf/">FileZilla Server</a>啦！使用<a href="http://vv15.com/category/ubuntu-linux/">ubuntu</a>的时候接触过这个软件的客服端版本，早知道他是开源免费的了，所以这次第一时间就想到了<a href="http://vv15.com/2010/05/2010/05/filezilla-server-pdf/">FileZilla Server<br />
</a></p>
<p>本来准备自己写教程的，图文都制作好好几张了，因为有的英文不了解，Google的时候发现了两个PDF文件，实在是比我的要好，我就不自己写了，直接套用别人的吧！</p>
<p>第一个是豆丁网的：<a href="http://www.docin.com/p-9577380.html">FileZilla FTP Server安装设置教程</a></p>
<p>另外一个是&#8220;笑申的博客&#8221;：<a href="http://www.liushen.net/post/177.html">FileZilla FTP Server  使用手册（PDF教程下载）</a></p>
<p><strong>引用如下：</strong></p>
<p>FileZilla Server 使用手册（附PDF文档，可下载后观看）<span style="color: red;"><strong>PDF下载：</strong></span><a href="http://www.liushen.net/upload/2009/11/FileZilla_Server_Guide.pdf" target="_blank">FileZilla_Server_Guide.pdf</a></p>
<p><strong>一、简介 </strong></p>
<p>Filazilla 是一个非常流行的开源的免费的FTP客户端、服务器端的项目，目前其客户端软件Filezilla Client 3.0有着非常广泛的市场。<br />
Filezilla
的主要优势在于：高安全、高性能。Filazilla的安全性是来自于其开放源代码的。开源为何能保证安全？每一款软件产品诞生后，都有很多人试图发现其
漏洞进行攻击，以获取权限和其他利益。如果是开源软件，攻击者就会下载这个软件的源代码，从源头上分析其内部漏洞在那里，并且进行攻击。开源的规模越大，
下载阅读其源代码的人也多，这个软件也就越普及。随着其逐渐改进，漏洞就越来越少，最后成为了公认极其安全的软件，这和互联网中数万程序员的贡献是分不开
的。这类软件的代表就是Linux平台下的Apache、PHP、MySQL、Bind、Vsftpd等大量高可靠性软件。而不开放源代码的闭源软件，人
们无法对其进行研究，因此，只能将他当作&#8220;黑盒&#8221;来研究，研究的过程中没有源代码，很难找到其错误。即便找到了一些错误，还有更多的漏洞隐藏在代码中，但
是因为代码不公开，因此人们短期内无从发现，后期使用会暴露出很多问题。一些闭源软件甚至保留有&#8220;后门&#8221;，以方便远程遥控，比如Windows，比如
Serv-U。而开源软件代码是开放的，如果开发者在里边植入&#8220;后门&#8221;等危险代码，就会被互联网上广大的程序员纠出来，因此，这里也可以看出，开源，是对
安全的最好保证。<br />
Filezilla的高性能来自于其代码的开发平台是C/C++，自身基础就好于其他VB/Dephi平台开发的应用程序，因 此Filezilla具有可媲美IIS的性能。在千兆网络带宽上，可轻松满足数百用户同时高速下载。<br />
目前Filezilla也存在一些不足，主 要缺点就是不支持配额，即本身不提供上传、下载总文件大小配额的功能。即便如此，免费的Filezilla正越来越多的占领原来Serv-U等软件的市 场，变得更加贴近用户了。</p>
<p><strong>二、安装</strong></p>
<p>安装过程非常简单，首先下载Filezilla  Server安装文件，如果觉得去国外英文官方网站下载速度慢，也可以从这里下载：<br />
下载地 址：http://www.swsoft.com.cn/temp/FileZilla_Server.exe<br />
将安装包下载到桌面，准备安装。<br />
双击安装程序开始安装。点击&#8220;I Agree&#8221;继续。<br />
选择安装方式，默认的标准即可。其中&#8220;Source  Code&#8221;源代码一般不用安装，除非是想研究FileZilla的代码。<br />
选择安装路径，强烈推荐安装到非默认路径，以增加安全系数。例如如下路 径：<br />
选择&#8220;安装为服务，并随机自动启动&#8221;的选项。下边的14147是管理端口，强烈推荐修改此端口，例如改成38121端口。（注意不要和常见 服务如80端口冲突）。<br />
选择&#8220;当管理员登录时候，启动管理界面&#8221;的选项。<br />
安装进行中。<br />
至此安装完成，安装程序自动启动管理
控制台，默认是连接到本机的管理端口。管理端口到底是多少，请参考前文安装过程中填写的具体数字是多少。建议选中&#8220;总是连接到本服务器&#8221;的选项，即表示每
次启动管理控制台，都是管理本机的Filezilla服务。下边有一个输入密码的对话框，在里边输入本服务器Filezilla服务的密码。<br />
注 意：修改端口和密码非常重要，这是确保Filezilla安全的重点，必须修改端口，必须设置密码！密码建议足够复杂！<br />
点击OK后，即可启动初 始化之后的管理控制台，配置完成。</p>
<p><strong>三、 配置</strong></p>
<p>1. 基本设置</p>
<p>Filezilla默 认的模式是Port模式，不是Passive被动模式。为了解决防火墙后的客户端连接问题，最好是启用Passive模式。要启动被动模式，首先打开管理 控制台，点击左起第三个图标 进入系统设置。<br />
点击左侧&#8220;Welcom message&#8221;菜单，即FTP登录后的欢迎信息。<br />
为了安全起 见，强烈建议修改默认的欢迎信息为&#8220;Welcom to Serv-U FTP  Server&#8221;，这样Filezilla在欢迎消息中就会Serv-U字样，以达到欺骗攻击者的目的。注意：本步骤非常重要！<br />
现在我们用 telnet去连接一下FTP的21端口，即可看到修改过的&#8220;假&#8221;的提示信息，这样服务器的安全性可以得到比较明显的提高。<br />
接下来点击 &#8220;Passive Mode Settings&#8221;选项，进入被动模式设置。<br />
选中启动被动模式端口范围的选项，输入10000~10050端口范 围，表示被动模式将要使用这个范围的端口。<br />
点击确定保存即可。接下来在防火墙上允许10000~10050端口范围进出，或者<br />
直接允许 Filezilla server.exe主程序的互联网访问。<br />
安装的最后一步是加固权限，找到Filezilla的配置文件，格式是xml格 式，鼠标右键点击之，并选择属性。<br />
加入Guest组禁止读写的权限，设置为拒绝。<br />
点击确定后，系统会弹出提示，询问拒绝权限优先级高 于允许权限，是否要继续，点击是通过即可。<br />
至此初始化基本配置完成。</p>
<p>2. 匿名FTP配置</p>
<p>首先打开管理控 制台，点击左起第四个图标 进入系统设置。<br />
打开ftp用户管理界面，点击右侧的 按钮，添加新用户。<br />
在新增用户的对话框中，输入 &#8220;anonymous&#8221;这个名字，即FTP的匿名用户。<br />
点击确认，添加用户完成，返回用户管理界面。<br />
点击左侧的&#8220;Shared  folders&#8221;菜单。点击Add按钮，添加一个目录。<br />
打开浏览文件夹的选项，选择要设置FTP的目录。<br />
点击确定，添加用户完成。<br />
现 在用户FTP客户端连接到FileZilla Server上，可以看到匿名FTP已经配置完成。</p>
<p>3. 标准FTP用户配置</p>
<p>首 先进入用户设置界面，点击&#8220;Add&#8221;按钮添加新的FTP用户。<br />
输入用户名test 。<br />
选中Password前边的多选框，然后输入密 码123456。<br />
返回到用户管理界面，点击设置文件夹目录，点击Add添加目录。<br />
添加一个目录到test用户。<br />
添加完成， 再右侧选中test用户对这个目录的权限，然后点击左侧的OK按钮，配置完成。<br />
配置完成。现在可以使用客户端来测试登录了。<br />
打开 FTP客户端软件，输入test用户名和密码123456，登录到服务器。<br />
登录成功后，可以看到刚才制定的FTP目录下的文件，并具有相应的上 传、下载权限。</p>
<p>4. 虚拟目录配置</p>
<p>在具有多个目录需要共享的情况下，设置虚拟目录是比较利于管理的选择。通常，一个 FTP服务器需要有一个&#8220;Home&#8221;主目录，然后设置若干个虚拟目录。<br />
首先进入到用户管理界面，选中Test用户，选中当前设置的目录。<br />
点 击&#8220;Set as home dir&#8221;选项 ，将当前目录设置为&#8220;home&#8221;主目录。<br />
点击Add按钮，在原有目录之外，再添加一个别的目录，比 如选择桌面目录。<br />
新的目录已经添加到目录清单了。此时添加&#8220;别名&#8221;，点击&#8220;Alias&#8221;空白处。<br />
添加Aliases别名，注意一定用 &#8220; /&#8221;符号开头，表示是根目录下的虚拟目录。<br />
添加完成。现在可以去登录FTP，就能看到虚拟目录了。<br />
登录到FTP之后，可以看到虚 拟目录出现在test用户的目录中。<br />
至此虚拟目录设置完成。</p>
<p>5. 加固Filezilla安全</p>
<p>&#8226;  安装Filezilla到非标准目录<br />
&#8226;  安装过程中设置Filezilla的管理端口监听在127.0.0.1上的随机端口，例如38471等奇怪的没用的端口。<br />
&#8226;  安装过程中设置Filezilla的管理密码，并设置密码足够复杂<br />
&#8226;  在Filezilla目录下的xml配置文件上，设置Guests组禁止读取的权限<br />
&#8226;  修改FTP登录后的提示信息为IIS、Serv-U等信息<br />
&#8226; 不要开启SSL加密、SFTP等功能，避免以后出现漏洞<br />
经过如上一些配 置，Filezilla可以做到很高的安全性。</p>
<p>原文： http://vv15.com/2010/05/filezilla-server-pdf/<br />
</p>
<br />
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/349054.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-04-26 17:04 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/04/26/349054.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>fedora 8的安装过程-dsl编译环境搭建</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/04/22/348826.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Fri, 22 Apr 2011 10:25:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/04/22/348826.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/348826.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/04/22/348826.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/348826.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/348826.html</trackback:ping><description><![CDATA[<!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><!--[if !mso]>
<style>
st1":*{behavior:url(#ieooui) }
</style>
<![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
<p>fedora 8<span style="font-family: 宋体;">的安装过程</span></p>
<p>PS<span style="font-family: 宋体;">：</span>
<span style="font-family: 宋体;">开始安装的是</span>fedora 12,<span style="font-family: 宋体;">由于不是全部安装，很多东西没有自带（比如</span>svn,<span style="font-family: 宋体;">比如</span>samba,bison,<span style="font-family: 宋体;">）然后即使后来安装了，也仍然在编译的时候出现很多问题，编译不通过，接连搞了</span>2<span style="font-family: 宋体;">天，都没有结果，于是今天安装了</span>fedora 8,<span style="font-family: 宋体;">选择了软件开发，但是重启的时候出现停住不动的情况，这个没有关系，自己按键重启就好了。</span></p>
<p>fedora 8<span style="font-family: 宋体;">遇到的一些问题：</span></p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span><span>1.<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span>ifconfig <span style="font-family: 宋体;">命令找不到，是因为环境变量</span>PATH<span style="font-family: 宋体;">里没有</span>sbin <span style="font-family: 宋体;">和</span>/usr/sbin,<span style="font-family: 宋体;">补充进去即可。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span><span>2.<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span>fedora <span style="font-family: 宋体;">的相应信息：</span></p>
<p>ip:172.28.6.36</p>
<p>======================================================================</p>
<p><span style="font-family: 宋体;">安装</span>fedora<span style="font-family: 宋体;">（</span>fedora 8<span style="font-family: 宋体;">）</span></p>
<p><span style="font-family: 宋体;">我的</span>fedora<span style="font-family: 宋体;">系统的</span>IP<span style="font-family: 宋体;">：</span>172.28.6.36</p>
<p><span style="font-family: 宋体;">原本是</span>windows<span style="font-family: 宋体;">系统没关系，使用光驱安装，电脑启动的时候按</span>F2<span style="font-family: 宋体;">或其他某个键进入</span>BIOS<span style="font-family: 宋体;">选择使用光驱启动就可以把原本是</span>windows<span style="font-family: 宋体;">的系统安装成</span>Fedora<span style="font-family: 宋体;">系统了。</span></p>
<p>dev/sda1</p>
<p><span style="font-family: 宋体;">我的</span>Fedora<span style="font-family: 宋体;">系统的信息记录：</span></p>
<p>Hostname: fedoraOfKiki</p>
<p>Root Password:82632955</p>
<p>PS<span style="font-family: 宋体;">：安装过程中，使用中文指示后面的安装</span></p>
<p><span style="font-family: 宋体;">使用完全安装，把所有软件都勾上。</span></p>
<p><span style="font-family: 宋体;">分区那一步，我选择</span><span>Use
entire drive</span><span style="font-family: 宋体;">，使用整个硬盘空间（即全部革掉了）</span></p>
<p><span style="font-family: 宋体;">安装</span>OK,<span style="font-family: 宋体;">重启，创建</span>User(kiki,82632955)</p>
<p>su <span style="font-family: 宋体;">切换用户</span></p>
<p>2.</p>
<p><span style="font-family: 宋体;">在</span>fedora<span style="font-family: 宋体;">中先安装</span>samba<span style="font-family: 宋体;">服务器，安装方法如下：</span></p>
<p>yum update <span style="font-family: 宋体;">更新源</span></p>
<p>yum &#8211;y install samba-swat</p>
<p>yum &#8211;y install bision</p>
<p>3.<span style="font-family: 宋体;">使用</span>
<span style="background: none repeat scroll 0% 0% yellow;">tar jvxf&nbsp;tar</span><span style="font-family: 宋体; background: none repeat scroll 0% 0% yellow;">包</span> <span style="font-family: 宋体;">直接将这个</span>toolchain<span style="font-family: 宋体;">解到</span>opt/toolchains/uclibc-mipsel-gcc-4.2.3<span style="font-family: 宋体;">下面</span></p>
<p><span style="font-family: 宋体;">不管在哪里解压，只要将解压好的东西放在</span> /opt/toolchains/<span style="font-family: 宋体;">目录下面即可。</span></p>
<p><span style="font-family: 宋体;">解压</span>2<span style="font-family: 宋体;">个</span>toolchains <span style="font-family: 宋体;">到</span>/opt<span style="font-family: 宋体;">目录下面</span></p>
<p>63281 toolchains<span style="font-family: 宋体;">：</span></p>
<p><a href="http://10.58.100.247/svn_dsl/DSL/software/branch/4.02L.03_CT_ADSL_B/toolChains/uclibc-crosstools-gcc-4.2.3-3_LFS.tar.bz2" title="blocked::http://10.58.100.247/svn_dsl/DSL/software/branch/4.02L.03_CT_ADSL_B/toolChains/uclibc-crosstools-gcc-4.2.3-3_LFS.tar.bz2">http://10.58.100.247/svn_dsl/DSL/software/branch/4.02L.03_CT_ADSL_B/toolChains/uclibc-crosstools-gcc-4.2.3-3_LFS.tar.bz2</a></p>
<p>5358 toolchains<span style="font-family: 宋体;">：</span></p>
<p><a href="http://10.58.100.247/svn_dsl/DSL/software/branch/4.02L.03_CT_ADSL_B_5358U/toolchain/uclibc-mipsel-gcc-4.2.3.tar.bz2" title="blocked::http://10.58.100.247/svn_dsl/DSL/software/branch/4.02L.03_CT_ADSL_B_5358U/toolchain/uclibc-mipsel-gcc-4.2.3.tar.bz2">http://10.58.100.247/svn_dsl/DSL/software/branch/4.02L.03_CT_ADSL_B_5358U/toolchain/uclibc-mipsel-gcc-4.2.3.tar.bz2</a></p>
<p>4.</p>
<p><span style="font-family: 宋体;">发现</span>fedora<span style="font-family: 宋体;">里面并没有自带</span>svn,<span style="font-family: 宋体;">所以使用命令</span>yum &#8211;y install svn<span style="font-family: 宋体;">进行安装，居然</span>OK<span style="font-family: 宋体;">了。</span></p>
<p><span style="font-family: 宋体;">后面在尝试编译的过程中发现提示没有</span>gcc,<span style="font-family: 宋体;">所以我就安装</span>gcc<span style="font-family: 宋体;">了（</span>yum &#8211;y install gcc<span style="font-family: 宋体;">）。</span></p>
<p>======================================================================</p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/348826.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-04-22 18:25 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/04/22/348826.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Fedora 12的安装过程（图解）</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/04/20/348639.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Wed, 20 Apr 2011 08:52:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/04/20/348639.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/348639.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/04/20/348639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/348639.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/348639.html</trackback:ping><description><![CDATA[<p>参考：http://www.dinyuan.cn/a/manhuayizhan/20091119/80_2.html</p>
<p>以 Fedora 12 为例，通过图文方式讲解 Fedora 的安装过程和配置信息。</p>
<p>从《<a title="开始转向 Linux" href="http://lugir.com/technology/fedora/fedora-opening.html">开始转向 Linux</a>》一文中提供的 Fedora 12 的下载地址，下载好之后就可进行安装了。这套教程假设你没有任何 Linux 的技术背景，完全从头开始学习，所以我们首先在虚拟机中进行操作和学习。</p>
<p>如何使用虚拟机不在本文讨论范围，请自行查找相关资料。</p>
<p>作为这个教程中使用的系统，建议将 Fedora 的虚拟硬盘设置为 8G。有关 Fedora 分区的内容在以后的文章中在详细讨论。</p>
<p>准备好了虚拟机和 Fedora 12 的光盘镜像，下面就开始了&#8230;&#8230;</p>
<p>将 Fedora 12 的镜像载入虚拟机，并设置从光盘启动，以下就是运行 Fedora 12 安装光盘的首个菜单。选择第一项 —— "Install or upgrade an existing system(安装新系统 或者 升级一个已存在的系统)"</p>
<p><img src="http://lugir.com/sites/default/files/image/upload/fedora/install-fedora-1-1.jpg" alt="安装 Fedora 12，安装选择菜单[图]" width="450" height="338" /></p>
<p>然后会看到一大片如下的检测和准备信息，等待就好了&#8230;&#8230;</p>
<p><img src="http://lugir.com/sites/default/files/image/upload/fedora/install-fedora-1-2.jpg" alt="安装 Fedora 12，检测信息[图]" width="450" height="250" /></p>
<p>准备完成，提示是否测试光盘。这一步的意思在正式安装前，检测 CD 或 DVD 是否有损坏。因为我们直接从官方下载的境像，所以可以选择 Skip (略过)。 —— 实际上，使用光盘安装也没什么好检测，如果盘坏了，检测出来是坏盘也没什么太大帮助 :D</p>
<p><img src="http://lugir.com/sites/default/files/image/upload/fedora/install-fedora-1-3.jpg" alt="安装 Fedora 12，光盘检测[图]" width="450" height="250" /></p>
<p>之后就出现 Fedora 的安装向导，到这里就说明 Fedora 开始收集基本配置信息了。直接 Next</p>
<p><img src="http://lugir.com/sites/default/files/image/upload/fedora/install-fedora-1-4.jpg" alt="安装 Fedora 12，安装向导[图]" width="450" height="338" /></p>
<p>选择安装过程中的语言 —— English(English)。这个语言选择只对安装进程有效，我们使用 English，之后会讨论如何设置中文界面。</p>
<p><img src="http://lugir.com/sites/default/files/image/upload/fedora/install-fedora-1-5.jpg" alt="安装 Fedora 12，选择安装语言[图]" width="450" height="338" /></p>
<p>选择键盘类型 —— U.S.English，下一步</p>
<p><img src="http://lugir.com/sites/default/files/image/upload/fedora/install-fedora-1-6.jpg" alt="安装 Fedora 12，选择键盘类型[图]" width="450" height="338" /></p>
<p>接下来设置计算机名称，大家为机器取一个好听有名字吧，或者直接就叫 Fedora :D，下一步</p>
<p><img src="http://lugir.com/sites/default/files/image/upload/fedora/install-fedora-1-7.jpg" alt="安装 Fedora 12，设置计算机名称[图]" width="450" height="338" /></p>
<p>选择时区。使用上面的图形也可以，使用下面的下拉框也行，选择 Asia/Shanghai，下一步</p>
<p><img src="http://lugir.com/sites/default/files/image/upload/fedora/install-fedora-1-8.jpg" alt="安装 Fedora 12，选择时区[图]" width="450" height="338" /></p>
<p>设置 root 密码(也称&#8220;根密码&#8221;)。root 相当于 Windows 下的 Administrator，这个账户对整个系统有完全控制权。所以密码要设置得强悍一些 :D</p>
<p>PS:符合复杂的密码的要求为&#8220;长度大于6位，包含大写字母、小写字母、数字、符号四类中的三种&#8221;，如果密码不够复杂，系统会提示&#8220;密码强度不够，是否一定要使用&#8221;。</p>
<p><img src="http://lugir.com/sites/default/files/image/upload/fedora/install-fedora-1-9.jpg" alt="安装 Fedora 12，设置 root 密码[图]" width="450" height="338" /></p>
<p>到这里，Fedora 12 的基本安装信息就收集好了，很简单吧。坏消息是，整个安装过程还没完；好消息是，接下来的内容也很简单 :D</p>
<p>图文讲解 Fedora 的安装过程，说明安装过程中的基本配置信息。</p>
<p>按照《<a title="安装 Fedora 12 (一) - 基本设置" href="http://lugir.com/technology/fedora/install-fedora-1.html">安装 Fedora 12 (一) - 基本设置</a>》和《<a title="安装 Fedora 12 (二) - 磁盘分区及软件包选择" href="http://lugir.com/technology/fedora/install-fedora-2.html">安装 Fedora 12 (二) - 磁盘分区及软件包选择</a>》安装好 Fedora 之后，重启计算机之后对 Fedora 进行最后的一些设置。</p>
<p>重启计算机之后，启动 Fedora 便会看到一个欢迎界面，左侧的菜单表示进度，告诉我们接下来还要做的事情有 —— 了解授权信息、创建用户、设置日期和时间、硬件信息。点击 Forword (前进)。</p>
<p><img src="http://lugir.com/sites/default/files/image/upload/fedora/install-fedora-3-1.jpg" alt="安装 Fedora，欢迎界面[图]" width="450" height="338" /></p>
<p>Fedora 授权信息，下一步</p>
<p><img src="http://lugir.com/sites/default/files/image/upload/fedora/install-fedora-3-2.jpg" alt="安装 Fedora，Fedora 授权信息[图]" width="450" height="338" /></p>
<p>创建新用户 —— 因为 Root (根用户) 对整个系统有安装控制权限，从安全性方面考虑，要求创建普通用户。为了方便，暂时先将用户名和命名设置为 lugir，相关内容会在讲用户账户时提到。</p>
<p>填写好用户名、全名、密码、确认密码栏之后，下一步。</p>
<p><img src="http://lugir.com/sites/default/files/image/upload/fedora/install-fedora-3-3.jpg" alt="安装 Fedora，创意新用户[图]" width="450" height="338" /></p>
<p>设置时间日期，然后下一步</p>
<p><img src="http://lugir.com/sites/default/files/image/upload/fedora/install-fedora-3-4.jpg" alt="安装 Fedora，设置时间日期[图]" width="450" height="338" /></p>
<p>显示硬件信息，保持默认 "Do not send profile (不发送配置)"，点击 Finish (完成)</p>
<p><img src="http://lugir.com/sites/default/files/image/upload/fedora/install-fedora-3-5.jpg" alt="安装 Fedora，显示硬件信息[图]" width="450" height="338" /></p>
<p>系统提示 &#8220;是否真的不发送硬件配置&#8221;，选择 &#8220;No, do not send (不发送)&#8221;</p>
<p><img src="http://lugir.com/sites/default/files/image/upload/fedora/install-fedora-3-6.jpg" alt="安装 Fedora，硬件信息对话框[图]" width="450" height="164" /></p>
<p>之后便会显示登录界面，以后每次开机都会看到这个界面</p>
<p><img src="http://lugir.com/sites/default/files/image/upload/fedora/install-fedora-3-7.jpg" alt="Fedora 12 登录界面[图]" width="450" height="338" /></p>
<p>选择你的用户名，输入密码，登录，就可以进入桌面了，有点激动人心吧，哈哈</p>
<p><img src="http://lugir.com/sites/default/files/image/upload/fedora/install-fedora-3-8.jpg" alt="Fedora 12 桌面[图]" width="450" height="338" /></p>
<p>到这里，Fedora 12 的安装就全部完成了，在进行下一节之前，可以四处点点，随便看看 :D</p>
<p><br />
</p>
<p>原文： http://lugir.com/install-fedora-3.html</p>
<p><br />
</p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/348639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-04-20 16:52 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/04/20/348639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>玩转CVSNT+TortoiseCVS 版本控制系统（图解）(上) </title><link>http://www.blogjava.net/jasmine214--love/archive/2011/04/18/348517.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Mon, 18 Apr 2011 12:32:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/04/18/348517.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/348517.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/04/18/348517.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/348517.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/348517.html</trackback:ping><description><![CDATA[<div><font color="#ff0000" size="4"><strong>玩转CVSNT+TortoiseCVS 版本控制系统（图解）(上)</strong></font></div>
<div>&nbsp;</div>
<div><font size="2">作者：熔岩<br />
日期：2006年9月16日<br />
类别：配置管理</font></div>
<div><font color="#ff0000" size="2">声明：原创作品，未经授权，谢绝转载！</font></div>
<div>&nbsp;</div>
<div><font size="2"><font color="#ff0000" size="3"><strong>背景</strong></font></font></div>
<div><font color="#006400" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是去年秋天利用工作至于空暇时间写的一篇关于CVS的文章，因为是word格式的文章，发布不方便，今日放上来，希望对所有想了解和学习CVS的朋友有所帮助。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
文章以CVSNT+TortoiseCVS搭建CVS平台的配置过程为主线，详尽介绍了CVS的平台搭建的过程。并以应用为中心，结合Java程序员常用
的两种开发工具Eclipse-3.2、IntelliJ IDEA 5.12
介绍了如何在这些IDE中使用CVS。文章中淡化了CVS的命令介绍，原因在于本人认为，命令可以在命令行很方便查看，但看了命令不等于你会用了这些工
具。所以不要期待本文能讲解给你多少CVS命令。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文章分为两大部分：第一部分主要讲述CVS平台的搭建；第二部分主要讲解如何应用搭建好的CVS做开发，文章偏重对Java程序程序的开发，其实别的语言也可以用CVS，都是一样的。</font></div>
<div>&nbsp;</div>
<div><font size="2"><strong><font color="#ff0000" size="3">目录</font></strong></font></div>
<div><font size="2"><strong><font color="#ff0000" size="3"><br />
</font></strong>目录&nbsp;1</font></div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>第一部分<br />
</strong>一、&nbsp;环境：&nbsp;1<br />
二、&nbsp;概述&nbsp;2<br />
三、&nbsp;软件安装&nbsp;2<br />
四、&nbsp;CVSNT服务器端的配置&nbsp;2<br />
（一）、仓库配置&nbsp;2<br />
（二）、服务器配置&nbsp;6<br />
（三）、兼容性配置&nbsp;7<br />
（四）、插件配置&nbsp;8</font></div>
<div><font size="2">（五）、高级配置&nbsp;8<br />
五、&nbsp;CVS客户端配置&nbsp;9<br />
（一）、TortoiseCVS客户端的配置&nbsp;9<br />
（二）、用CVSNT或者TortoiseCVS命令行命令作为客户端软件操作CVS。&nbsp;14</font></div>
<div><font size="2">&nbsp;</font></div>
<div><font size="2"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二部分</strong><br />
六、&nbsp;CVS应用实践&nbsp;15<br />
（一）、CVSNT＋Eclipse的CVS的配置&nbsp;15<br />
（二）、CVSNT＋IntelliJ IDEA 5.12的CVS的配置&nbsp;29<br />
总结&nbsp;43<br />
声明&nbsp;44</font></div>
<div>&nbsp;</div>
<div><font size="2"><font color="#ff0000" size="3"><strong>一、&nbsp;环境：</strong></font></font></div>
<div><font size="2"><br />
Windows XP/2003<br />
CVSNT 2.5.03 (Scorpio) Build 2382<br />
TortoiseCVS 1.8.26<br />
Eclipse 3.2<br />
IntelliJ IDEA 5.12</font></div>
<div>&nbsp;</div>
<div><font color="#ff0000" size="3"><strong>二、&nbsp;概述</strong></font></div>
<div>&nbsp;</div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CVS 是 Concurrent Version
System（并行版本系统）的缩写，用于版本管理．如果大家曾经参与过多人协作开发的项目，大家肯定有这样的痛苦经历：由于多个人同时修改同一个文件，
自己辛辛苦苦修改的程序被别人彻底删除了．另外，如果你的软件/程序已经发布了三个版本，而这时候用户需要你修改第二个版本的东西，也许你会因为只保留了
最新版本而痛哭流涕。还有就是你对程序做了一些修改，但是修改很少，你只想给远方的同事发一个两个版本之间的差别文件，这样可以免于邮箱不够大，网速太慢
之类的问题．为了解决类似这样的问题，以及诸如生成补丁文件，历史版本修改等，一帮黑客（褒义）在原先 Unix 体系里很成熟的 SCCS 和 RCS
的基础上，开发了 CVS。(SCCS：Source Code Control System，RCS：Revision Control
System）。</font></div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
我们知道，CVS是使用&#8220;客户端/服务器&#8221;（Client/Server）模式来工作的，这也是优秀版本控制系统的发展趋势。那么我们首先要有一台CVS
服务器（当然这台电脑也可以同时作为客户端来使用）。本节所要介绍的就是如何利用CVSNT架设一台windows操作系统环境下的CVS服务器。
CVSNT顾名思义，肯定是用在windows上的，此软件可以从</font><a href="http://www.cvsnt.org/"><font size="2">[url]www.CVSNT.org[/url]</font></a><font size="2">免费下载最新版本。</font></div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CVS
的基本工作思路是这样的：在一台服务器上建立一个仓库，仓库里可以存放许多不同项目的源程序。由仓库管理员统一管理这些源程序．这样，就好象只有一个人在
修改文件一样．避免了冲突．每个用户在使用仓库之前，首先要把仓库里的项目文件下载到本地。用户做的任何修改首先都是在本地进行，然后用 cvs
命令进行提交，由 cvs 仓库管理员统一 修改．这样就可以做到跟踪文件变化，冲突控制等等。</font></div>
<div>&nbsp;</div>
<div><font color="#ff0000" size="3"><strong>三、&nbsp;软件安装</strong></font></div>
<div>&nbsp;</div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、&nbsp;目的：用CVSNT作为CVS服务器，用TortoiseCVS作为CVS的客户端。Eclipse3.2和Intellij IDEA 5.12这些开发工具也自带有标准的CVS客户端，这些客户端都是通用的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、&nbsp;软件的安装：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 软件的安装很简单，先安装CVSNT，再安装TortoiseCVS。默认安装即可。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在此，安装软件路径分别为：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CVSNT安装到D:"Program Files"cvsnt<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TortoiseCVS安装到D:"Program Files"TortoiseCVS<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 安装完成后，重新启动计算机。</font></div>
<div>&nbsp;</div>
<div><font size="2"><font color="#ff0000" size="3"><strong>四、&nbsp;CVSNT服务器端的配置</strong></font><br />
</font></div>
<div><font size="2"><strong>（一）、仓库配置</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、&nbsp;打开CVSNT的控制面板，运行开始菜单CVSNT菜单文件夹里的&#8220;CVSNT Control Panel&#8221;即可。如下图<br />
&nbsp;<img alt="" src="http://img1.51cto.com/attachment/200703/200703051173087140743.png" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2、&nbsp;如上图，确保CVSNT的两个服务启动正常，单击选项卡&#8220;Repository
configuration&#8221;（仓库配置）。CVS仓库是代码的每个版本和所有相关记录在服务器端的储存地。有些时候又称它为主拷贝（Master
Copy)，为什么呢，我们将在后面的章节中了解到。在创建CVS仓库之前，我们首先需要新建一个文件夹用于充当仓库。如下图，创建仓库文件夹
I:"mycvsdata。<br />
<img alt="" src="http://img1.51cto.com/attachment/200703/200703051173087157707.png" border="0" />&nbsp;</font></div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3、&nbsp;该文件夹最好不要与程序放在一起，以免万一系统崩溃时破坏数据。然后，点击&#8220;开始&#8221;-&gt;&#8220;程序&#8221;-&gt;&#8220;CVS for
NT&#8221;-&gt;&#8220;configure server&#8221;，出现对话框后选择&#8220;Repositories&#8221;选项卡，就会出现如下对话框<br />
<img alt="" src="http://img1.51cto.com/attachment/200703/200703051173087251572.png" border="0" />&nbsp;</font></div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、&nbsp;如上图，因为是本地计算机上架设CVS服务器，所以填写127.0.0.1，也可以填写为localhost；然后单击&#8220;Add&#8221;（添加），添加一个仓库，然后再单击&#8220;添加&#8221;按钮，浏览刚才新建的仓库文件夹I:"mycvsdata如下图：<br />
<img alt="" src="http://img1.51cto.com/attachment/200703/200703051173087266123.png" width="650" border="0" />&nbsp;&nbsp; </font></div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、&nbsp;如上右图，单击&#8220;确定&#8221;按钮：<br />
&nbsp;<img alt="" src="http://img1.51cto.com/attachment/200703/200703051173087280934.png" width="650" border="0" />&nbsp; </font></div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、&nbsp;如上右图，单击&#8220;OK&#8221;按钮，会提示：<br />
<img alt="" src="http://img1.51cto.com/attachment/200703/200703051173087291730.png" border="0" />&nbsp;</font></div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7、&nbsp;如上图，单击&#8220;是&#8221;，就初始化文件夹作为仓库文件夹了，初始化后，在文件夹里面会生成一个CVSROOT的文件夹，里面有好多的文件和子夹，都是仓库的配置信息。此时仓库配置选项卡如下图：<br />
<img alt="" src="http://img1.51cto.com/attachment/200703/200703051173087303997.png" border="0" />&nbsp;</font></div>
<div><font size="2"><strong>（二）、服务器配置</strong></font></div>
<div><font size="2"><strong><br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、&nbsp;&nbsp;单击&#8220;Server Settings（服务器配置）&#8221;选项卡，<br />
<img alt="" src="http://img1.51cto.com/attachment/200703/200703051173087329124.png" border="0" />&nbsp;&nbsp;&nbsp;<br />
</font></div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、&nbsp;如上图，保持默认选项即可。</font></div>
<div><font size="2"><br />
<strong>（三）、兼容性配置</strong></font></div>
<div>&nbsp;</div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、&nbsp;单击&#8220;Compatibility Options（兼容性配置）&#8221;选项卡：</font></div>
<div><font size="2"><img alt="" src="http://img1.51cto.com/attachment/200703/200703051173087374389.png" border="0" /><br />
&nbsp;<br />
<strong>（四）、插件配置<br />
</strong></font></div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、&nbsp;&nbsp;单击&#8220;Plugins（插件）&#8221;选项卡，<br />
<img alt="" src="http://img1.51cto.com/attachment/200703/200703051173087389490.png" border="0" />&nbsp;</font></div>
<div><font size="2"><br />
<strong>（五）、高级选项</strong></font></div>
<div><font size="2"><strong><br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、&nbsp;单击&#8220;Advanced（高级）&#8221;选项卡，如下图，保持默认即可。<br />
&nbsp;<img alt="" src="http://img1.51cto.com/attachment/200703/200703051173087404151.png" border="0" /></font></div>
<div>&nbsp;</div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、&nbsp;单击&#8220;确定&#8221;，完成服务器的配置。</font></div>
<div>&nbsp;</div>
<div><font color="#ff0000" size="3"><strong>五、&nbsp;CVS客户端配置</strong></font></div>
<div><font size="2"><br />
<strong>（一）、TortoiseCVS客户端的配置<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、&nbsp;TortoiseCVS是最佳的CVS客户端软件，使用方便。为了演示配置，先建立一个工程文件夹C:"testprjcvs，然后建立一个文本文件test.txt。如图：<br />
<img alt="" src="http://img1.51cto.com/attachment/200703/200703051173087551684.png" border="0" /></font></div>
<div>&nbsp;</div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、&nbsp;添加项目模块，也就是把项目添加到CVS仓库。方法如下，在项目文件夹上点击右键，按下图操作：<br />
<img alt="" src="http://img1.51cto.com/attachment/200703/200703051173087563531.png" width="650" border="0" /></font></div>
<div>&nbsp;</div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、&nbsp;点击&#8220;创建新模块&#8221;后，会弹出，按照<br />
<img alt="" src="http://img1.51cto.com/attachment/200703/200703051173087582558.png" border="0" /></font></div>
<div>&nbsp;</div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、&nbsp;如上图，填写完成后，单击&#8220;确认&#8221;，项目添加到仓库，并提示：<br />
<img alt="" src="http://img1.51cto.com/attachment/200703/200703051173087592032.png" border="0" /></font></div>
<div>&nbsp;</div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、&nbsp;单击确定，完成添加。察看C:"testprjcvs，发现上面有个绿色标记，说明项目已经成功添加到仓库了。分别看项目文件夹、仓库文件夹如下：<br />
<img alt="" src="http://img1.51cto.com/attachment/200703/200703051173087602437.png" width="650" border="0" />&nbsp;</font></div>
<div>&nbsp;</div>
<div><font size="2"><img alt="" src="http://img1.51cto.com/attachment/200703/200703051173087618790.png" width="650" border="0" /></font></div>
<div>&nbsp;</div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、&nbsp;打开项目文件夹，添加一个文件到仓库，操作过程如下，在<br />
<img alt="" src="http://img1.51cto.com/attachment/200703/200703051173087629586.png" width="650" border="0" /></font></div>
<div>&nbsp;</div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7、&nbsp;出现提示，因为是文本文件，所以单击确定，完成添加。<br />
</font></div>
<div><img alt="" src="http://img1.51cto.com/attachment/200703/200703051173087715549.png" width="650" border="0" /></div>
<div>&nbsp;</div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8、&nbsp;添加后，还需要提交操作，才能将文件加入到CVS，右键单击test.txt的文件，提交，也可以在空白处单击右键，选择提交，提交所有的没有提交的操作。<br />
</font></div>
<div><img alt="" src="http://img1.51cto.com/attachment/200703/200703051173087726966.png" width="650" border="0" /></div>
<div>&nbsp;</div>
<div><font size="2"><strong>（二）、用CVSNT或者TortoiseCVS命令行命令作为客户端软件操作CVS。</strong></font></div>
<div><font size="2"><strong><br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、&nbsp;将CVSNT或者TortoiseCVS安装目录添加到系统变量CVSNT或者TortoiseCVS中<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、&nbsp;为了操作方便，可以设置一个环境变量CVSROOT=:pserver:yutian@localhost:2401/mycvsdata，然后从命令行用命令进行登陆，命令如下：<br />
cvs login<br />
然后输入密码<br />
然后就可以通过命令行可以执行cvs的各种操作了。在此不做详细介绍。<br />
</font></div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000"> <font color="#ff00ff">注意</font>：CVSROOT的写法是：</font></font></div>
<div><font size="2"><font color="#0000ff">:pserver:username@hostname（或IP地址）:CVS仓库路径</font><font color="#008000"><br />
这个格式是绝对不能错的，否则CVS命令就不能正常执行。</font></font></div>
<div><font size="2"><font color="#008000"><br />
<font color="#ff00ff">下面我解释一下上面的字符串的含义：</font><br />
1、&#8220;pserver&#8221; 是最常用的一直CVS远程访问方式； <br />
2、&#8220;username&#8221; 是指客户端在服务器上的用户名，也就是我们在上面的&#8220;配置CVS帐号&#8221;一结中讲到的； <br />
3、&#8220;hostname&#8221; 是CVS服务器的主机名，也可以是它的IP地址； <br />
4、&#8220;CVS仓库路径&#8221; 是一个CVS仓库所在的目录，用于区分你要访问的是哪个仓库（因为一个CVS服务器上可能有多个不同仓库）。 <br />
例如：:pserver:leizhimin@icisserver:/zfvims</font></font></div>
<div><font size="2"><font color="#008000">&nbsp;</font></font></div>
<div><font size="2"><font color="#008000">（第一部分完）<br />
</font></font>原文：http://lavasoft.blog.51cto.com/62575/19274<br />
</div>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/348517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-04-18 20:32 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/04/18/348517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CVS和SVN的区别</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/04/18/348516.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Mon, 18 Apr 2011 12:13:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/04/18/348516.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/348516.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/04/18/348516.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/348516.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/348516.html</trackback:ping><description><![CDATA[<p>http://blog.csdn.net/sfdev/archive/2008/08/26/2835073.aspx</p>
<p>前段时间部门内部PCM就SVN的代码管理和大家进行了分享，中途提到一个问题，就是和CVS相比，到底SVN有何优势，因为公司内部很早就开始用SVN了，所以很多同事都没有经历过CVS的时代；</p>
<p>偶在前一家公司的时候曾经用过CVS，就从开发人员的使用角度来说差别并不明显，我能想起来的也就是两三点：1、CVS对目录的管理非常不友好，无法跟踪目录的变动情况；2、文件无法重命名提交；3、对二进制文件（比如图片）的管理不好，代码合并时经常问题；</p>
<p>那具体两者间的差别有哪些呢？这几天从网上搜罗了一些，贴在这里供大家参考：</p>
<table style="width: 100%;" border="1" cellpadding="1" cellspacing="1">
    <tbody>
        <tr>
            <td><br />
            </td>
            <td>CVS</td>
            <td>SVN</td>
        </tr>
        <tr>
            <td>关于版本号</td>
            <td>基于文件的自增序列号。</td>
            <td>基于全局的自增序列号，而不仅仅针对文件，还包括目录等。</td>
        </tr>
        <tr>
            <td>存储类型格式</td>
            <td>CVS是个基于RCS文件的版本控制系统。每个CVS文件都不过是普通的文件，加上一些额外信息。这些文件会简单的重复本地文件的树结构。因此，不必担心有什么数据损失，如果必要的话你可以手工修改RCS文件。</td>
            <td>SVN是基于关系数据库的(BerkleyDB)或一系列二进制文件的(FS_FS)。一方面这解决了许多问题
            (例如，并行读写共享文件)以及添加了许多新功能(例如运行时的事务特性。)。然而另一方面，数据存储由此变得不透明，或是说并不那么用户友好了。那就是
            为什么工具软件，对仓库 (数据库)变得那么重要了。</td>
        </tr>
        <tr>
            <td>访问速度</td>
            <td>比较慢；因为他基于单向（服务端--&gt;客户端）差异化文件传输</td>
            <td>整体而言,由于架构实现的不同, SVN的确比CVS快很多；因为采用双向差异化文件传输。<br />
            在网络上它只传输很少的信息并支持更多的离线模式的功能。但这也是有代价的。速度的代价就是巨大的存储（完全备份所有的工作文件）。</td>
        </tr>
        <tr>
            <td>元数据</td>
            <td>只允许存储文件</td>
            <td>允许一个文件有任意都的可命名属性。功能十分完全，但不知到底有什么用</td>
        </tr>
        <tr>
            <td>文件类型</td>
            <td>最初是为文本文件存储而设计的。因此其他文件类型（二进制，统一码）文件的支持几乎没有如需要的话则要有其他信息，并且客户端服务器端都要调整。</td>
            <td>SVN会关心所有的文件类型，不需要你来手工操作；因为他的存储是基于二进制的</td>
        </tr>
        <tr>
            <td>滚回</td>
            <td>CVS允许任意的滚回，在任意一个已递交的版本上，尽管着要华些时间（所有的文件都要分别处理）。</td>
            <td>SVN不允许递交后滚回。我们建议把仓库里好的状态版本加到末尾，覆盖掉损坏的版本。而损坏的版本无论如何也是会存在数据库里的。</td>
        </tr>
        <tr>
            <td>事务</td>
            <td>CVS中的
            &#8220;零或一&#8221;事务原则根本没有实现。如果检入几个文件的话（加到服务器上），很有可能部分文件完成了，而另几个没有。最为一个潜规则，手工纠正这些并且对余
            下的文件 (而不是所有文件)一一重复检入。这样这些文件将在两阶段中被检入。但至今为止，因为这个功能缺少而导致的数据仓库损坏的案例还没有出现过。</td>
            <td>支持&#8220;零或一&#8221;事务原则，这是SVN的一大优势</td>
        </tr>
        <tr>
            <td>架构、代码、可扩展性</td>
            <td>CVS是个古老的系统。起初CVS只是一些运用RCS的脚本文件。后来这些脚本被组成一个单个应用程序，但内部结构仍然有待改进。直到今天，仍有
            人企图从头开始，重写一遍CVS,但都不成功。我们曾经尝试国重写客户端代码以期更好的集成效果，但是，不成功。现在我们都不认为CVS在功能上能走到多
            远了。</td>
            <td>Subversion的开发员的确花了许多时间在内部架构上。我们仍然不知道这些决策有多大的正确性等等。但有一点可以肯定，代码有良好的可扩展性，增强工作也在进行着。</td>
        </tr>
        <tr>
            <td>网络层</td>
            <td>不能与Apache Web Server集成</td>
            <td>有抽象的档案库存取概念, 可以让人很容易地实作新的网络机制. Subversion &#8220;先进&#8221; 的网络服务器, 是 Apache
            网页服务器的一个模块,它以称为 WebDAV/DeltaV 的 HTTP 变体协议与外界沟通. 这对Subversion
            的稳定性与互通性有很大的帮助, 而且额外提供了许多重要功能: 举例来说, 有身份认证, 授权, 在线压缩, 以及档案库浏览. 另外也有小而独立的
            Subversion 服务器程序, 使用的是自订的通讯协议, 可以很容易地透过 ssh 以 tunnel 方式使用</td>
        </tr>
        <tr>
            <td>重命名、删除操作</td>
            <td>不支持本地文件重命名提交；<br />
            删除分remove和erase两种前者把本地和库中文件都删除，后者只是删除本地文件；<br />
            不能删除文件夹</td>
            <td>支持文件重命名提交系统会提示删除旧文件，创建新文件<br />
            删除本地文件提交 库中文件也被删除</td>
        </tr>
        <tr>
            <td>用户访问权限</td>
            <td>有read、write、creat、none这四种权限，任何人不能删除文件夹（admin也只能跑到服务器上把相应文件夹残忍删除？我暂时只知道这个方法&#8230;&#8230;）</td>
            <td>只有read、write、none三种权限 creat和delete权限好象和write是捆绑在一起的</td>
        </tr>
        <tr>
            <td>创建分支与基线</td>
            <td>CVS 在创建分支的时候，需要对所有进行分支的文件进行依次的操作，因此分支的建立成本（主要是建立分支所需的时间，或消耗的计算资源）与参与分支的文件数量成比例，项目越大，版本库越大，文件越多，分支的建立成本越高；基线（tag）的建立与此类似。</td>
            <td>SVN
            的分支和基线是通过执行&#8220;拷贝&#8221;来建立的：回想一下在没有引入版本管理工具的时候我们是如何进行所谓的&#8220;分支&#8221;和&#8220;基线&#8221;管理的？答案显然是&#8220;拷贝&#8221; —
            我们通过&#8220;拷贝&#8221;或&#8220;备份&#8221;来建立基线；同样，为支持多个开发人员可以同时进行开发，我们为每个开发人员创建一份&#8220;拷贝&#8221;。</td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/348516.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-04-18 20:13 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/04/18/348516.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows 环境搭建CVS--------------CVSNT-2.5.03与TortoiseCVS-1.8.25配置方法记录</title><link>http://www.blogjava.net/jasmine214--love/archive/2011/04/18/348514.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Mon, 18 Apr 2011 11:02:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2011/04/18/348514.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/348514.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2011/04/18/348514.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/348514.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/348514.html</trackback:ping><description><![CDATA[<div id="blog_text" class="cnt"><strong><font face="宋体">原文：</font></strong>http://hi.baidu.com/tomclub/blog/item/bd2fd4885f229a92a4c272e9.html
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">安装<span style="font-size: 10.5pt;">CVSNT-2.5.03</span></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">下载<span style="font-size: 10.5pt;">CVSNT</span><span style="font-size: 10.5pt;">，从网站</span><span style="font-size: 10.5pt;"><a href="http://www.march-hare.com/cvspro/"><span style="color: #0000ff; text-decoration: underline;">http://www.march-hare.com/cvspro/</span></a></span><span style="font-size: 10.5pt;">上下载软件，</span></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">我下载的是<span style="font-size: 10.5pt;">cvsnt-2.5.03.2260.msi</span><span style="font-size: 10.5pt;">。</span></span></font></font></p>
<p><span style="font-size: 10.5pt;"><font face="宋体" size="3">运行安装文件，</font></span></p>
<p><font face="宋体"><font size="3"> <span style="font-size: 10.5pt;"><span style="font-size: 10.5pt;"><span style="font-size: 10.5pt;"><span style="font-size: 12pt;"><span style="font-size: 10.5pt;"><img style="cursor: pointer;" src="http://tk.files.storage.msn.com/x1pNWjjkHJ3o_yOFf_GF28Z7b6y8d-ujd8RFkDWpRQtSndLexOo8VMCafCSjwWjxNlDotNLxvqlW9MKoSplzn64mRqqnmCL-fLKu6qjPA_Wr2GaSIN1awUjPYQZNDQvbIICE4FZPNGOsDY" width="420" height="330"  alt="" /></span></span></span></span></span></font></font></p>
<p><font face="宋体"><font size="3"> <span style="font-size: 10.5pt;">单击<span style="font-size: 10.5pt;">&#8220;<span style="text-decoration: underline;">N</span>ext &gt;&#8221;</span></span></font></font></p>
<p><span style="font-size: 10.5pt;"><font face="宋体" size="3"><img style="cursor: pointer;" src="http://tk.files.storage.msn.com/x1pNWjjkHJ3o_yOFf_GF28Z7VynE8ID55HPLqPkk4CR5oHMxmO425iGjGbbNHPRUhFH_CIuT2TsU5gcB24Yf8UKWUBharUpxhfVpZFLkMBNotRA_orWQ-SCi-I0tMxdbdbpBu7wDphBm00" width="420" height="330"  alt="" /></font></span></p>
<p><font face="宋体"><font size="3"> <span style="font-size: 10.5pt;">选择<span style="font-size: 10.5pt;">&#8220;I <span style="text-decoration: underline;">a</span>ccept the terms in the License Agreement&#8221;</span><span style="font-size: 10.5pt;">核选项</span></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">单击<span style="font-size: 10.5pt;">&#8220;<span style="text-decoration: underline;">N</span>ext &gt;&#8221;</span></span></font></font></p>
<p><span style="font-size: 10.5pt;"><font face="宋体" size="3"><img style="cursor: pointer;" src="http://tk.files.storage.msn.com/x1pNWjjkHJ3o_yOFf_GF28Z7Sa4r0B3t9CM-sDqGz8zzHIZz1MpbOdxeEEAjRU_MQ3whwjv8WuwYix92nmg6v7dks-f39GPHL7H2G9ifVPZLpytUlu26QizSyBfoIXBhmrPsz4fGvaBt2k" width="420" height="330"  alt="" /></font></span></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">选择安装模式，这里我选择的是<span style="font-size: 10.5pt;">&#8220;C<span style="text-decoration: underline;">o</span>mplete&#8221;</span></span></font></font></p>
<p><span style="font-size: 10.5pt;"><font face="宋体" size="3"><img style="cursor: pointer;" src="http://tk.files.storage.msn.com/x1pNWjjkHJ3o_yOFf_GF28Z7UGafGtxobxojstVpdEfLJMziiT_zfXbZ3PYACnFvBNsLNz66XakIxF6YTmiFB9oQQQey1AWSPjFMcdrO8oAs4avi7dSQY8I0MR6gMTj5LNuAAa5rYhUUmA" width="420" height="330"  alt="" /></font></span></p>
<p><font face="宋体"><font size="3"> <span style="font-size: 10.5pt;">单击<span style="font-size: 10.5pt;">&#8220;<span style="text-decoration: underline;">I</span>nstall&#8221;</span></span></font></font></p>
<p><span style="font-size: 10.5pt;"><font face="宋体" size="3"><img style="cursor: pointer;" src="http://tk.files.storage.msn.com/x1pNWjjkHJ3o_yOFf_GF28Z7SjaZl93f2jcGfiF8B3YkNNdRzBB7HxQudz5CLJrdhJetepagPFM8YnAlx1IqHboO6fhAq1Bx8NGSAXWIAd2jzSLGLCK46-JV3lvk8NURD4J8miiSlB8PbM" width="420" height="330"  alt="" /></font></span></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">单击<span style="font-size: 10.5pt;">&#8220;<span style="text-decoration: underline;">F</span>inish&#8221;</span></span></font></font></p>
<p><span style="font-size: 10.5pt;"><font face="宋体" size="3"><img style="cursor: pointer;" src="http://tk.files.storage.msn.com/x1pNWjjkHJ3o_yOFf_GF28Z7QE98gc6C7GU0JlhOMILxaunCzbeOf0y_-Gn9QT9nPVPyyDu-1pMSSKRC7wFC_sBgAoQBru7wOxCko734XdRgc2Mv3SyHgFVWUTbaSLsraMIH5t8eXZRWYA"  alt="" /></font></span></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">单击<span style="font-size: 10.5pt;">&#8220;<span style="text-decoration: underline;">Y</span>es&#8221;</span><span style="font-size: 10.5pt;">重起电脑（注意保存未保存的资料）</span></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">====================<span style="font-size: 10.5pt;">重起</span><span style="font-size: 10.5pt;">========================</span></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">建立数据仓库</span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">打开<span style="font-size: 10.5pt;">&#8220;</span><span style="font-size: 10.5pt;">开始</span><span style="font-size: 10.5pt;">&#8221;-&gt;&#8220;</span><span style="font-size: 10.5pt;">所有程序</span><span style="font-size: 10.5pt;">&#8221;-&gt;&#8220;CVSNT&#8221;-&gt;&#8220;CVSNT Control Panel&#8221;</span></span></font></font></p>
<p><span style="font-size: 10.5pt;"><font face="宋体" size="3"><img style="cursor: pointer;" src="http://tk.files.storage.msn.com/x1pNWjjkHJ3o_yOFf_GF28Z7cISUPK8Xj0y3jFj3dezidOJmLatsAFyAcborh3Aiv9CbuaPlvp3c5LYXUARlvvy5nQ7P_jv6Ydu9FZokzMYB3dEpLHJ-4t1qmOuieGYgqFescdoyC5zj5g" width="420" height="269"  alt="" /></font></span></p>
<p><font face="宋体"><font size="3"> <span style="font-size: 10.5pt;">选择<span style="font-size: 10.5pt;">&#8220;Repository configuration&#8221;</span><span style="font-size: 10.5pt;">页面</span></span></font></font></p>
<p><span style="font-size: 10.5pt;"><font face="宋体" size="3"><img style="cursor: pointer;" src="http://tk.files.storage.msn.com/x1pNWjjkHJ3o_yOFf_GF28Z7fd4MP4AlWvGsXQJqQbciLH5d5-hk1ZAuCwk2xJDCxDJd7w7V9AUa8xzAVKxyCrxVl9TK6aCZjuudRmRjFTZ82uphjsE9hKOPuWvPlE_LtJH" width="420" height="269"  alt="" /></font></span></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">单击<span style="font-size: 10.5pt;">&#8220;<span style="text-decoration: underline;">A</span>dd&#8221;</span><span style="font-size: 10.5pt;">按钮</span></span></font></font></p>
<p><span style="font-size: 10.5pt;"><font face="宋体" size="3"><img style="cursor: pointer;" src="http://tk.files.storage.msn.com/x1pNWjjkHJ3o_yOFf_GF28Z7UMU0zoH4CWOU0sn7Fuo4CIWDsyZsfgqk42nLr3mGzVUgteF5-zj7FyfU3UUDsDjfGWPqVMlh_AyKjtefz9UxeKdsTY8oy_d_aRT3EM5fkhNNb2Rf-6FX9M"  alt="" /></font></span></p>
<p><font face="宋体"><font size="3"> <span style="font-size: 10.5pt;">单击<span style="font-size: 10.5pt;">&#8220;Location&#8221;</span><span style="font-size: 10.5pt;">后面的</span><span style="font-size: 10.5pt;">&#8220;&#8230;&#8221;</span><span style="font-size: 10.5pt;">按钮选择建立仓库的位置</span></span></font></font></p>
<p><span style="font-size: 10.5pt;"><font face="宋体" size="3"><img style="cursor: pointer;" src="http://tk.files.storage.msn.com/x1pNWjjkHJ3o_yOFf_GF28Z7QxhMFXAus7XNEF6vxOqbYyK6DzSpcsXwqyOIwK-gyBrW3ONGW68RzmGCPjP0sA1tZNZ83rgdip-R0BNs7l2hzeGVj94pYbRAACsXXBN0JLCx8wXnmxZYKU"  alt="" /></font></span></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">单击<span style="font-size: 10.5pt;">&#8220;OK&#8221;</span><span style="font-size: 10.5pt;">按钮，出现询问是否要初始化的对话框。</span></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt; color: red;">注意<span style="font-size: 10.5pt; color: red;">1</span><span style="font-size: 10.5pt; color: red;">：选择的路径对应的文件夹下不能有名为</span><span style="font-size: 10.5pt; color: red;">&#8220;CVSROOT&#8221;</span><span style="font-size: 10.5pt; color: red;">的文件夹，否则不会弹出下面的对话框。</span></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt; color: red;">注意<span style="font-size: 10.5pt; color: red;">2</span><span style="font-size: 10.5pt; color: red;">：如果服务器与客户端在同一电脑上，又在同一工作硬盘分区上的话，不要使硬盘分区上存在</span><span style="font-size: 10.5pt; color: red;">CVS</span><span style="font-size: 10.5pt; color: red;">目录，该目录被保留为客户端的临时目录。</span></span></font></font></p>
<p><span style="font-size: 10.5pt; color: red;"><span style="font-size: 10.5pt;"><span style="font-size: 10.5pt;"><font face="宋体" size="3"><img style="cursor: pointer;" src="http://tk.files.storage.msn.com/x1pNWjjkHJ3o_yOFf_GF28Z7fHw2TBma3IAOsQSdJpj7cru5JUsNqHCzMfcyYHimCrnsT-8rkJQ6ZMGkgWWGMik68YD0ecgEt7NeIVAXCHulCMUFmtl5VHnq3pSJWLBjLfT"  alt="" /></font></span></span></span></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">单击<span style="font-size: 10.5pt;">&#8220;</span><span style="font-size: 10.5pt;">是</span><span style="font-size: 10.5pt;">(<span style="text-decoration: underline;">Y</span>)&#8221;</span><span style="font-size: 10.5pt;">按钮初始化。</span></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;"><img style="cursor: pointer;" src="http://tk.files.storage.msn.com/x1pNWjjkHJ3o_yOFf_GF28Z7fjXaKl26_dEzu8ZayXpG2PJbHskG1OqQLP7ml-PVhsbEu-aPlj4FBBrKzZNytdKvNqBD-sRsf6wofa-14U1uYH8NDkJS0GNpmb0AmPwJ2cr-hnKRSpB-io" width="420" height="269"  alt="" /></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">单击<span style="font-size: 10.5pt;">&#8220;</span><span style="font-size: 10.5pt;">确定</span><span style="font-size: 10.5pt;">&#8221;</span><span style="font-size: 10.5pt;">按钮退出程序。</span></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">测试服务器是否安装成功</span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">开始菜单<span style="font-size: 10.5pt;">-&gt;run-&gt;cmd</span><span style="font-size: 10.5pt;">，进入命令行环境</span></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;"><img style="cursor: pointer;" src="http://tk.files.storage.msn.com/x1pNWjjkHJ3o_yOFf_GF28Z7a5EzsO0gbC91_UJ68wwoJ-FHbwiiuMlS3vcGXahlzZqAXW9C-LNj9XFP5f21jtSPKXWjUixuSvvJf0s8A1DSk3Yv8gQ81c55dULafXf1Nel" width="420" height="74"  alt="" /></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">输入<span style="font-size: 10.5pt;">&#8220;CVS&#8221;</span><span style="font-size: 10.5pt;">，会出现相应的帮助，如果没出现，说明环境变量中的</span><span style="font-size: 10.5pt;">Path</span><span style="font-size: 10.5pt;">值没有设置，你可以手动设置到文件所在的目录</span></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;"><img style="cursor: pointer;" src="http://tk.files.storage.msn.com/x1pNWjjkHJ3o_yOFf_GF28Z7Vc5FFEkAyAk1NhFwKxy5RFIaA42QoRGKF2oOgPfUmASDcWhYIwEG6bl_9P07UvL9Cg7LyeC6-Sq_Tr_HkiS3adEibBW8Hg7vU2PmmUVSvpOmE2G4ZINso0" width="420" height="185"  alt="" /></span></font></font></p>
<p><font face="宋体"><font size="3"> <span style="font-size: 10.5pt;">输入：<span style="font-size: 10.5pt;">&#8220;</span><span style="font-size: 10.5pt;">set cvsroot=:sspi</span><span style="font-size: 10.5pt;">:localhost:/cvsdata&#8221;</span></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">（最后一个冒号后面的<span style="font-size: 10.5pt;">&#8220;/cvsdata&#8221;</span><span style="font-size: 10.5pt;">是前面设置的</span><span style="font-size: 10.5pt;">Repository</span><span style="font-size: 10.5pt;">名字）</span></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;"><img style="cursor: pointer;" src="http://tk.files.storage.msn.com/x1pNWjjkHJ3o_yOFf_GF28Z7YqZvO3_osJ4YltpiTelp0rYErM81F2vW0pz5ndtG0vg8DddgZyckHNneW60bXy3JiRFEs2kMM0l8YYHitqXhZDqXp75IRVzdcC_WYjJtl_tlunKWJFMoJ4" width="420" height="84"  alt="" /></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">输入<span style="font-size: 10.5pt;">&#8220;cvs version&#8221; ,</span><span style="font-size: 10.5pt;">显示当前</span><span style="font-size: 10.5pt;">CvsNt</span><span style="font-size: 10.5pt;">版本号</span></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;"><img style="cursor: pointer;" src="http://tk.files.storage.msn.com/x1pNWjjkHJ3o_yOFf_GF28Z7X86nnx5a-ZOfxV42hlf2Z2Rw8pr5y-w2_aoaRtLV2DFOXFAOdVdZkCy9r7SYKubCavMIVuGE9jsCjjbEFKSad-1KhWs0splVAhxk-Ugse1vBTtD8qzhQlM" width="420" height="95"  alt="" /></span></font></font></p>
<p><font face="宋体"><font size="3"> <span style="font-size: 10.5pt;">输入<span style="font-size: 10.5pt;">&#8220;</span><span style="font-size: 10.5pt;">cvs login</span><span style="font-size: 10.5pt;">&#8221;</span><span style="font-size: 10.5pt;">，并输入</span><span style="font-size: 10.5pt;">windows</span><span style="font-size: 10.5pt;">的登录密码</span></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;"><img style="cursor: pointer;" src="http://tk.files.storage.msn.com/x1pNWjjkHJ3o_yOFf_GF28Z7dVpGiK1giGoNgj-7p1i8VDWYq3t_lRIdr2WJKI6LA8KyI8k5gpCsI-YrQ1JGUcNusNfnq0JckLyIARlvzW7JFQ4wyI-5gJhH9ouisK0Egs-yWPUpjVcbWM" width="420" height="95"  alt="" /></span></font></font></p>
<p><font face="宋体"><font size="3"> <span style="font-size: 10.5pt;">输入<span style="font-size: 10.5pt;">&#8220;</span><span style="font-size: 10.5pt;">cvs ls</span><span style="font-size: 10.5pt;">&#8221;</span><span style="font-size: 10.5pt;">，显示所有</span><span style="font-size: 10.5pt;">module</span><span style="font-size: 10.5pt;">，至少会有一个</span><span style="font-size: 10.5pt;">CVSROOT</span></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;"><img style="cursor: pointer;" src="http://tk.files.storage.msn.com/x1pNWjjkHJ3o_yOFf_GF28Z7fSUmnp4XLDkhlHj73td2Ag_IXM7yW1O90QbS2cEjmAcCzthY1U5pH9_mT9ackYuWjCfhf4yIKYgyfrOGOAmD7NFEYRzZGy9U_dU4sX_6CIU9yBqodaVMh0" width="420" height="82"  alt="" /></span></font></font></p>
<p><font face="宋体" size="3">&nbsp;&nbsp;</font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">添加用户（<span style="color: red;">实验失败</span><span style="font-size: 10.5pt; color: red;">&#8230;</span><span style="font-size: 10.5pt;">）</span></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">1.<span style="font-size: 10.5pt;">使用</span><span style="font-size: 10.5pt;">cvs passwd</span><span style="font-size: 10.5pt;">命令可以添加用户和修改密码</span></span></font></font></p>
<p><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">2.<span style="font-size: 10.5pt;">可以修改</span><span style="font-size: 10.5pt;"> C:/cvsdata/cvsroot</span><span style="font-size: 10.5pt;">目录下的</span><span style="font-size: 10.5pt;">passwd</span><span style="font-size: 10.5pt;">文件，如果没有的话，可以自己建一个。添加</span><span style="font-size: 10.5pt;"> test:,</span><span style="font-size: 10.5pt;">这样就添加了一个密码为空的</span><span style="font-size: 10.5pt;">test</span><span style="font-size: 10.5pt;">用户了。</span></span></font></font></p>
<div><font face="宋体"><font size="3"><span style="font-size: 10.5pt;">3.<span style="font-size: 10.5pt;">添加用户后可以使用</span><span style="font-size: 10.5pt;">:pserver:test@localhost:/cvs</span><span style="font-size: 10.5pt;">登录了</span></span></font></font></div>
</div>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/348514.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2011-04-18 19:02 <a href="http://www.blogjava.net/jasmine214--love/archive/2011/04/18/348514.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>