svn 版本控制学习

本文详细介绍了Subversion(SVN)的基本原理,包括版本控制的重要性、版本库的概念、拷贝-修改-合并模型以及如何解决冲突等。同时,文中还介绍了SVN的实际应用流程,如仓库的创建、用户权限配置、项目的导入等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

svn原理:
1. 版本控制使您有能力去冒以往想都不敢想的风险。如果哪儿出了错,您总是可以使自己的代码回复到一个已知的、工作正常的版本。您可以在不触及主干的分支中进行试验,而不会影响到其他小组成员。在已经发布的产品的较老版本中发现 bug 时,您可以轻松检出特定版本,以确认、修订,并生成该 bug 的修补程序。如果没有版本控制,您必须极为慎之又慎,缓慢地推进,总而言之,生产力会更低。
2. Subversion支持可在本地访问或通过网络访问的数据库和文件系统存储库。不但提供了常见的比较、修补、标记、提交、回复和分支功能性,Subversion 还增加了追踪移动和删除的能力。此外,它支持非 ASCII 文本和二进制数据,所有这一切都使 Subversion 不仅对传统的编程任务非常有用,同时也适于 Web 开发、图书创作和其他在传统方式下未采纳版本控制功能的领域。
3. 版本库:Subversion是一种集中的分享信息的系统,它的核心是版本库,它储存所有的数据,版本库按照文件树形式储存数据—包括文件和目录。任意数量的客户端可以连接到版本库,读写这些文件。通过写,别人可以看到这些信息,通过读数据,可以看到别人的修改。

4. 版本库是另一种文件服务器,Subversion会记录每一次的更改,不仅针对文件也包括目录本身,包括增加、删除和重新组织文件和目录。当一个客户端从版本库读取数据时,通常只会看到最新的版本,但是客户端也可以去看以前的任何一个版本。当一个客户端从版本库读取数据时,每一种版本控制系统的核心问题:系统是设计来记录和跟踪每一次改动的。
5. 文件共享问题:所有的版本控制系统都需要解决这样一个基础问题:怎样让系统允许用户共享信息,而不会让他们因意外而互相干扰?
(1) 锁定-修改-解锁 方案:许多版本控制系统使用锁定-修改-解锁这种机制解决这种问题,
(2) 拷贝-修改-合并 方案:Subversion,CVS和一些版本控制系统使用拷贝-修改-合并模型,在这种模型里,每一个客户联系项目版本库建立一个个人工作拷贝——版本库中文件和目录的本地映射。用户并行工作,修改各自的工作拷贝,最终,各个私有的拷贝合并在一起,成为最终的版本,这种系统通常可以辅助合并操作,但是最终要靠人工去确定正误。
6.如果Sally和Harry的修改交迭了,这种情况叫做冲突,可以看到一对冲突的修改集,并手工的选择保留一组修改。需要注意的是软件不能自动的解决冲突,只有人可以理解并做出智能的选择,一旦Harry手工的解决了冲突—也许需要与Sally讨论—它可以安全的把合并的文件保存到版本库,冲突并不频繁,处理冲突的时间远比等待解锁花费的时间少。
最后,一切都要归结到一条重要的因素:用户交流。有系统可以检测语义上的冲突,所以没有任何证据能够承诺锁定系统可以防止冲突,实践中,锁定除了约束了生产力,并没有做什么事。
7.拷贝-修改-合并模型假定文件是可以根据上下文合并的:就是版本库的文件主要是以行为基础的文本文件(例如程序源代码)。但对于二进制格式,例如艺术品或声音,在这种情况下,十分有必要让用户轮流修改文件,如果没有线性的访问,有些人的许多工作就最终要被放弃。 尽管CVS和Subversion一直主要是拷贝-修改-合并系统,它们都意识到了需要锁定一些文件,并且提供这种锁定机制。
8. 当你在工作拷贝作了一些修改并且确认它们工作正常之后,Subversion提供了一个命令可以“发布”你的修改给项目中的其他人(通过写到版本库),如果别人发布了各自的修改,Subversion提供了手段可以把这些修改与你的工作目录进行合并(通过读取版本库)。
9. 通常情况下,你的工作拷贝每一个文件夹有一个以.svn为名的文件夹,也被叫做工作拷贝管理目录,这个目录里的文件能够帮助Subversion识别哪一个文件做过修改,哪一个文件相对于别人的工作已经过期了。
10. 版本库的URL:Subversion可以通过多种方式访问—本地磁盘访问,或各种各样不同的网络协议,但一个版本库地址永远都是一个URL,下表“版本库访问URL”描述了不同的URL模式对应的访问方法。

