关于SVN的点点点

1)SVN = 版本控制 + 备份服务器

2)这只是一个工具,版本控制中很多需要人解决的问题,最终还是要人来解决。这在后面会有所说明。因为我也是刚刚才开始使用,所以我从一个使用者的角度来讲解。

3) 使用的SVN工具是TortoiseSVN,Windows下的

4)先讲几个基础的概念

Reporsitory

trunk 开发主干

branch分支副本

tags标记副本

 

import

Check out

Add向Repository加入一些文件,但这只是个意向,还需要commit的动作

Commit

Update

Ignore

 

conflict

补丁

恢复-revert

5)内部存储 差异数据库

SVN的存储,其实质是由差异数据库来存储的,不像我们,将版本复制很多份,因为重复的东西多,所以他们有比较好的算法进行节省空间的存储。

相对于CVS来讲,数据是不透明的。有利有弊

FSFS BerkeleyDB

FSFS是被推荐的

判定修改应该是按行来进行的。

故而如果修改了某行,则即使原内容没有变化,但依然会被判定为修改。

6)版本库结构

在创建文件夹结构的时候,可以默认创建几个文件夹

可再work copy下创建空文件夹,或在版本库浏览器下创建

如果使用版本库浏览器,会看到几个默认的文件夹

branch

tags

trunk

这是有特殊意义的几个文件夹,但是人为规定的意义

 

7)查看历史记录

日志浏览器

对于每次提交的一些状态信息,比如message,date等最好不要修改,一味其不在版本控制的范畴内,故而是不可回复的

版本库浏览器

随时查看下版本库浏览器和日志浏览器,有助于我们的理解。

 

8)冲突的情况

两种冲突:树冲突和文件冲突

文件冲突:当两名(或更多)开发人员修改了同一个文件中相邻或相同的行时就会发生文件冲突。

文件冲突中的属性冲突:在windows中暂时没发现。

 

树冲突:当一名开发人员移动、重命名、删除一个文件或文件夹,而另一名开发人员也对它们进行了移动、重命名、删除或者仅仅是修改时就会发生树冲突。树冲突的解决方法比较麻烦。所以在这样的修改时最好尽量避免。

先说一下几个有代表性的词

 

 

想象一个情景

两人同时修改一个文件:A保存了他的修改,过了一会B也保存的他的修改。引文版本库可以记录改变,故而A的更改不会永久消失,但在最终的版本中没有体现,因为此时是B的版本。这就是版本库最需要避免的情况。这也是一个conflict.

 

锁定-修改-解锁模型

3种情景

A旅行

A改开头,B改结尾,可合并

A和B编辑的文件有所依赖

 

复制-修改-合并模型 强调合并的快捷性

最终要靠人工来确定正误

在后解决conflict

情景A,B同时修改一个文件,A,B同时获取work copy,A修改了提交了,然后B修改了,想要提交,会有过期提示,那就要手动处理这个问题,分两种情况。A和B的修改不重叠,B合并修改,进行提交,解决冲突。这就需要与A进行讨论了。

处理冲突在沟通顺畅的情况下是快捷的,比解锁的不可预知要好很多。

在有不可合并文件时,锁定-修改-解锁模型会更好。故而svn1.2以后的版本还是支持锁定。

9)在访问版本库的时候,支持访问控制功能,版本库不能被随意更改,可能产生不可恢复的情况,故而提交者应该限制访问级别。

版本库的备份。

  ——简单的对比   

SVN的工作机制在某种程度上就像一颗正在生长的树: 一颗有树干和许多分支的树 分支从树干生长出来,并且细的分支从相对较粗的树干中长出 一棵树可以只有树干没有分支(但是这种情况不会持续很久,随着树的成长,肯定会有分支啦,^^) 一颗没有树干但是有很多分支的树看起来更像是地板上的一捆树枝 如果树干患病了,最终分支也会受到影响,然后整棵树就会死亡 如果分支患病了,你可以剪掉它,然后其他分支还会生长出来的哦! 如果分支生长太快了,对于树干它可能会非常沉重,最后整棵树会垮塌掉 当你感觉你的树、树干或者是分支看起来很漂亮的时候,你可以给它照张相,这样就就可以记得它在那时是多么的赞。

