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