提交(commit):假定你修改了button.c,因为.svn目录记录着文件的修改日期和原始内容,Subversion可以告诉你已经修改了文件,然而,在你明确告诉它之前,Subversion不会将你的改变公开。将改变公开的操作被叫做提交(committing,或者是checking in)修改到版本库。发布你的修改给别人,你可以使用Subversion的提交(commit)命令
更新(update):假设你有个合作者,Sally,她和你同时取出了/calc的一个工作拷贝,你提交了你对button.c的修改,Sally的工作拷贝并没有改变,Subversion只在用户要求的时候才改变工作拷贝。要使项目最新,Sally可以要求Subversion更新她的工作备份,通过使用更新(update)命令,将结合你和所有其他人在她上次更新之后的改变到她的工作拷贝。svn update命令的输出表明Subversion更新了button.c的内容,注意,Sally不必指定要更新的文件,subversion利用.svn以及版本库的进一步信息决定哪些文件需要更新。
在版本库中,每一次提交被当作一次原子事务操作:要么所有的改变发生,要么都不发生,Subversion努力保持原子性以应对程序错误、系统错误、网络问题和其他用户行为。
11. 全局修订号
不像其他版本控制系统,Subversion的修订号是针对整个目录树的,而不是单个文件。每一个修订号代表了一次提交后版本库整个目录树的特定状态,另一种理解是修订号N代表版本库已经经过了N次提交。当Subversion用户讨论“foo.c的修订号5”时,他们的实际意思是“在修订号5时的foo.c”。需要注意的是,修订号N和M并不一定表示一个文件不同。而CVS使用每一个文件一个修订号的策略。
12. 需要特别注意的是,工作拷贝并不一定对应版本库中的单个修订版本,他们可能包含多个修订版本的文件。举个例子,你从版本库检出一个工作拷贝,最近的修订号是4:
calc/Makefile:4
integer.c:4
button.c:4 此刻,工作目录与版本库的修订版本4完全对应,然而,你修改了button.c并且提交之后,假设没有别的提交出现,你的提交会在版本库建立修订版本5,你的工作拷贝会是这个样子的
calc/Makefile:4
integer.c:4
button.c:5
假设此刻,Sally提交了对integer.c的修改,建立修订版本6,如果你使用svn update来更新你的工作拷贝,你会看到:
calc/Makefile:6
integer.c:6
button.c:6
Sally对integer.c的改变会出现在你的工作拷贝,你对button.c的改变还在,在这个例子里,Makefile在4、5、6修订版本都是一样的,但是Subversion会把他的Makefile的修订号设为6来表明它是最新的,所以你在工作拷贝顶级目录作一次干净的更新,会使得所有内容对应版本库的同一修订版本。
13. svn/记录两项关键的信息:
1.工作文件所作为基准的修订版本(叫做文件的工作修订版本)
2.一个本地拷贝最后更新的时间戳。
给定这些信息,通过与版本库通讯,Subversion可以告诉我们工作文件是处与如下四种状态的那一种:
未修改且是当前的 :文件在工作目录里没有修改,在工作修订版本之后没有修改提交到版本库。svn commit操作不做任何事情,svn update不做任何事情。
本地已修改且是当前的 :在工作目录已经修改,从工作修订版本之后没有修改提交到版本库。本地修改没有提交,因此svn commit会成功的提交,svn update不做任何事情。
未修改且不是当前的了: 这个文件在工作目录没有修改,但在版本库中已经修改了。这个文件最终将更新到最新版本,成为当时的公共修订版本。svn commit不做任何事情,svn update将会取得最新的版本到工作拷贝。
本地已修改且不是最新的: 这个文件在工作目录和版本库都得到修改。一个svn commit将会失败,这个文件必须首先更新,svn update命令会合并公共和本地修改,如果Subversion不可以自动完成,将会让用户解决冲突。
操作:
1. 首先需要在服务器端建立仓库(repository)
在安装完毕SVN后,他会将安装目录中的BIN目录加入到系统path中,可以通过右键点击我的电脑,选择高级—>环境变量,查看path环境变量的值。BIN目录已经增加到path环境变量里面了,这样我们在利用命令行使用SVN的命令时就不必每次都转到他的安装目录了
2. 现在我们需要首先创建一个仓库(repository),假设我们的仓库创建位置为:E:\svn\repository目录下,我们需要先在硬盘上创建该目录。 ,执行完命令后,SVN没有给出任何信息,这说明我们的版本库已经创建成功了
配置用户权限:来到库文件repository\下的conf目录,修改svnserve.conf # [general]
# password-db = passwd
改为:
[general]
password-db = passwd
然后修改同目录的passwd文件,去掉下面三行的注释:
# [users]
# harry = harryssecret
# sally = sallyssecret
最后变成:
[users]
harry = harryssecret
sally = sallyssecret
在passwd文件中,“=”前的字符就是用户名,后面的就是密码。还要注意“[users]”前面的注释“#”一定要删除掉。
3. 接下来就是在客户端创建一个项目,然后将该项目import到服务器端,将其纳入SVN的管理之下。不过在创建项目之前我们首先需要启动服务器,服务器启动后才会进行网络侦听,检查到客户端的相关命令请求。
在命令行中输入如下命令:svnserve –d –r E:\svn\repository,该命令含义为让SVN将此目录作为仓库,并侦听客户端的请求。其中-d的作用为后台模式,而-r的作用为指定服务器的仓库路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值