——Trunk   

Trunk是放置稳定代码的主要环境,就好像一个汽车工厂,负责将成品的汽车零件组装在一起。   以下内容将告诉你如何使用SVN trunk: 除非你必须处理一些容易且能迅速解决的BUG,或者你必须添加一些无关逻辑的文件(比如媒体文件:图像,视频,CSS等等),否则永远 不要在trunk直接做开发 不要因为特殊的需求而去对先前的版本做太大的改变,如何相关的情况都意味着需要建立一个branch(如下所述) 不要提交一些可能破坏trunk的内容,例如从branch合并 如果你在某些时候偶然间破坏了trunk,bring some cake the next day (”with great responsibilities come… huge cakes”)

——Branches   

一个branch就是从一个SVN仓库中的子树所作的一份普通拷贝。通常情况它的工作类似与UNIX系统上的符号链接,但是你一旦在一个SVN branch里修改了一些文件,并且这些被修改的文件从拷贝过来的源文件独立发展,就不能这么认为了。当一个branch完成了,并且认为它足够稳定的时 候,它必须合并回它原来的拷贝的地方,也就是说:如果原来是从trunk中拷贝的,就应该回到trunk去,或者合并回它原来拷贝的父级branch。   

以下内容将告诉你如何使用SVN branches: 如果你需要修改你的应用程序,或者为它开发一个新的特性,请从trunk中创建一个新的branch,然后基于这个新的分支进行开发 除非是因为必须从一个branch中创建一个新的子branch,否则新的branch必须从trunk创建 当你创建了一个新branch,你应当立即切换过去。如果你没有这么做,那你为什么要在最初的地方创建这个分支呢?

——Tags   

从表面上看,SVN branches和SVN tags没有什么差别,但是从概念上来说,它们有许多差别。其实一个SVN tags就是上文所述的“为这棵树照张相”:一个trunk或者一个branch修订版的命名快照。   

以下内容将告诉你如何使用SVN tags: 作为一个开发者,永远不要切换至、取出,或者向一个SVN tag提交任何内容:一个tag好比某种“照片”,并不是实实在在的东西,tags只可读,不可写。 在特殊或者需要特别注意的环境中,如:生产环境(production)、?(staging)、测试环境(testing)等等,只 能从一个修复过的(fixed)tag中checkout和update,永远不要commit至一个tag。 对于上述提及到的环境,可以创建如下的tags:“production”,“staging”,“testing”等等。你也可以根 据软件版本、项目的成熟程度来命名tag:“1.0.3”,“stable”,“latest”等等。 当trunk已经稳定,并且可以对外发布,也要相应地重新创建tags,然后再更新相关的环境(production, staging, etc)

 ——工作流样例   

假设你必须添加了一个特性至一个项目,且这个项目是受版本控制的,你差不多需要完成如下几个步骤: 使用SVN checkout或者SVN switch从这个项目的trunk获得一个新的工作拷贝(branch) 使用SVN切换至新的branch 完成新特性的开发(当然,要做足够的测试,包括在开始编码前) 一旦这个特性完成并且稳定(已提交),并经过你的同事们确认,切换至trunk 合并你的分支至你的工作拷贝(trunk),并且解决一系列的冲突 重新检查合并后的代码 如果可能的话,麻烦你的同事对你所编写、更改的代码进行一次复查(review) 提交合并后的工作拷贝至trunk 如果某些部署需要特殊的环境(生成环境等等),请更新相关的tag至你刚刚提交到trunk的修订版本 使用SVN update部署至相关环境

 

10)CVS  VS  SVN

CVS不是原子提交。

你可能感兴趣的:(SVN)