svn

lishihuan大约 9 分钟

svn

参考:https://www.huoban.com/news/post/6183.htmlopen in new window

https://blog.csdn.net/chiwang_andy/article/details/130265710open in new window

https://gitee.com/witersen/SvnAdminV2.0open in new window

https://blog.csdn.net/qq_36804616/article/details/128097588open in new window

SVN 是 subversion 的缩写,是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,实现最终集中式的管理。

目前很多互联网公司在使用 SVN,优点在于使用方便、易于管理。与之对应的分布式的版本控制系统 Git 则更加灵活。

1. 搭建

安装 SVN

## Ubuntu
apt-get install subversion

# Centos
yum install subversion -y

查看是否安装成功,可以查看版本。

提示版本 1.13.0,说明已安装成功。

svnserve --version 

2. 创建版本库目录

创建 SVN 版本库目录,为后面创建版本库提供存放位置,也是最后启动 SVN 服务的根目录。

我们在 /usr 路径下创建 svn 目录作为版本库目录。

cd /usr
mkdir svn

Linux 系统各目录知识延伸:

将 SVN 库存放在用户文件目录 /usr 下比较合理

查询 subversion 软件包中的一些关键文件和目录 rpm -ql subversion | more

img
img

3. 创建 SVN 版本库

在上一步建立路径基础上,创建版本库,如 dev。

特别说明: 创建仓库的时候,最好放到一个文件夹下,否则使用下面的svnadmin管理界面 进行赋权会出现点异常

主要是:authz.conf 文件中 [dev:/] 这里出现异常,需要手动修改为 [/] 其中 [dev:/] 中的dev指的是 仓库名称,

cd /usr/svn
svnadmin create dev

创建成功后,可以查看到 dev 目录下生成的文件。

[root@localhost dev]# ls
conf  db  format  hooks  locks  README.txt

4. 修改 SVN 配置

进入 conf 目录,查看需要修改的配置文件。

cd /usr/svn/dev/conf

配置文件:

  • authz:权限配置文件,控制读写权限
  • passwd:账号密码配置文件
  • svnserve.conf:svn 服务器配置文件

修改 svnserve.conf 文件

vim svnserve.conf
img
img

去掉 anon-access、auth-access、password-db、authz-db、realm 几项前的注释符号 “#”。

配置项含义:

  • anon-access = none|read|write 决定非授权用户的访问级别。none 表示无访问权限,read 表示只读,write 表示可读可写,默认为 read。

  • auth-access = none|read|write 决定授权用户的访问级别,使用与上面相同的访问级别。默认为 write。

  • password-db = filename 指定账号密码数据库文件名。filename 是相对仓库中 conf 目录的位置,也可以设置为绝对路径,默认为 passwd。

  • authz-db = filename 指定权限配置文件名,filename 是相对仓库中 conf 目录的位置,也可以设置为绝对路径,默认为 authz。

  • realm = realm-name 指定版本库的认证域,即在登录时提示的认证域名称。若两个版本库的认证域相同,建议使用相同的账号密码数据库文件 passwd。

认证域知识延伸:

在 SVN 客户端登录时,会提示 realm 认证域,如下图的认证域 My First Repository。

img
img

修改 passwd 文件

vim passwd

只需在末尾添加账号和密码,格式 账号 = 密码

[users]
user1 = 123456

修改 authz 文件

vim authz

编辑 如果用户比较多,可以使用 groups 形式设置分组 team1,并在根目录下指定分组 @team1 的权限:

img
img

如果想设置其他用户的权限,可以通过 * 设置,如设置除 @team1 分组外其他用户只读权限:

[/]
@team1 = rw
* = r

5. 启动 SVN 服务

执行 SVN 启动命令,其中参数 -d 表示以守护进程的方式启动, -r 表示设置的根目录。

svnserve -d -r /usr/svn/

6. 关闭 svn 命令:

killall svnserve

7. 本地访问 SVN 服务

在 windows 系统中,安装 TortoiseSVN 软件,创建一个本地目录,右键选择 SVN Checkout 测试下,URL 填写 svn://IP/dev,dev 替换成你创建的版本库名称。

svn://IP/dev 其中dev 指的是仓库名称

**注:**如果防火墙开启则无法访问,默认 SVN 端口 3690

firewall-cmd --zone=public --add-port=3690/tcp --permanent
systemctl restart firewalld.service

8. 设置开机启动

使用 systemd 服务来实现 SVN 服务的开机自启动

