Windows下用subversion进行版本控制

  这篇教程是写给从未接触过Subversion的人看的,高手就不要浪费时间了。由于Subversion自带的文档太长,而且讲得太全面了,可能刚入门者没有耐心一点点看完(比如我刚接触Subversion的时候^_^),所以想写一篇比较基础,但是版本控制过程中遇到的各个方面(这里是指我自己遇到过的,Subversion还有许多基础的方面我没有遇到,用软件工程的话讲就是没有需求^_^,这些方面我就没有写)都能涉及到的教程,让更多的人能够了解subversion和使用subversion这个优秀的版本控制工具(好像subversion在国内用的人很少啊)。文中如有不对的地方,还请高手指正。特别感谢subversion.org.cn的论坛斑竹回答我关于lock的问题,特别感谢subversion的作者提供了这么一个优秀的版本控制工具。

一.安装subversion
首先安装subversion1.2.3和图形化客户端TortoiseSVN-1.2.4.4479(该版本的TortoiseSVN针对 subversion1.2.3)。subversion在服务器端和客户端都需要安装,TortoiseSVN只要在客户端安装就行。

二.建立Repository(保存文档各个版本的数据库)
在服务器端建立一个空目录,比如“C:/SVNProjects/Project1”。建立Repository的具体方式是:在 subversion安装目录下的/bin子目录下有一个svnadmin.exe文件,在DOS窗口下进入该/bin目录,并执行“svnadmin create --fs-type bdb C:/SVNProjects/Project1”。之后你会发现原本是空目录的“C:/SVNProjects/Project1”下多出了几个目录和几个文件。这些目录和文件就是用来存储文档各个版本的数据库。
***除了用命令行方式建立Repository外,还可以用TortoiseSVN建立,不过这要求在服务器端也安装 TortoiseSVN。建立Repository的具体方式是:在“C:/SVNProjects/Project1”目录上右击鼠标, TortoiseSVN->Create Repository here....,然后弹出一个对话框选择Berkeley Database(BDB),然后点OK按钮。

三.配置Repository建立Repository后,还应该对 Repository进行配置,主要的目的是控制访问权限和添加Repository的用户。“C:/SVNProjects/Project1/ conf/svnserve.conf”文件就是该Repository的配置文件。它是一个典型的INI文件,虽然该文件并不是以INI作为扩展名。用文本编辑器打开它后,可以看见一些文本,该文件以“#”开始的行都是注释行。将“#[general]”行的“#”删掉,“#anon-access = none”“#auth-access = write”“#password-db = passwd”行也删掉“#”,注意,只是删掉“#”字符,不要把整行都删了。“anon-access = none”是指不允许匿名访问Repository,不管是读操作还是写操作。“auth-access = write”表示认证的访问允许写操作,当然读操作就更允许了。“password-db = passwd”表示用户名及用户密码存在一个叫passwd的文件里,这个文件也在“C:/SVNProjects/Project1/conf”目录下,用文本编辑器打开后,将“# [users]”的“#”字符删掉,然后在文件的最后添加一个新行,在该行写上用户名和密码,格式为“xxxx = yyyy”其中“xxxx”表示用户名,“yyyy”表示密码,一行只能设定一个用户,要设定多个用户,请再起新行。

四.启动subversion服务器Subversion提供了三种服务器模式,这里介绍其中的一种,它是subversion自带的一种轻量级的服务器,该服务器启动后,在服务器端的3690端口监听客户端的连接请求(这是默认情况下,如果你有其他程序占用了3690端口,可以用“--listen-port”参数指定服务器监听端口)。服务器的具体启动方式是:在 subversion安装目录下的/bin子目录下有一个svnserve.exe文件,该文件运行时可带参数,常用的参数有两个一个是“-d”,该参数表明服务器作为一个精灵进程一直运行,直到手动结束该程序。另一个参数就是“-r”,该参数指定服务器进程寻找Repository的根路径。在DOS窗口下进入/bin目录,并执行:
“svnserve.exe -d -r C:/SVNProjects”。服务器这时就启动了。“-r C:/SVNProjects”参数的作用是:当在客户端用“svn://xxx/project1”(xxx可以是服务器端主机名,也可以是服务器端的 ip地址)访问服务器的Repository时,服务器会知道你要访问的Repository路径是“C:/SVNProjects/ Project1”。如果当我有两个完全不相干的项目要进行版本控制时,可以再建立一个空目录 “C:/SVNProjects/Project2”,并在其中再建立一个Repository,此时客户端就可以用“svn: //xxx/project2”访问“C:/SVNProjects/Project2”下的Repository。至此,服务器端就配置完毕了。

