Fork me on GitHub
KeKe Blog

SVN基础配置和使用

  SVN是Subversion的简称,是一种集中式的版本控制系统。
  集中式代码管理的核心是服务器,所有开发者在开始新一天的工作之前必须从服务器获取代码,然后开发,最后解决冲突,提交。所有的版本信息都放在服务器上。

1 SVN工作流程

  • 开始上班:客户端连接到SVN服务器 → 从SVN服务器上下载项目组最新代码,并进入到自己的分支

  • 进行工作:编写代码,每天隔一个小时向服务器自己的分支提交一次代码

  • 快下班了:把自己的分支合并到SVN服务器的主分支上,一天的工作就完成了,并反映给SVN服务器

2 服务器配置

  &MAC默认安装了SVN环境,只需要进行配置即可使用了。

  • 创建代码库
1
2
3
4
5
# 建立SVN目录,进入SVN主目录
$ mkdir ./SVN
$ cd ./SVN
# 创建一个myCode仓库
$ svnadmin create mycode
  • 创建完成后,会自动生成相关的配置文件和数据库文件等。

  • 配置用户权限
    主要修改conf目录下的三个配置文件

  • svnserve.conf
1
2
3
4
5
#将下列配置项前面的#和空格都去掉
# anon-access = read // 匿名访问的时候为只读,若改为 none 代表禁止匿名访问
# auth-access = write
# password-db = passwd
# authz-db = authz
  • passwd
1
2
3
4
5
在 [users] 下面添加账号和密码,如:
[users]
henry = 725
cathy = 111
roger = 121
  • authz
1
2
3
4
5
6
7
8
9
10
11
12
将不同的用户进行分组,对组中用户进行统一管理
[groups]
topgroup = henry,cathy
说明 henry 和 cathy 都是数据 topgroup 这个组的
接下来再进行权限配置,使用 [/] 代表 svn 服务器中的所有资源库
[/]
@topgroup = rw
上面的配置说明 topgroup 这个组中的所有用户对所有资源都有读写 (rw) 权限,组名前面要用 @
如果是用户名,不用加 @,比如 roger 这个用户只有读取权限
[/]
roger = r
至于其他的权限设置,可以参考 authz 文件中的其他内容
  • 启动/关闭SVN服务器
1
2
3
4
5
6
7
8
# 启动
# 启动有两种方式,其中一种都可以
svnserve -d -r ./SVN
# 或
svnserve -d -r ./SVN/myCode
# 关闭
# 最简单粗暴的办法就是在监控管理器里直接关闭svn进程。

3 客户端配置

  人物角色: 项目经理 henry、程序员 cathy、新员工 roger

3.1 初始化导入

1
2
3
4
5
# 命令格式
import 源文件路径 服务器URL --username=用户名 --password=密码 -m“注释内容”
# 创建henry
svn import /Users/Henry/Desktop/henry svn://localhost/mycode/prj --username=henry --password=725 -m"初始化导入"

3.2 同步远端代码到本地

1
2
3
4
5
6
# 命令格式
svn checkout 服务器URL 本地目
# 从SVN服务器上现在代码
svn checkout svn://localhost/myCode/prj /Users/Henry/Desktop/cathy --username=cathy --password=111
svn checkout svn://localhost/myCode/prj /Users/Henry/Desktop/roger --username=roger --password=121

3.3 提交更新

1
2
3
4
# 进入本地目录
cd /Users/Henry/Desktop/cathy
# 提交更新
svn commit --username=cathy --password=111 -m"cathy增加了1"

3.4 更新服务器代码到本地

1
2
3
4
# 进入SVN目录
cd /Users/Henry/Desktop/roger
# 更新
SVN update

4 SVN目录结构

  有一个很标准的目录结构,是这样的。比如项目是 proj,svn 地址为 svn://proj/,那么标准的 svn 布局是:

1
2
3
4
5
svn://proj/
|
+-trunk
+-branches
+-tags

  这是一个标准的布局,trunk 为主开发目录,branches 为分支开发目录,tags为tag 存档目录(不允许修改)。但是具体这几个目录应该如何使 用,svn 并没有明确的规范,更多的还是用户自己的习惯。

对于这几个开发目录,一般的使用方法有两种:

4.1 trunk作为主开发目录的用法


  所有的开 发都是基于 trunk 进行开发,当一个版本 / release 开发告一段落(开发、测试、文档、制作安装程序、打包等)结束后,代码 处于冻结状态(人为规定,可以通过 hook 来进行管理)。此时应该基于当前冻结的代码库,打 tag。当下一个版本 / 阶段的开发任务开始,继续在 trunk 进行开发。此时,如果发现了上一个已发行版本(Released Version)有一些 bug,或者一些很急迫的功能要求,而正在开发的版本(Developing Version)无法满足时间要求,这时候就需要在上一个版本上进行修改了。应该基于发行版对应的 tag,做相应的分支(branch)进行开发。例 如,刚刚发布 1.0,正在开发 2.0,此时要在 1.0 的基础上进行 bug 修正。

4.2 trunk作为发布版本目录的用法


  在每一个 release 的 branch 中进行 各自的开发,trunk 只做发布使用。这种开发模式当中,trunk 是不承担具体开发任务的,一个版本 / 阶段的开发任务在开始的时候,根据已经 release 的版本做新的开发分支,并且基于这个分支进行开发。

4.3 两种开发模式比较

  • 第一种开发模式(trunk 进行主要开发,集中式):

    • 优点:
      管理简单
    • 缺点:
      当开发的模块比较多,开发人数 / 小团队比较多 的时候,很容易产生冲突而影响对方的开发。因为所有的改动都有可能触碰对方的改动
  • 第二重开发模式(分支进行主要开发,分散式):

    • 优点:
      各自开发独立,不容易相互影响。
    • 缺点:
      管理复杂,merge 的时候很麻烦,容易死人。

5 附录

5.1 SVN常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
svn import : 将文件导入到服务器
svn checkout: 下载服务器的代码到本地 (简写svn co)
svn commit : 将改动的文件提交到服务器 (简写svn ci)
svn update : 更新服务器的代码到本地 (简写svn up)
svn add : 向本地的版本控制库中添加新文件
svn delete : 从本地的版本控制库中删除文件 (简写svn del)
svn remove : 从本地的版本控制库中删除文件(简写svn rm)
svn move : 移动文件或者目录或文件更名
svn mkdir : 创建纳入版本控制下的新目录
svn revert : 撤销之前的一切修改
svn merge : 将两个版本之间的差异合并到当前文件
svn info : 查看文件的详细信息
svn diff : 查看不同版本的区别
svn log : 查看日志信息
svn list : 列出版本库下的文件和目录列表
svn status : 查看文件状态(简写svn st)
svn help : 获取帮助信息(比如svn help ci)
svn lock : 加锁
svn unlock : 解锁
更多命令,使用svn help 进行查看
svn help [命令] // 可以查看命令帮助

5.2 SVN文件状态标识

1
2
3
4
5
6
7
8
9
10
11
12
使用文件状态命令 svn st 查看文件状态时的标识
' ' 没有修改
'A' 被添加到本地代码仓库
'C' 冲突
'D' 被删除
'I' 被忽略
'M' 被修改
'R' 被替换
'X' 外部定义创建的版本目录
'?' 文件没有被添加到本地版本库内
'!' 文件丢失或者不完整(不是通过svn命令删除的文件)
'~' 受控文件被其他文件阻隔

阅读原文

-------------本文结束 感谢您的阅读-------------