SVN
Apache Subversion 通常被缩写成 SVN,是一个开放源代码的版本控制系统,Subversion 在 2000 年由 CollabNet Inc 开发,现在发展成为 Apache 软件基金会的一个项目,同样是一个丰富的开发者和用户社区的一部分。
SVN 相对于的 RCS、CVS,采用了分支管理系统,它的设计目标就是取代 CVS。互联网上免费的版本控制服务多基于 Subversion。
简介
SVN 的一些概念
- **repository(源代码库):**源代码统一存放的地方
- **Checkout(提取):**当你手上没有源代码的时候,你需要从 repository checkout 一份
- **Commit(提交):**当你已经修改了代码,你就需要 Commit 到 repository
- **Update (更新):**当你已经 checkout 了一份源代码, update 一下你就可以和 Repository 上的源代码同步,你手上的代码就会有最新的变更
日常开发过程其实就是这样的(假设你已经 Checkout 并且已经工作了几天):Update(获得最新的代码) --> 作出自己的修改并调试成功 --> Commit(大家就可以看 到你的修改了)
如果两个程序员同时修改了同一个文件呢, SVN 可以合并这两个程序员的改动,实际上 SVN 管理源代码是以行为单位的,就是说两个程序员只要不是修改了同一行程序,SVN 都会自动合并两种修改。如果是同一行,SVN 会提示文件 Conflict, 冲突,需要手动确认。
生命周期
创建版本库 create
版本库相当于一个集中的空间,用于存放开发者所有的工作成果。版本库不仅能存放文件,还包括了每次修改的历史,即每个文件的变动历史。
Create 操作是用来创建一个新的版本库。大多数情况下这个操作只会执行一次。当你创建一个新的版本库的时候,你的版本控制系统会让你提供一些信息来标识版本库,例如创建的位置和版本库的名字。
检出 checkout
Checkout 操作是用来从版本库创建一个工作副本。工作副本是开发者私人的工作空间,可以进行内容的修改,然后提交到版本库中。
更新 update
顾名思义,update 操作是用来更新版本库的。这个操作将工作副本与版本库 进行同步。由于版本库是由整个团队共用的,当其他人提交了他们的改动之后,你的工作副本就会过期。
让我们假设 Tom 和 Jerry 是一个项目的两个开发者。他们同时从版本库中检出了最新的版本并开始工作。此时,工作副本是与版本库完全同步的。然后,Jerry 很高效的完成了他的工作并提交了更改到版本库中。
此时 Tom 的工作副本就过期了。更新操作将会从版本库中拉取 Jerry 的最新改动并将 Tom 的工作副本进行更新。
执行变更
当检出之后,你就可以做很多操作来执行变更。编辑是最常用的操作。你可以编辑已存在的文件,例如进行文件的添加/删除操作。
你可以添加文件 / 目录。但是这些添加的文件目录不会立刻成为版本库的一部分,而是被添加进待变更列表中,直到执行了 commit 操作后才会成为版本库的一部分。
同样地你可以删除文件 / 目录。删除操作立刻将文件从工作副本中删除掉,但该文件的实际删除只是被添加到了待变更列表中,直到执行了 commit 操作后才会真正删除。
Rename 操作可以更改文件/目录的名字。" 移动 " 操作用来将文件/目录从一处移动到版本库中的另一处。
复查变化 status
当你检出工作副本或者更新工作副本后,你的工作副本就跟版本库完全同步了。但是当你对工作副本进行一些修改之后,你的工作副本会比版本库要新。在 commit 操作之前复查下你的修改是一个很好的习惯。
Status 操作列出了工作副本中所进行的变动。正如我们之前提到的,你对工作副本的任何改动都会成为待变更列表的一部分。Status 操作就是用来查看这个待变更列表。
Status 操作只是提供了一个变动列表,但并不提供变动的详细信息。你可以用 diff 操作来查看这些变动的详细信息。
修复错误 revert
我们来假设你对工作副本做了许多修改,但是现在你不想要这些修改了,这时候 revert 操作将会帮助你。
Revert 操作重置了对工作副本的修改。它可以重置一个或多个文件/目录。当然它也可以重置整个工作副本。在这种情况下,revert 操作将会销毁待变更列表并将工作副本恢复到原始状态。
解决冲突 merge / resolve
合并的时候可能会发生冲突。Merge 操作会自动处理可以安全合并的东西,其它的会被当做冲突。例如,"hello.c" 文件在一个分支上被修改,在另一个分支上被删除了。这种情况就需要人为处理。Resolve 操作就是用来帮助用户找出冲突并告诉版本库如何处理这些冲突。
提交更改 commit
Commit 操作是用来将更改 从工作副本到版本库。这个操作会修改版本库的内容,其它开发者可以通过更新他们的工作副本来查看这些修改。
在提交之前,你必须将文件/目录添加到待变更列表中。列表中记录了将会被提交的改动。当提交的时候,我们通常会提供一个注释来说明为什么会进行这些改动。这个注释也会成为版本库历史记录的一部分。Commit 是一个原子操作,也就是说要么完全提交成功,要么失败回滚。用户不会看到成功提交一半的情况。
启动模式
首先,在服务端进行 SVN 版本库的相关配置
手动新建版本库目录
mkdir /opt/svn
利用 svn 命令创建版本库
svnadmin create /opt/svn/runoob
使用命令 svnserve 启动服务
svnserve -d -r <目录> --listen-port <端口号>
- -r: 配置方式决定了版本库访问方式。
- --listen-port: 指定 SVN 监听端口,不加此参数,SVN 默认监听 3690
由于 -r 配置方式的不一样,SVN 启动就可以有两种不同的访问方式
方式一:-r 直接指定到版本库 (称之为单库 svnserve 方式)
svnserve -d -r /opt/svn/runoob
在这种情况下,一个 svnserve 只能为一个版本库工作。
authz 配置文件中对版本库权限的配置应这样写:
[groups]
admin=user1
dev=user2
[/]
@admin=rw
user2=r
使用类似这样的 URL:svn://192.168.0.1/ 即可访问 runoob 版本库
- 方式二:指定到版本库的上级目录 (称之为多库 svnserve 方式)
svnserve -d -r /opt/svn
这种情况,一个 svnserve 可以为多个版本库工作
authz 配置文件中对版本库权限的配置应这样写:
[groups]
admin=user1
dev=user2
[runoob:/]
@admin=rw
user2=r
[runoob01:/]
@admin=rw
user2=r
如果此时你还用 [/],则表示所有库的根目录,同理,[/src] 表示所有库的根目录下的 src 目录。
使用类似这样的 URL:svn://192.168.0.1/runoob 即可访问 runoob 版本库。
SVN 创建版本库
使用 svn 命令创建资源库:
[runoob@centos6 ~]svnadmin create /opt/svn/runoob01
[runoob@centos6 ~]ll /opt/svn/runoob01/
total 24
drwxr-xr-x 2 root root 4096 2016/08/23 16:31:06 conf
drwxr-sr-x 6 root root 4096 2016/08/23 16:31:06 db
-r--r--r-- 1 root root 2 2016/08/23 16:31:06 format
drwxr-xr-x 2 root root 4096 2016/08/23 16:31:06 hooks
drwxr-xr-x 2 root root 4096 2016/08/23 16:31:06 locks
-rw-r--r-- 1 root root 229 2016/08/23 16:31:06 README.txt
进入 /opt/svn/runoob01/conf 目录,修改默认配置文件配置,包括 svnserve.conf、passwd、authz 配置相关用户和权限。
svn 服务配置文件 svnserve.conf
svn 服务配置文件为版本库目录中的文件 conf/svnserve.conf。该文件仅由一个 [general] 配置段组成。
[general]
anon-access = none
auth-access = write
password-db = /home/svn/passwd
authz-db = /home/svn/authz
realm = tiku
- anon-access: 控制非鉴权用户访问版本库的权限,取值范围为 "write"、"read" 和 "none"。 即 "write" 为可读可写,"read" 为只读,"none" 表示无访问权限,默认值:read。
- auth-access: 控制鉴权用户访问版本库的权限。取值范围为 "write"、"read" 和 "none"。 即 "write" 为可读可写,"read" 为只读,"none" 表示无访问权限,默认值:write。
- authz-db: 指定权限配置文件名,通过该文件可以实现以路径为基础的访问控制。 除非指定绝对路径,否则文件位置为相对 conf 目录的相对路径,默认值:authz。
- realm: 指定版本库的认证域,即在登录时提示的认证域名称。若两个版本库的认证域相同,建议使用相同的用户名口令数据文件。默认值:一个 UUID(Universal Unique IDentifier,全局唯一标示)。