五.客户端的使用

1.Checkout Repository
首先要Checkout服务器端的Repository,所谓的Checkout就是指获得服务器端指定的Repository存储的所有文件。这个Checkout和Visual Source Safe的Checkout意义完全不一样,VSS的Checkout指的是锁定某个文件,如果你以前使用过VSS,在学习Subversion时这个问题一定要注意。Checkout的具体方式是:在客户端新建一个空目录,比如:F:/Project1
在该目录上单击右键,在弹出式菜单中选中SVN Checkout...,之后在“URL of Repository”文本框中填入你想要连接的Repository的地址,对于在本教程第二节建立的Repository,URL应该是“svn: //xxx/project1” (xxx可以是服务器端主机名,也可以是服务器端的ip地址)。
然后点OK,会弹出一个认证对话框,输入在教程第三节设置的用户名和密码。点OK后就完成了对Repository的Checkout。比如:在服务器端Repository中有一个a.txt文件,那么Checkout之后F:/Project1目录下也会出现一个a.txt文件。在本例中由于服务器端的Repository还未添加任何文件,所以在客户端的F:/Project1下没有文件被Checkout。执行Checkout除了会在 F:/Project1产生Repository存储的文件及目录外,还会产生了一个“.svn”的隐含目录,该目录是由subversion管理的,不要删除或者手工改动其中的文件和目录。现在F:/Project1中的文件和目录就叫做Repository的“Working Copy”简写“WC”(这个简写...汗)。以后对Repository中文件和目录的修改,添加,删除的操作,都是通过对这个“Working Copy”的操作实现的。Checkout执行完后,会发现F:/Project1目录的图标的左下角附着了一个小的状态图标(当F:/Project1 目录中的文件改变时,这个状态图标也会随之变化),它表示F:/Project1是一个Repository的“Working Copy”,F:/Project1内的所有文件和目录也会有类似的状态图标。

2.添加文件
将要添加的文件或者目录拷贝到F:/Project1下,然后在该文件或目录上单击右键,TortoiseSVN->Add,点OK。如果添加了不止一个文件或目录,则鼠标不要在F:/Project1中点中任何文件,然后单击右键,TortoiseSVN->Add,就可以添加多个文件或目录。这时文件的状态图标会发生变化。Add命令只是告诉本地的“Working Copy”将该文件纳入版本管理,并没有将这个改变提交到服务器端,如果想要别人也看见你对Repository的修改,你需要
在F:/Project1下单击右键,SVN Commit...,将你所做的修改提交到Repository。文件的状态图标也会更新。不管你在“Working Copy”内添加、修改、删除文件后,要想其他人也看见你的修改,都必须用Commit命令将所做修改递交到服务器端的Repository。

3.修改文件
用文本编辑器或IDE对文件修改后,文件的状态图标会变化,然后单击右键,SVN Commit...
提交修改,只有当执行Commit提交修改后,你所作的修改才会反映到服务器端的Repository中。

4.删除文件
删除文件时,选中要删除的文件或目录,单击右键,TortoiseSVN->Delete,提交修改。注意千万不要用“Delete”键来删除文件,否则将无法提交你的修改。这一点对目录的删除来说尤为重要。

5.放弃修改
当你添加、修改、删除文件后,决定放弃修改,你可以单击右键,TortoiseSVN->Revert,本地的“Working Copy”中的文件和目录会恢复到你修改前的状态。