当前启动命令: svnserve -d -r /svn/

vim /etc/systemd/system/svnserve.service

添加下面的

[Unit]
Description=SVN Server

[Service]
Type=forking
ExecStart=/usr/bin/svnserve -d -r /svn/

[Install]
WantedBy=multi-user.target

为了让 systemd 识别新的服务,你需要执行以下命令:

sudo systemctl daemon-reload

现在,你可以开始使用你的新服务了。使用以下命令启动 SVN 服务:

sudo systemctl start svnserve

如果你想要在开机时自动启动 SVN 服务,你需要使这个服务自启动

sudo systemctl enable svnserve

9. 代码迁移

要将一个 SVN 仓库的代码上传到另一个 SVN 仓库,并保留之前的提交记录,您可以按照以下步骤进行操作:

  1. 创建新的 SVN 仓库:
    • 在另一个 SVN 服务器上创建一个新的仓库,可使用之前提到的步骤进行操作。
  2. 导出现有仓库的代码:
    • 在本地使用 SVN 客户端工具,例如 TortoiseSVN。
    • 使用导出命令将现有仓库的代码导出到本地。例如:右键点击代码根目录 > "TortoiseSVN" > "导出"。
    • 选择一个本地目录作为导出目录,并等待导出完成。
  3. 将代码导入到新仓库:
    • 在本地使用 SVN 客户端工具。
    • 使用检出命令从新的仓库中检出一个空的工作副本。例如:右键点击本地空白文件夹 > "TortoiseSVN" > "检出"。
    • 输入新仓库的 URL,并指定检出到的本地目录,然后点击确定。
    • 将之前导出的代码复制到刚刚检出的工作副本中。
  4. 添加并提交代码:
    • 在本地使用 SVN 客户端工具。
    • 在工作副本中添加所有导入的代码文件。例如:右键点击工作副本 > "TortoiseSVN" > "添加"。
    • 提交更改到新的仓库。例如:右键点击工作副本 > "TortoiseSVN" > "提交"。
    • 在提交对话框中输入提交日志并点击确定。

通过上述步骤,您将能够将代码从一个 SVN 仓库上传到另一个 SVN 仓库,并且保留之前的提交记录。

管理界面

数据库: svnadmin

svnadmin

迁移

1. 整体迁移

如果是整个库的迁移,直接将svn库的文件打包zip, 迁移到指定服务器就行

2. 部分迁移

比如只迁移部分分支的代码

场景: 从客户现场带回来的 提交的代码和提交记录,迁移到公司的svn库中

  • 现场分支路径 [sfpt_svn:/dev_code/sfpt]
  • 公司svn[sfpt_svn:/dev_code/]

需要将客户现场的sfpt 分支下的提交记录迁移到 公司 [sfpt_svn:/dev_code/sfpt] 位置下

主要步骤:

  • 导出svnadmin dump /svn/sfpt_svn | svndumpfilter include /dev_code/sfpt > /home/sfpt_branch.dump
  • 加载备份文件: svnadmin load /svn/sckj_svn < /home/sfpt_branch.dump
  • 检查是否成功:svnlook tree /svn/sckj_svn --full-paths | grep dev_code/sfpt
image-20250227191210440
image-20250227191210440

2.1 过滤导出 sfpt 分支

由于你只需要迁移 /dev_code/sfpt 分支,需要过滤掉其他无关路径。执行以下命令:

svnadmin dump /svn/sfpt_svn | svndumpfilter include /dev_code/sfpt > /home/sfpt_branch.dump
  • svnadmin dump:生成整个库的备份。
  • svndumpfilter include /dev_code/sfpt:只保留 /dev_code/sfpt 路径及其提交记录。
  • /home/sfpt_branch.dump: 指定导出的位置 /home/
  • sfpt_branch.dump:保存过滤后的分支备份文件。

3.2 删除原库指定分支【如果存在相同分支】

报错:[root@DESKTOP-G52AQM6 ~]# svnadmin load /svn/sfpt_svn < /home/sfpt_branch.dump <<< Started new transaction, based on original revision 1 ------- Committed new rev 818 (loaded from original rev 1) >>> <<< Started new transaction, based on original revision 2 svnadmin: E160020: File already exists: filesystem '/svn/sfpt_svn/db', transaction '818-n0', path 'dev_code/sfpt' * adding path : dev_code/sfpt ...

  • 检查是否存在

    svn list svn://127.0.0.1/sckj_svn/dev_code
    
  • 删除分支

    svn delete -m "Deleting dev_code/sfpt for migration" svn://127.0.0.1/sckj_svn/dev_code/sfpt
    

