SVN
一、SVN 的生命周期
1.建立资料库
资料库又叫版本库,它不仅存放了文件还记录了每个文件变更历史,Create
操作是用来创建一个新的操作库。大多数情况下这个操作只会执行一次。当你创建一个新的版本库的时候,你的版本控制系统会让你提供一些信息来标识版本库,例如创建的位置和版本库的名字。
2.检出
Checkout
操作是用来从版本库创建一个工作副本。工作副本是开发者私人的工作空间,可以进行内容的修改,然后提交到版本库中。
3.更新
update
操作是用来更新版本库的。这个操作将工作副本与版本库进行同步。由于版本库是由整个团队共用的,当其他人提交了他们的改动之后,你的工作副本就会过期。
让我们假设 Tom 和 Jerry 是一个项目的两个开发者。他们同时从版本库中检出了最新的版本并开始工作。此时,工作副本是与版本库完全同步的。然后,Jerry 很高效的完成了他的工作并提交了更改到版本库中。此时 Tom 的工作副本就过期了。更新操作将会从版本库中拉取 Jerry 的最新改动并将 Tom 的工作副本进行更新。
4.执行变更
当检出之后,你就可以做很多操作来执行变更。编辑是最常用的操作。你可以编辑已存在的文件,例如进行文件的添加/删除操作。你可以添加文件/目录。但是这些添加的文件目录不会立刻成为版本库的一部分,而是被添加进待变更列表中,直到执行了 commit
操作后才会成为版本库的一部分。同样地你可以删除文件/目录。删除操作立刻将文件从工作副本中删除掉,但该文件的实际删除只是被添加到了待变更列表中,直到执行了 commit
操作后才会真正删除。
Rename
操作可以更改文件/目录的名字。"移动"操作用来将文件/目录从一处移动到版本库中的另一处。
5.复查变化
当你检出工作副本或者更新工作副本后,你的工作副本就跟版本库完全同步了。但是当你对工作副本进行一些修改之后,你的工作副本会比版本库要新。在 commit 操作之前复查下你的修改是一个很好的习惯。Status
操作列出了工作副本中所进行的变动。正如我们之前提到的,你对工作副本的任何改动都会成为待变更列表的一部分。Status
操作就是用来查看这个待变更列表。Status
操作只是提供了一个变动列表,但并不提供变动的详细信息。你可以用 diff
操作来查看这些变动的详细信息。
6.修复错误
我们来假设你对工作副本做了许多修改,但是现在你不想要这些修改了,这时候revert
操作将会帮助你。Revert
操作重置了对工作副本的修改。它可以重置一个或多个文件/目录。当然它也可以重置整个工作副本。在这种情况下,revert
操作将会销毁待变更列表并将工作副本恢复到原始状态。
7.解决冲突
合并的时候可能会发生冲突。Merge 操作会自动处理可以安全合并的东西。其它的会被当做冲突。例如,"hello.c"
文件在一个分支上被修改,在另一个分支上被删除了。这种情况就需要人为处理。Resolve
操作就是用来帮助用户找出冲突并告诉版本库如何处理这些冲突。
8.提交更改
Commit
操作是用来将更改从工作副本到版本库。这个操作会修改版本库的内容,其它开发者可以通过更新他们的工作副本来查看这些修改。在提交之前,你必须将文件/目录添加到待变更列表中。列表中记录了将会被提交的改动。当提交的时候,我们通常会提供一个注释来说明为什么会进行这些改动。这个注释也会成为版本库历史记录的一部分。Commit
是一个原子操作,也就是说要么完全提交成功,要么失败回滚。用户不会看到成功提交一半的情况。
二、SVN 的启动
利用svn命令创建版本库
svnadmin create /opt/svn/runoob
使用命令svnserve启动服务
svnserve -d -r 目录 --listen-port 端口号
-
-r: 配置方式决定了版本库访问方式。由于-r 配置方式的不一样,SVN启动就可以有两种不同的访问方式
-
方式一:-r直接指定到版本库(称之为单库svnserve方式)
-
svnserve -d -r /opt/svn/runoob
-
在这种情况下,一个svnserve只能为一个版本库工作。
-
authz
配置文件中对版本库权限的配置应这样写: -
[groups] admin=user1 dev=user2 [/] @admin=rw user2=r
- - **方式二:**指定到版本库的上级目录(称之为多库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
目录。
-
-
–listen-port: 指定SVN监听端口,不加此参数,SVN默认监听***3690***
三、创建版本库
正如上文我们创建一个版本库并查看目录:
svnadmin create test1
tree test1
D:\TEST\TEST1
├─conf
├─db
│ ├─revprops
│ │ └─0
│ ├─revs
│ │ └─0
│ ├─transactions
│ └─txn-protorevs
├─hooks
└─locks
1、svn 服务配置文件
svn 服务配置文件为版本库目录中的文件 conf/svnserve.conf
。该文件仅由一个 [general] 配置段组成。
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
realm = My First Repository
- 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,全局唯一标示)。
2.用户名口令文件
用户名口令文件由 svnserve.conf
的配置项 password-db
指定,默认为 conf
目录中的 passwd
。该文件仅由一个 [users] 配置段组成。
[users] 配置段的配置行格式如下:
<用户名> = <口令>
[users]
harry = harryssecret
sally = sallyssecret
3、权限配置文件
权限配置文件由 svnserve.conf
的配置项 authz-db
指定,默认为 conf
目录中的 authz
。该配置文件由一个 [groups] 配置段和若干个版本库路径权限段组成。
[groups]配置段中配置行格式如下:
<用户组> = <用户列表>
版本库路径权限段的段名格式如下:
[<版本库名>:<路径>]
[aliases]
joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average
[groups]
harry_and_sally = harry,sally
harry_sally_and_joe = harry,sally,&joe
[/foo/bar]
harry = rw
&joe = r
* =
[repository:/baz/fuz]
@harry_and_sally = rw
* = r
本例是使用 svnserve -d -r /opt/svn 以多库 svnserve 方式启动 SVN,所以 URL:svn://192.168.0.1/runoob01。
四、SVN 检出
root@runoob:~/svn# svn checkout svn://192.168.0.1/runoob01 --username=user01
A runoob01/trunk
A runoob01/branches
A runoob01/tags
Checked out revision 1.
五、解决冲突
一个案例: SVN 解决冲突 | 菜鸟教程 (runoob.com)
六、提交操作
首先要查看工作副本的状态:
# svn status
? file
此时file
的状态为?,说明它还未加到版本控制中。
将文件file
加到版本控制,等待提交到版本库。
# svn add file
A file
查看工作副本中的状态
# svn status
A file
此时file
的状态为A,它意味着这个文件已经被成功地添加到了版本控制中。
为了把file
存储到版本库中,使用commit -m
加上注释信息来提交。
如果你忽略了 -m 选项, SVN会打开一个可以输入多行的文本编辑器来让你输入提交信息。
# svn commit -m "SVN file"
Adding file
Transmitting file data .
Committed revision 8.
现在file
被成功地添加到了版本库中,并且修订版本号自动增加了1。
七、版本回退
我们对文件file
进行修改,查看文件状态。
# svn status
A readme
这时我们发现修改错误,要撤销修改,通过svn revert
文件file
回归到未修改状态。
# svn revert file
Reverted 'file'
再查看状态。
# svn status
#
进行 revert
操作之后,file
文件恢复了原始的状态。 revert
操作不单单可以使单个文件恢复原状, 而且可以使整个目录恢复原状。恢复目录用-R
命令,如下。
svn revert -R project
为了消除一个旧版本,我们必须撤销旧版本里的所有更改然后提交一个新版本。这种操作叫做reverse merge
。
首先,找到仓库的当前版本,现在是版本 22,我们要撤销回之前的版本,比如版本 21。
svn merge -r 22:21 readme
#### 八、查看历史消息
svn log -r [version code1]:[version code2]
svn log [filename]
## 获取当前目录信息
svn log -l [version code] -v
九、SVN 分支
1.创建分支
# svn copy [项目目录] [分支目录]
A 分支目录 ## 此项展示了分支的状态
2.提交新增的分支到版本库
首先还是要查看状态,随后添加
# svn status
A ...
....
## 和普通添加差不多只不过这是添加分支而不是文件
# svn commit -m "add my_branch"
3.切换分支开发
进入分支目录即可
cd [分支目录]
十、SVN 标签
总体和分支差不多,不过tags
往往是作为开发过程的里程碑或上线的版本,和分支一样,都需要copy
、status
、commit