6.获取Repository的最新版本
当一个团队合作开发项目时,每一个人都在不断的对Repository进行更新,你需要不断的更新自己的“Working Copy”,以获取项目最新的文件。当第一次获得最新Repository的文件时,我们用Checkout命令,前面已经介绍了,以后再获取最新文件时就不用Checkout了。而改用Update命令。接着前面的例子,这时F:/Project1已经成为一个“Working Copy”了(通过执行Checkout命令),现在其他人已经对Repository进行了修改,我想将别人的修改反映到我的“Working Copy”中,具体的方法是:在F:/Project1目录上单击右键,SVN Update。这时F:/Project1中的文件就是最新的版本了。注意,如果当你的“Working Copy”中有被修改的文件,或者有被删除的文件,并且还未提交这些修改时,这些文件在执行Update过程中是不会被更新的。比如你修改了F:/ Project1下a.txt文件,还未提交修改,那么,当你对F:/Project1进行Update时,a.txt文件是不会更新为 Repository上的a.txt文件的。所以如果想放弃当前的所有修改,并将F:/Project1下所有文件及目录更新到最新版本应该先对F:/ Project1执行Revert命令再执行Update命令。

7.subversion的版本控制模型
当你用subversion进行版本控制时,Subversion会记录你对Repository进行的每一次修改(包括添加,修改,删除等等),每修改一次Repository都会产生一个新的Revision(修订版本号),不同的Revision代表了不同时刻Repository的状态,因此我们可以用这个Revision回朔任意时刻Repository的状态,就像时间机器一样,也就是说某一Revision 就是Repository 在某一时刻的一个“快照”。注意:Revision 不是针对某一个文件或者目录,而是针对整个Repository而言的。每修改一次Repository,Revision 都会增加1。
Subversion的版本控制模型是一种叫做Copy-Modify-Merge(拷贝-修改-合并)的模型。考虑这种情况:张三和李四是公司同一个部门的同事,他们共同维护一个文本文件a.txt,并且对该文件进行版本控制,因此他们把这个文件放到一个Repository上共同维护该文件。周一上午9点,张三和李四同时想对a.txt文件进行修改,于是他们同时从Repository上取得该文件的最新版本(Revision 10),然后进行修改。过了三分钟,张三首先完成了修改,他在该文件的第五行修改了一个单词的拼写(将Typo改为Type),于是张三对修改后的文件执行Commit 命令,将修改提交到服务器端的Repository 中。这时Repository 的Revision 变为11。六分钟过后,李四也完成了他的修改,他修改了该文件第十行上的一个单词拼写(将He改为She),于是他也对修改后的文件执行Commit 命令,这时Subversion 在提交修改时会发现,李四修改的文件是Revision 10的a.txt文件,而不是最新的Revision 11的a.txt文件。于是,Subversion 提示李四在提交修改前,应该先将Working Copy更新到最新版本,李四执行Update命令将Working Copy更新到Revision 11,这时Subversion会提示已经完成合并,李四的a.txt文件的第五行的“Typo”已经变为了“Type”,第十行还是“She”,就是说 Subversion 已经将张三的修改“合并”到李四的a.txt文件中了。之后,李四再执行Commit命令,就能将他对第十行的修改(将He改为She)提交到服务器端的 Repository中了(生成Revision 12)。但是这种合并在某些情况下会变得复杂一些,比如:李四对a.txt文件的修改并不是第十行,而是与张三同样修改第五行的单词,李四将“Typo” 改为“Typr”,并且提交修改,这时Subversion会提示李四在提交修改前,应该先将Working Copy更新到最新版本,李四执行Update命令将Working Copy更新到Revision 11,这时Subversion将Revision11的a.txt文件与李四修改的a.txt文件进行合并时发现李四修改的同样是第五行,于是 Subversion就无法判断是李四的修改(“Tpyr”)正确还是张三的修改(“Type”)正确,因为他们都是在Revision10的a.txt 基础上作的修改。这种情况叫做Conflict(冲突),a.txt文件的图标会变成一个黄色三角。这时,只能依靠李四自己去判断到底第三行应该修改为 “Typr”还是“Type”。当李四确定修改之后,在a.txt文件上单击右键,TortoiseSVN->Resolved
告诉Subversion已经解决了Conflict。这时再执行Commit命令就能提交修改(生成Revision 12)。Subversion 这种控制方式保证了你对文件所作的修改都是基于文件的最新版本。