3.3 导入到新库中

svnadmin load /svn/sckj_svn < /svn/sfpt_branch.dump

# 如果不想删除之前的分支代码,可以 迁移到新路径 使用 --parent-dir 参数迁移到新路径   【没尝试过 】 -------------- 只做了解
svnadmin load --parent-dir dev_code/sfpt_migrated /svn/sfpt_svn < /home/sfpt_branch.dump

3.4 导入成功后检查

svnlook tree /svn/sckj_svn --full-paths | grep dev_code/sfpt

3.5 修改uuid

迁移后可能存在UUID不一致导致本地的代码无法重新定位

  • 查询svn库的uuid
svnlook uuid /svn/sfpt_svn
  • 修改本地uuid
    • 打开 .svn 文件夹。
    • 找到 entries 文件(SVN 1.6 及以下版本)或 wc.db 文件(SVN 1.7 及以上版本)。
      • 如果是 entries 文件
        • 用文本编辑器打开 entries 文件。
        • 找到包含 uuid 的行,将其值修改为目标仓库的 UUID。
      • 如果是 wc.db 文件
        • 使用 SQLite 工具打开 wc.db 文件。或者直接拖拽到 Navicat 【直接拖拽到Navicat的右侧窗口中】

          image-20250228141743942
          image-20250228141743942
        • 执行以下 SQL 命令: UPDATE REPOSITORY SET uuid = '目标仓库的UUID';

了解:修改目标仓库的 UUID 【不合理,这个会改了整个库的uuid,导致现有的已经下载的代码不能用了】 svnadmin setuuid /svn/sckj_svn <源仓库的UUID>

  • 操作 重新定位

8. 扩展

基本概念:

主目录:即SVN代码的放置目录,类似于Linux系统的根目录。所有的SVN项目都是放在主目录底下。

user:即SVN的用户

group:即将若干个用户放在一个组。

r, rw:r表示可读权限,rw表示可读可写权限

8.1 设置查看 log 日志

想查看提交的 svn log 日志,需要进一步配置。

编辑 svnserve.conf,设置:

anon-access = none

编辑 authz 文件中添加:

[/]
* =

这样通过鼠标右键 TortoiseSVN->show log 就可以查看 svn 提交的历史记录了。

8.2 多个项目管控配置

SVN 配置文件是很灵活的,如果想使用统一的账户和权限去管控多个项目,可以将多个项目的 authz 和 passwd 文件统一放在一处,在多个项目的 svnserve.conf 文件中配置这两个文件的绝对路径,并在 authz 中对不同的项目设置用户访问权限。

如:a、b、c、d 这 4 个用户,p1、p2 两个项目,其中 a、b 只能访问 p1,c、d 只能访问 p2。

创建版本库目录

mkdir /usr/svn

创建多个版本库

cd /usr/svn
svnadmin create p1
svnadmin create p2

创建管理用户权限目录

mkdir /var/svn/conf
cd /p1/conf
cp authz passwd /var/svn/conf

修改配置文件

修改 p1 的 svnserve.conf 文件:

anon-access = none
auth-access = write 
password-db = /var/svn/conf/passwd 
authz-db = /var/svn/conf/authz 
realm = p1 

修改 p2 的 svnserve.conf 文件:

anon-access = none
auth-access = write
password-db = /var/svn/conf/passwd
authz-db = /var/svn/conf/authz
realm = p2

password-db 和 authz-db 都使用统一管理用户权限目录,使用绝对路径。

修改 password-db 文件

[users]
a = 123
b = 123
c = 123
d = 123

修改 authz 文件

[groups] //分组
p1user = a,b
p2user = c,d
 
[/]
* = #以上没有定义的用户都没有任何权限
 
[p1:/] //p1的访问控制,c、d无法访问
@p1user = rw
 
[p2:/] //p2的访问控制,a、b无法访问
@p2user = rw

对 password-db 和 authz 文件的修改立即生效,不必重启 svn。

启动 svn 服务

svnserve -d -r /usr/svn/

访问不同项目 SVN

同样 TortoiseSVN 软件,选择 SVN Checkout 测试。

访问项目p1 URL
svn://IP/p1

访问项目p2 URL
svn://IP/p1

统一的配置文件,不同项目限定了不同用户访问,这样就实现了管控多个项目的 SVN 配置。