svn基础使用技巧

创建版本库

1
2
3
4
svnadmin create 库名

举例:svnadmin create test_svn
svnadmin create /svn/test_svn_2

运行版本库

1
2
3
4
5
6
svnserve  -d  -r 库名
举例: svnserve -d -r /svnroot/hello

# 以指定端口号运行版本库,默认端口号是3690
svnserve -d -r 库名 --listen-port 端口号
举例: svnserve -d -r /svnroot/hello --listen-port 3691

停止运行的所有版本库

1
2
## 停止运行的所有版本库
killall svnserve

检出版本库

1
2
3
## 检出版本库
svn checkout 地址 版本库命名
svn checkout svn://192.168.0.1:3691 hello3691

删除版本库

1
2
3
4
rm -rfv 库名

举例:rm -rfv test_svn
rm -rfv /svn/test_svn_2

svn版本库配置

  1. 配置文件位于版本库的conf文件夹下,该文件夹下有三个文件,分别是 authz,passwd,svnserve.conf
  • authz 配置用户组以及用户组权限
  • passwd 配置允许访问当前版本库的用户名和密码
  • svnserve.conf 配置默认权限,权限配置文件及密码配置文件

注意:版本库配置必须在版本库运行前修改,否则配置不起作用。

常见svn客户端命令

1. svn add 添加到版本控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 版本库增加文件
svn add 文件

# 增加文件夹,默认添加该文件夹和递归添加该文件夹所有文件
svn add 文件夹

# 只增加文件夹
svn add 文件夹 --non-recursive

# 一次性增加版本库中所有无版本控制所有文件及文件夹(如果有文件夹已添加到版本库,但该文件夹内的文件还是无版本控制,该文件夹的文件默认不添加到版本库)
svn add *

# 强制添加所有无版本控制的文件
svn add * --force

2. svn commit 提交修改到服务端(创建一个新版本号)

1
2
3
4
5
# 提交文件或文件夹到svn服务端(-m后的参数必须加)
svn commit -m "描述" 文件/文件夹

# 提交版本库所有增加的文件和文件夹
svn commit -m "描述" *

3. svn update 更新工作副本

默认情况下,每个文件只会从服务端更新一次最新版本,此情况只适用修改的文件,但工作副本使用rm命令删除的文件,再次使用 svn update会将删除的文件从svn服务端拉取回来,所有删除文件需要使用svn命令。

1
2
3
4
5
6
7
8
# 工作副本全目录更新到最新版本
svn update

# 更新工作副本中的文件到对应指定的版本号
svn update -r 版本号 文件

# 强制更新工作副本的所有文件到最新版本
svn update *

4. svn delete 从版本库中删除文件或目录

1
2
# 删除工作副本的文件,备注不是必备的,提交即可删除svn服务端对应文件
svn delete 文件 -m “备注”

5. svn diff 版本差异比较

1
2
3
4
5
6
7
8
9
10
11
# 比较工作副本与最后一次提交版本的差异
svn diff 文件名

# 比较工作副本与任意历史版本的差异
svn diff -r 版本号 文件名

# 比较任意两个历史版本的差异
svn diff -r 版本号:版本号 文件名

# 比较工作副本中所有文件与最后一次提交版本的差异
svn diff

6. svn mkdir 创建目录并添加到版本控制中

1
2
# 创建文件文件夹并将其添加到版本控制中,相当于使用系统命令mkdir创建文件夹再使用svn add 文件夹
svn mkdir 文件夹

7. svn cat 不检出工作副本直接查看指定文件

1
2
3
# 脱离工作副本查看线上版本库(即svn服务端)的文件
svn cat 线上版本库文件路径
如:svn cat svn://192.168.0.130/index.html

*8. svn revert [–recursive][filename|] 工作副本的还原**

1
2
3
4
5
6
7
8
# 还原工作副本的文件
svn revert 文件名

# 还原工作副本当前目录的文件,不会递归扫描所有目录的文件
svn revert *

# 还原工作副本所有的文件,会递归扫描所有目录的文件
svn revert --recursive *

二进制冲突与树冲突

  1. 冲突与产生条件
  • 冲突出现于工作副本长时间未更新时
  • 更新到的数据与工作副本的修改正好在同一处
  1. 树冲突
  • 发生树冲突的文件都不是二进制文本文件
  • 树冲突无法精确到行并且处理树冲突必须处理整个文件
  1. 冲突处理
  • 发现冲突推荐选择(p)推迟处理,原因是选择mc或者tc会将修改直接提交到svn版本库中,推迟处理可以将冲突保存在工作副本中,不会提交到svn服务端。
    1
    2
    3
    4
    5
    # svn处理工作副本的冲突命令
    svn resolve 文件名

    # 告知svn服务端本地工作副本已处理完某文件的冲突, 采用编辑文件的方式解决的冲突必须采用以下命令标志解决冲突,而采用svn resolve 解决冲突可以不必使用以下命令标志。
    svn resolved 文件名

锁定与解锁

1. svn lock 锁定文件,防止其他成员对文件进行提交

1
2
3
4
5
# 锁定文件,锁定文件并不需要提交,但是默认工作副本提交后会自动解锁文件
svn lock 文件名

# 工作副本提交后不自动解锁文件
svn commit -m "" --no-unlock 文件名

2. svn unlock 解锁文件

