SVN手册学习

日复一日看到相同问题的烦闷,促使Ben在2002年的夏天努力工作了一个月,撰写了一本Subversion手册,一本六十页厚的、涵盖了所有Subvision使用基础知识的手册。

“即使你能确认什么是完美,也不要让完美成为好的敌人,更何况你不能确认。 因为落入过去陷阱的不悦,你会在设计时因为担心自己的缺陷而无所作为。”  ————Greg Hudson

Pxvii

某些版本控制系统本身也是软件配置管理(SCM)系统,这种系统经过精巧的设计,专门用来管理源代码树,并且具备多种与软件开发有关的特性。 如:对编程语言的支持,或者提供程序构建工具。 不过Subversion并不是这样的系统,它是一个通用系统,可以管理任何类型的文件集。

CollabNet的版权许可证完全符合Debian的自由软件方针。 也就是说,任何人都可以根据自己的意愿自由的下载、修改和重新发布Subversion,不需要CollabNet或其他人的授权。

SVN的优点:
1、版本化的目录
  CVS只能跟踪单个文件的变更历史,而SVN实现的“虚拟”版本化文件系统则可以跟踪目录树的变更。
2、真实的版本历史
3、原子提交
4、版本化的元数据
5、可选的网络层
6、一致的数据操作

(可以通过学习SVN了解一个成熟系统的架构设计思想)

 

第一章 基本概念

版本库

一般情况下,客户端从版本库中获取的数据是文件系统树中的最新数据。 但是客户端也具备查看文件系统树以前任何一个状态的能力。 例如,客户端有时会对一些历史性问题感兴趣,比如“上星期三时的目录结构是什么样的?”或者“谁最后一个修改了这个文件,都修改了什么?”这些都是版本控制系统的核心问题:设计用来记录和跟踪数据变化的系统。

版本模型

版本控制系统的核心任务是实现协作编辑和数据共享,但是不同的系统使用不同的策略实现这个目的。

SVN、CVS和一些版本控制系统使用拷贝-修改-合并方案。
其他一些系统采用“锁定-修改-解锁”方案。

感觉“合并”方案比“锁定”方案多一点混乱,但是在实践中,通常运行的很平稳,用户可以并行的工作,不必等待别人,当工作在同一个文件上时,也很少会有交迭发生,冲突并不频繁,处理冲突的时间远比等待解锁花费的时间少。

这一些都归结到一条重要的因素:用户交流。 当用户交流贫乏,语法和语义的冲突就会增加, 没有系统可以强制用户完美的交流,没有系统可以检测语义上的冲突,所以没有任何证据能够承诺锁定系统可以防止冲突。 在实践中,锁定除了约束生产力,并没有得到其他好处。

什么时候锁定是必需的?
二进制格式文件的修改,如艺术品,声音等,十分有必要让用户轮流修改,否则许多工作努力都会被浪费。

第二章 基本操作

查看你的修改概况

svn status
  它会检测你做的所有的文件或目录的修改,例如:

A  stuff/loot/bloo.h   # file is scheduled for addition
C  stuff/loot/lump.c   # file has textual conflicts from an update
D  stuff/fish.c      # file is shceduled for deletion
M  bar.c         # the content in bar.c has local modification

svn status也有一个--verbose(-v)选项,它可以显示工作拷贝中的所有项目,即使没有被修改。

以上所有svn status调用都没有联系版本库,只是与.svn中的原始数据进行比较的结果.
最后是--show-updates (-u)选项,它将会联系版本库为已经过时的数据添加新信息:

$ svn status -u -v
M   *    44   23   sally     README
M        44   20   harry   bar.c  
   *    44   35   harry   stuff/trout.c
D        44   19   ira     stuff/fish.c
A        0    ?    ?     stuff/things/bloo.h
Status against revision: 46

两个星号说明:如果你现在执行svn update,你的README和trout.c会被更新。

 

第三章 高级主题

解决冲突(合并别人的修改)

$ svn update
U   INSTALL
G   README
C   bar.c
Updated to revision 46.

U和G没必要关心,文件干净的接受了版本库的变化。
文件标示为U表明本地没有修改,文件已经根据版本库更新。
G标示合并,标示本地已经修改过,与版本库没有重迭的地方,已经合并。
但是C标示冲突,说明服务器上的改动同你的改动冲突了,你需要自己手动去解决。

对于每一个冲突的文件,Subversion放置三个额外的未版本化文件到你的工作拷贝:
filename.mine
  你更新前的文件,没有冲突标志,只是你最新更改的内容。
  (如果Subversion认为这个文件不可以合并,.mine文件不会创建,因为它和工作文件相同)
filename.rOLDREV
  这是你的做更新操作以前的BASE版本文件,就是你在上次更新之后未作更改的版本。
filename.rNEWREV
  这是你的Subversion客户端从服务器刚刚收到的版本,这个文件对应版本库的HEAD版本。

手动合并冲突

$ cat sandwich.txt
Top piece of bread
Mayonnaise
Lettuce
Tomato
<<<<<<< .mine
Salami
Mortadella
Prosciutto
=======
Sauerkraut
Grilled Chicken
>>>>>>> .r2
Creole Mustard
Bottom piece of bread

小于号、等于号和大于号串是冲突标记,并不是冲突的数据,
你一定要确定这些内容在下次提交之前得到删除,
前两组标志中间的内容是你在冲突区所做的修改,
后两组之间的是他人在服务器上的最新修改。

 

 

 

 

 

 

 

 

 

posted @ 2012-01-12 11:33  万法自然~  阅读(221)  评论(0编辑  收藏  举报