8.“.svn”目录
在客户端Working Copy的每一层目录中都会有一个“.svn”目录,该目录是Subversion进行管理用的目录。不要手动修改其中的文件。该目录存储了 Working Copy的一个副本(实际存储副本的地方是F:/project1/.svn/text-base目录),比如:F:/Project1是一个 Working Copy,该目录下有两个文件a.txt和b.txt还有一个子目录ccc,子目录ccc中还有一个d.txt文件。“.svn”目录中存储的是你最近一次执行完Update或者Commit命令之后当前目录中文件的副本,比如:F:/project1/.svn/text-base中存储的a.txt和 b.txt是最近一次执行完Update或者Commit命令之后F:/project1下的a.txt和b.txt的拷贝。也就是说你所作的修改都是基于“.svn”目录存储的那些文件。这种机制可以让我们在不连接网络的情况下,将Working Copy中的文件恢复到修改之前的状态。Subversion的Revert命令就是利用了这种机制来实现的。比如你修改了F:/project1/ a.txt文件,这时你又改变了主意想放弃对该文件的修改,你可以单击右键,TortoiseSVN->Revert,修改过的F:/ project1/a.txt文件就会被F:/project1/.svn/text-base中a.txt文件的副本所替代,使得a.txt恢复到修改前的状态。
Working Copy中每一个子目录下都会有一个“.svn”目录,并不是只有最上层目录才有“.svn”目录。所以,F:/project1/ccc下也有一个 “.svn”目录,该目录存储的是F:/project1/ccc/d.txt的副本(d.txt的副本位于F:/project1/ccc/.svn/ text-base)。也就是说每个“.svn”目录只存储同级目录中的“文件”副本,而不存储“目录”副本。“.svn”目录存有许多重要的内容,所以前面说在删除文件或目录时,必须用TortoiseSVN->Delete,而不能用“Delete”键来删除文件或目录,尤其是对于目录的删除。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Subversion进行版本控制针对 Subversion 1.4(根据r2866编译) 参照网页版 http://svndoc.iusesvn.com/svnbook/1.4/制作而成。 目录 前言 序言 读者 怎样阅读本书 本书约定 排版习惯 图标 本书的结构 本书是免费的 致谢 来自 Ben Collins-Sussman 来自 Brian W. Fitzpatrick 来自 C. Michael Pilato Subversion是什么? Subversion的历史 Subversion的特性 Subversion的架构 Subversion的组件 1. 基本概念 版本库 版本模型 文件共享的问题 锁定-修改-解锁 方案 拷贝-修改-合并 方案 Subversion实践 Subversion版本库URL 工作拷贝 修订版本 工作拷贝怎样跟踪版本库 混合修订版本的工作拷贝 更新和提交是分开的 混合修订版本很常见 混合版本很有用 混合版本有限制 总结 2. 基本使用 求助! 导入数据到你的版本库 svn import 推荐的版本库布局 初始化检出 禁用密码缓存 用其它身份认证 基本的工作周期 更新你的工作拷贝 修改你的工作拷贝 检查你的修改 查看你的修改概况 检查你的本地修改的详情 取消本地修改 解决冲突(合并别人的修改) 手工合并冲突 复制文件到你的工作文件 脚注:使用svn revert 提交你的修改 检验历史 产生历史修改列表 检查历史修改的详情 比较本地修改 比较工作拷贝和版本库 比较版本库与版本库 浏览版本库 svn cat svn list 获得旧的版本库快照 有时你只需要清理 总结 3. 高级主题 版本清单 修订版本关键字 版本日期 属性 为什么需要属性? 操作属性 属性和 Subversion 工作流程 自动设置属性 文件移植性 文件内容类型 文件的可执行性 行结束字符串 忽略未版本控制的条目 关键字替换 锁定 创建锁定 发现锁定 解除和偷窃锁定 锁定交流 外部定义 Peg和实施修订版本 网络模型 请求和响应 客户端凭证缓存 4. 分支与合并 什么是分支? 使用分支 创建分支 在分支上工作 分支背后的关键概念 在分支间复制修改 复制特定的修改 合并背后的关键概念 合并的最佳实践 手工跟踪合并 预览合并 合并冲突 关注还是忽视祖先 合并和移动 常见用例 合并分支到另一分支 取消修改 找回删除的项目 常用分支模式 发布分支 特性分支 使用分支 标签 建立简单标签 建立复杂标签 分支维护 版本库布局 数据的生命周期 供方分支 常规的供方分支管理过程 svn_load_dirs.pl 总结 5. 版本库管理 Subversion 版本库的定义 版本库开发策略 规划你的版本库结构 决定在哪里与如何部署你的版本库 选择数据存储格式 Berkeley DB FSFS 创建和配置你的版本库 创建版本库 实现版本库钩子 Berkeley DB 配置 版本库维护 管理员的工具箱 svnadmin svnlook svndumpfilter svnsync Berkeley DB 工具 修正提交消息 管理磁盘空间 Subversion如何节约磁盘空间 删除终止的事务 删除不使用的Berkeley DB日志文件 Berkeley DB 恢复 版本库数据的移植 过滤版本库历史 版本库复制 版本库备份 总结 6. 服务配置 概述 选择一个服务器配置 svnserve服务器 svnserve使用SSH通道 Apache 的 HTTP 服务器 推荐 svnserve,一个自定义的服务器 调用服务器 svnserve作为守护进程 使用svnserve通过inetd 通过通道使用svnserve svnserve作为Windows服务 内置的认证和授权 创建一个用户文件和认证域 设置访问控制 SSH 隧道 SSH 配置技巧 初始设置 控制调用的命令 httpd,Apache的HTTP服务器 先决条件 基本的 Apache 配置 认证选项 基本HTTP认证 SSL 证书管理 授权选项 整体访问控制 每目录访问控制 禁用基于路径的检查 额外的糖果 版本库浏览 Apache 日志 其它特性 基于路径的授权 支持多种版本库访问方法 7. 定制你的Subversion体验 运行配置区 配置区布局 配置和Windows注册表 配置选项 服务器 配置 本地化 理解地区 Subversion对区域设置的支持 使用外置比较工具 外置 diff 外置 diff3 8. 嵌入Subversion 分层的库设计 版本库层 版本库访问层 客户端层 进入工作拷贝的管理区 条目文件 原始拷贝和属性文件 使用API Apache可移植运行库 URL 和路径需求 使用 C 和 C++ 以外的语言 代码样例 9. Subversion 完全参考 Subversion 命令行客户端:svn svn选项 svn子命令 svnadmin svnadmin选项 svnadmin子命令 svnlook svnlook选项 svnlook子命令 svnsync svnsync选项 svnsync子命令 svnserve svnserve选项 svnversion mod_dav_svn Subversion属性 版本控制的属性 未版本控制的属性 版本库钩子 A. Subversion 快速入门指南 安装 Subversion 快速指南 B. CVS用户的Subversion指南 版本号现在不同了 目录的版本 更多离线操作 区分状态和更新 状态 更新 分支和标签 元数据属性 解决冲突 二进制文件和行结束标记转换 版本化的模块 认证 迁移CVS版本库到Subversion C. WebDAV和自动版本 什么是WebDAV ? 自动版本化 客户端交互性 独立的 WebDAV 应用程序 Microsoft Office,Dreamweaver,Photoshop Cadaver,DAV 浏览器 文件浏览器 WebDAV 扩展 Microsoft Web 文件夹 Nautilus,Konqueror WebDAV文件系统实现 WebDrive,NetDrive Mac OS X Linux davfs2 D. 第三方工具 E. Copyright 索引 插图清单 1. Subversion的架构 1.1. 一个典型的客户/服务器系统 1.2. 需要避免的问题 1.3. 锁定-修改-解锁 方案 1.4. 拷贝-修改-合并 方案 1.5. 拷贝-修改-合并 方案(续) 1.6. 版本库的文件系统 1.7. 版本库 4.1. 分支与开发 4.2. 开始规划版本库 4.3. 版本库与复制 4.4. 一个文件的分支历史 8.1. 二维的文件和目录 8.2. 版本时间—第三维! 表格清单 1.1. 版本库访问URL 5.1. 版本库数据存储对照表 6.1. Subversion服务器选项比较 C.1. 常用WebDAV客户端 范例清单 5.1. txn-info.sh(报告异常事务) 5.2. 镜像版本库的 pre-revprop-change 钩子 5.3. 镜像版本库的 start-commit 钩子 6.1. 匿名访问的配置实例。 6.2. 一个认证访问的配置实例。 6.3. 一个混合认证/匿名访问的配置实例。 6.4. 禁用所有的路径检查 7.1. 注册表条目(.reg)样本文件。 7.2. diffwrap.sh 7.3. diffwrap.bat 7.4. diff3wrap.sh 7.5. diff3wrap.bat 8.1. 使用版本库层 8.2. 使用 Python 处理版本库层 8.3. 一个Python状态爬虫

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值