1
2
# 解锁文件,解锁文件并不需要提交
svn unlock 文件名

svn进阶

  1. svn list 列出当前目录下处于版本控制的所有文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 列出当前目录处于版本控制的文件,无版本控制的文件不会列出,文件夹内容不会递归显示
    svn list

    # 列出当前目录处于版本控制的文件,文件夹内容会递归显示,而无版本控制的文件不会列出,
    svn list --recursive

    # 查看处于版本控制的文件(夹)的详细信息, 文件夹内容不会递归显示
    svn ls -v

    # 查看处于版本控制的文件(夹)的详细信息, 文件夹内容会递归显示
    svn ls -v --recursive
  2. svn status 列出工作副本中对文件(文件夹)状态

  • ? 无版本控制
  • M 已被编辑过
  • D 已被标记从版本库中删除
  • A 已被标记增加到版本控制中
  • R 文件被替换
  • C 文件存在冲突
  • ! 文件缺失
1
2
# 查看出工作副本中对文件(文件夹)状态
svn status
  1. svn log 查看提交日志(来自svn commit 的-m参数)

    1
    2
    3
    4
    5
    # 查看所有的提交日志
    svn log

    # 查看指定文件相关的提交日志
    svn log 文件名
  2. snv info 工作副本及文件(文件夹)的详细信息

    1
    2
    3
    4
    5
    6
    7
    8
    # 查看整个版本库信息
    svn info

    # 查看版本库指定文件的xx
    svn info 文件名

    # 查看整个版本库信息,并且以xml显示和以管道输出到当前info.xml文件中
    svn info --xml >> info.xml

多版本库解决方案

  1. 使用不同端口号使用多个版本库

    1
    2
    3
    4
    5
    6
    # 创建版本库
    svnadmin create 库名

    # 以指定端口号运行版本库,默认端口号是3690
    svnserve -d -r 库名 --listen-port 端口号
    举例: svnserve -d -r /svnroot/hello --listen-port 3691
  2. 使用一个端口号运行多个版本库,多个版本库存放在同一个目录下

    1
    2
    3
    4
    5
    6
    7
    # 以指定端口号运行版本库,默认端口号是3690
    svnserve -d -r 多个版本库对应根目录
    举例: svnserve -d -r /svnroot

    # 检出版本库
    svn checkout 地址/版本库名称
    举例:svn checkout svn://192.168.0.1/hello

svn copy

  • 工作副本 -> 工作副本
  • 工作副本 -> 版本库(不可跨版本库操作!)
  • 版本库 -> 工作副本 (可跨版本库操作!)
  • 版本库 -> 版本库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 复制工作副本单个文件并重新命名,复制后的文件默认加入版本控制中
svn copy 源文件 目标文件

# 复制工作副本指定版本库单个文件并重新命名,复制后的文件默认加入版本控制中
svn copy -r 版本号 源文件 目标文件

# 复制工作副本多个文件,复制后的文件默认加入版本控制中
svn copy 源文件 源文件 源文件 目标文件夹

# 复制工作副本到线上版本库
svn copy 源文件 线上版本库地址 -m "备注"

# 复制线上版本库文件到工作副本
svn copy 线上版本库地址 目标文件 -m "备注"

主干版本和分支版本

1
2
3
# 复制线上版本库文件
svn copy 线上版本库地址 线上版本库地址 -m "备注"
举例:svn copy svn://192.168.0.130/imooc svn://192.168.0.130/imooc/trunk -m "trunk"

svn高级应用

HOOKS钩子应用

钩子位于版本库的hooks文件夹下

版本库精简与丢弃

  1. 停止svn服务

    1
    killall svnserve
  2. 备份版本库系统

    1
    svnadmin dump 版本库文件系统路径 -r 版本号 : 版本号 >>  目录  文件名
  3. 新建版本库,并将备份版本库放到该版本库中

    1
    2
    svnadmin create 版本库
    svnadmin load 版本库 < 备份文件名

版本库精简后,以前的工作副本不可再使用,需要重新检出版本库的一份工作副本。

版本库迁移与switch重定向

版本库迁移步骤:

  1. killall svnserve
  2. 把/svnroot/repo压缩成repo.zip
  3. 复制repo.zip到新服务器并解压
  4. 在新服务器运行repo版本库

工作副本switch重定向

1
svn switch --relocate 旧版本库地址 新版本库地址

svn常见的坑

  1. 忘记配置svnserve.conf
  2. 运行版本库路径问题
  3. svnadmin dump/load 管道符号问题
文章目录
  1. 1. 创建版本库
  2. 2. 运行版本库
  3. 3. 停止运行的所有版本库
  4. 4. 检出版本库
  5. 5. 删除版本库
  6. 6. svn版本库配置
  7. 7. 常见svn客户端命令
  8. 8. 二进制冲突与树冲突
  9. 9. 锁定与解锁
  10. 10. svn进阶
  11. 11. 多版本库解决方案
  12. 12. svn copy
  13. 13. 主干版本和分支版本
  14. 14. svn高级应用
    1. 14.1. HOOKS钩子应用
    2. 14.2. 版本库精简与丢弃
    3. 14.3. 版本库迁移与switch重定向
      1. 14.3.1. 版本库迁移步骤:
      2. 14.3.2. 工作副本switch重定向
  15. 15. svn常见的坑
| 45.9k | |