<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[Cvs命令行小结]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Thu, 10 Apr 2008 01:29:15 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	1． CVS初始化<br/>-------------<br/>（1） 创建CVSROOT根目录<br/>编辑有关的环境变量，加入CVSROOT的定义（比如在 /etc/bashrc 文件中加入下面两行）：<br/>CVSROOT=/usr/local/cvsroot<br/>eXPort CVSROOT<br/><br/>然后在相应位置开始创建CVSROOT<br/>$cd /usr/local/<br/>$mkdir cvsroot<br/>$cvs –d /usr/local/cvsroot init<br/><br/>这时就会产生/usr/local/cvsroot/CVSROOT 目录，这下面放着有关CVS的配置文件。同时/usr/local/cvsroot/也作为文件仓库存放所有的文件。<br/>(2） 创建开发项目<br/>如果从头开始一个新的项目，就需要创建一个单独的目录，并把所有要使用的文件做一个有效的组织。而如果在开始使用源文件的目录之前就有了，则只需进入该目录就行了。<br/>$cd /work/tang<br/>$ls cvstest<br/>. .. c/<br/>$cd cvstest<br/>然后，就可以输入源文件目录：<br/>$cvs import –m “Create Source Dir” cvstest/c tang cvstest<br/><br/>这样会生成 $CVSROOT/cvstest/c 目录。 其中 -m 用来指定注释信息，如果后面在命令行不指定注释信息，则会启动缺省编辑器（vi）要求输入注释信息。 tang, cvstest分别标识了厂商和发行标识。<br/><br/>注意，使用import命令会把当前目录下的所有文件和目录（包括子目录）引入到文件仓库中指定模块（目录）下。<br/><br/><br/><br/>Cvs命令行小结<br/>一个项目的首次导入 <br/>cvs import -m &quot;write some comments here&quot; project_name vendor_tag release_tag <br/>执行后：会将所有源文件及目录导入到/path/to/cvsroot/project_name目录下 <br/>vender_tag: 开发商标记 <br/>release_tag: 版本发布标记 <br/>项目导出：将代码从CVS库里导出 <br/>cvs checkout project_name <br/>cvs 将创建project_name目录，并将最新版本的源代码导出到相应目录中。这个checkout和Virvual SourceSafe中的check out不是一个概念，相对于Virvual SourceSafe的check out是cvs update， check in是cvs commit。 <br/>CVS的日常使用 <br/>============= <br/>注意：第一次导出以后，就不是通过cvs checkout来同步文件了，而是要进入刚才cvs checkout project_name导出的project_name目录下进行具体文件的版本同步（添加，修改，删除）操作。 <br/>将文件同步到最新的版本 <br/>cvs update <br/>不制定文件名，cvs将同步所有子目录下的文件，也可以制定某个文件名/目录进行同步 <br/>cvs update file_name <br/>最好每天开始工作前或将自己的工作导入到CVS库里前都要做一次，并养成&quot;先同步 后修改&quot;的习惯，和Virvual SourceSafe不同，CVS里没有文件锁定的概念，所有的冲突是在commit之前解决，如果你修改过程中，有其他人修改并commit到了CVS库中，CVS会通知你文件冲突，并自动将冲突部分用 <br/>&gt;&gt;&gt;&gt;&gt;&gt; content on cvs server <br/>&lt;&lt;&lt;&lt;&lt;&lt; <br/>content in your file <br/>&gt;&gt;&gt;&gt;&gt;&gt; 标记出来，由你确认冲突内容的取舍。 <br/>版本冲突一般是在多个人修改一个文件造成的，但这种项目管理上的问题不应该指望由CVS来解决。 <br/>确认修改写入到CVS库里 <br/>cvs commit -m &quot;write some comments here&quot; file_name <br/>注意：CVS的很多动作都是通过cvs commit进行最后确认并修改的，最好每次只修改一个文件。在确认的前，还需要用户填写修改注释，以帮助其他开发人员了解修改的原因。如果不用写-m &quot;comments&quot;而直接确认`cvs commit file_name` 的话，cvs会自动调用系统缺省的文字编辑器(一般是vi)要求你写入注释。 <br/>注释的质量很重要：所以不仅必须要写，而且必须写一些比较有意义的内容：以方便其他开发人员能够很好的理解 <br/>不好的注释，很难让其他的开发人员快速的理解：比如： -m &quot;bug fixed&quot; 甚至 -m &quot;&quot; <br/>好的注释，甚至可以用中文: -m &quot;在用户注册过程中加入了Email地址校验&quot; <br/>修改某个版本注释：每次只确认一个文件到CVS库里是一个很好的习惯，但难免有时候忘了指定文件名，把多个文件以同样注释commit到CVS库里了，以下命令可以允许你修改某个文件某个版本的注释： <br/>cvs admin -m 1.3:&quot;write some comments here&quot; file_name <br/>添加文件 <br/>创建好新文件后，比如：touch new_file <br/>cvs add new_file <br/>注意：对于图片，Word文档等非纯文本的项目，需要使用cvs add -b选项按2进制文件方式导入，否则有可能出现文件被破坏的情况 <br/>比如： <br/>cvs add -b new_file.gif <br/>cvs add -b readme.doc <br/>然后确认修改并注释 <br/>cvs ci -m &quot;write some comments here&quot; <br/>删除文件 <br/>将某个源文件物理删除后，比如：rm file_name <br/>cvs rm file_name <br/>然后确认修改并注释 <br/>cvs ci -m &quot;write some comments here&quot; <br/>以上面前2步合并的方法为： <br/>cvs rm -f file_name <br/>cvs ci -m &quot;why delete file&quot; <br/>注意：很多cvs命令都有缩写形式：commit=&gt;ci; update=&gt;up; checkout=&gt;co/get; remove=&gt;rm; <br/>添加目录 <br/>cvs add dir_name <br/>查看修改历史 <br/>cvs log file_name <br/>cvs history file_name <br/>查看当前文件不同版本的区别 <br/>cvs diff -r1.3 -r1.5 file_name <br/>查看当前文件（可能已经修改了）和库中相应文件的区别 <br/>cvs diff file_name <br/>cvs的web界面提供了更方便的定位文件修改和比较版本区别的方法，具体安装设置请看后面的cvsweb使用 <br/>正确的通过CVS恢复旧版本的方法： <br/>如果用cvs update -r1.2 file.name <br/>这个命令是给file.name加一个STICK TAG： &quot;1.2&quot; ，虽然你的本意只是想将它恢复到1.2版本 <br/>正确的恢复版本的方法是：cvs update -p -r1.2 file_name &gt;file_name <br/>如果不小心已经加成STICK TAG的话：用cvs update -A 解决 <br/>移动文件/文件重命名 <br/>cvs里没有cvs move或cvs rename，因为这两个操作是可以由先cvs remove old_file_name，然后cvs add new_file_name实现的。 <br/>删除/移动目录 <br/>最方便的方法是让管理员直接移动，删除CVSROOT里相应目录（因为CVS一个项目下的子目录都是独立的，移动到$CVSROOT目录下都可以作为新的独立项目：好比一颗树，其实砍下任意一枝都能独立存活），对目录进行了修改后，要求其开发人员重新导出项目cvs checkout project_name 或者用cvs update -dP同步。 <br/>项目发布导出不带CVS目录的源文件 <br/>做开发的时候你可能注意到了，每个开发目录下，CVS都创建了一个CVS/目录。里面有文件用于记录当前目录和CVS库之间的对应信息。但项目发布的时候你一般不希望把文件目录还带着含有CVS信息的CVS目录吧，这个一次性的导出过程使用cvs export命令，不过export只能针对一个TAG或者日期导出，比如： <br/>cvs export -r release1 project_name <br/>cvs export -D 20021023 project_name <br/>cvs export -D now project_name <br/>CVS Branch：项目多分支同步开发 <br/>============================= <br/>确认版本里程碑：多个文件各自版本号不一样，项目到一定阶段，可以给所有文件统一指定一个阶段里程碑版本号，方便以后按照这个阶段里程碑版本号导出项目，同时也是项目的多个分支开发的基础。 <br/>cvs tag release_1_0 <br/>开始一个新的里程碑： <br/>cvs commit -r 2 标记所有文件开始进入2.x的开发 <br/>注意：CVS里的revsion和软件包的发布版本可以没有直接的关系。但所有文件使用和发布版本一致的版本号比较有助于维护。 <br/>版本分支的建立 <br/>在开发项目的2.x版本的时候发现1.x有问题，但2.x又不敢用，则从先前标记的里程碑：release_1_0导出一个分支release_1_0_patch <br/>cvs rtag -b -r release_1_0 release_1_0_patch proj_dir <br/>一些人先在另外一个目录下导出release_1_0_patch这个分支：解决1.0中的紧急问题， <br/>cvs checkout -r release_1_0_patch <br/>而其他人员仍旧在项目的主干分支2.x上开发 <br/>在release_1_0_patch上修正错误后，标记一个1.0的错误修正版本号 <br/>cvs tag release_1_0_patch_1 <br/>如果2.0认为这些错误修改在2.0里也需要，也可以在2.0的开发目录下合并release_1_0_patch_1中的修改到当前代码中： <br/>cvs update -j release_1_0_patch_1<br/>
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] Cvs命令行小结]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>