序
重新写一篇,发现svn有了中文版教程,一下兴致就上头。正好新项目要搭建svn环境,开一篇复习复习。发誓一定写完整!
真正开始搭建才发现上面链接里的教程并没什么用,因为需要搭建版本库使用的系统是ubuntu,而上面的教程是基于windows系统
环境与依赖
系统:Ubuntu 18.04
使用HTTP协议访问SVN存储库需要安装:Apache 2
使用HTTPS协议访问SVN存储库需要安装:Apache 2 + OpenSSL
SVN简介
不同于GitHub,SVN版本控制使用集中式的管理方法,需要一台主机作为中心服务器。因此一般会使用服务器作为中心主机,在中心主机上搭建版本库,其他主机从中心主机上拉取代码,修改,并上传修改后的代码到中心主机。
SVN安装
sudo apt install subversion
svn版本库用户命令简要
svn命令由svn+子命令+选项+参数
构成,大部分子命令都会以文件或者文件夹作为参数,并且对文件夹中的文件递归执行命令。因此如果子命令中没有提供参数,svn默认在当前目录(包括当前目录)递归执行命令
下面的内容只是非常简要地指出了命令的大概操作,具体使用细节请直接svn 命令 --help
查看。
svn --help
:查看帮助
svn checkout
:从版本库中导出工作副本
svn update/up
:将版本库的修改合并到工作副本中,一般是在commit前先update一下
svn add PATH
:添加文件/文件夹到版本控制,此时未上传至服务器
svn commit [PATH]
:提交添加的文件/文件夹到服务器,服务器会生成一个更新的代码版本
svn export
:导出一个无版本控制的文件副本,需要指定导出版本
svn import
:将未纳入版本控制的文件提交到版本
svn list/ls
:列出版本库中的目录内容
svn cleanup [PATH]
:递归清理工作副本,移除写锁,恢复未完成的操作等
svn copy/cp
:从仓库或当前工作文档中拷贝文件或目录
svn delete/del/remove/rm
:从版本库中删除文件和目录
svn diff
:显示两个修改或路径之间的本地更改或差异
svn info
:显示有关本地或远程项目的信息
svn lock
:锁定版本库中的路径,使得其他用户不能向其提交修改
svn unlock
:解除工作副本或URL的锁定
svn merge
:合并多个修改到一个工作副本中
svn mkdir
:创建纳入版本控制的新目录
svn move/mv/rename/ren
:移动/重命名工作副本或仓库中的项目
svn upgrade
:升级工作副本的元数据存储格式
svn status
:显示本地修改的文件列表
svn auth
svn log
svn mergeinfo
svn patch
svn propdel
svn propedit
svn propget
svn proplist
svn propset
svn relocate
svn resolve
svn resolved
svn revert
svn switch
svn blame/praise/annotate/ann
svn changelist
svn cat
svn版本库管理者命令简要
版本库管理者使用命令是svnadmin 子命令 路径 参数
,与svn使用者的命令不同,注意区分
svnadmin crashtest
:在 REPOS_PATH 打开存储库,然后中止,从而模拟在持有打开的存储库句柄时崩溃的进程
svnadmin create
:创建一个新的,空的仓库
svnadmin dump
:将文件系统的内容以“dumpfile”可移植格式转储到标准输出,向标准错误发送反馈
svnadmin hotcopy
:热拷贝(?hot copy)一个仓库
svnadmin info
:打印仓库信息
svnadmin load
:加载dump后的文件,并作为一个新的修订到文件系统中。如果仓库之前是空的,那么UUID将会默认改成文件中的第一个;如果指定了 --revision,则将加载的修订限制为仅转储流中修订号与指定范围匹配的修订
svnadmin lock
:通过 USERNAME 设置 COMMENT-FILE 中的注释来锁定 PATH
svnadmin lslocks
:打印所有锁的描述
svnadmin lstxns
:打印所有未提交事务的名称
svnadmin pack
:将版本库压缩为更搞笑的存储模型
svnadmin recover
:在存储库上运行恢复过程
svnadmin rmlocks
:无条件移除已锁仓库上的锁
svnadmin rmtxns
:删除事务
svnadmin setuuid
:重设仓库的UUID
svnadmin unlock
:在验证与锁关联的令牌与 TOKEN 匹配后,解锁锁
svnadmin upgrade
:将存储库升级到支持的最新架构的版本
svnadmin verify
:确认仓库中存储的数据
svnadmin setrevprop
svnadmin setlogs
svnadmin list-unused-dblogs
svnadmin list-dblogs
svnadmin freeze
svnadmin deltify
svnadmin delrevprop
搭建版本库
创建svn用户组
- 查看当前组:
sudo cat /etc/group
- 创建svn组:
sudo groupadd -g 666 svn
,其中666是可以任意设置,不重复就好 - 查看组内成员:
members svn
- 查询当前用户:
whoami
- 查询所有用户信息:
cat /etc/passwd
,shadow是密码文件;以冒号分割;从左到右含义分别是:用户名:密码占位符(x 表示用户需要密码登录):用户标识号(UID):组标识号(GID):注释性描述:主目录:登录的 shell - 添加当前户到组:
sudo gpasswd -a sysadmin svn
- 添加www-data用户到组:
sudo gpasswd -a www-data svn
创建svn项目文件夹
一般会在/srv/svn、/usr/local/svn、/home/svn等地方创建svn文件,然后在svn文件夹内创建项目文件夹,不同项目建立不同的文件夹,但均放在svn文件夹下;在这里创建的svn文件夹,里面包含的各个项目的文件夹并没有存储代码文件,而是存储的存储了历史版本代码的封装文件
如果问,如何在服务器上修改和编辑实体代码,并上传到版本库,那么你可以在服务器任何一个你想存放代码的位置,使用svn
从版本库中拉取代码即可,即在服务器上拉取服务器存储的代码
创建svn仓库
sudo svnadmin create 项目文件夹绝对路径
执行该命令后项目文件夹会有一些svn自带的文件和文件夹,
更正文件夹限权
sudo chown -R www-data:svn 项目文件夹
sudo chmod -R g+rws 项目文件夹
添加原始代码
在做完上面的工作后,版本控制库已经建立完毕
如果想在服务器做到像远程主机那样修改、提交代码,或者想添加一份原始代码到服务器,那么服务器和远程主机均可以,只是服务器拉取版本库代码跟远程拉取的命令不同
一个在服务器本地提交代码的例子
-
假设
假设服务器上的版本库中没有代码 -
流程
- 在一个你期望存放代码的地方打开终端
- 使用本地拉取命令:
sudo checkout file:///absolute/path/of/your/project/in/svn/folder
,此时从svn文件夹下拷贝了一个工作副本 - 将代码复制粘贴进2生成的文件夹
- 执行
svn add *
添加文件 - 执行
svn commit -m "first time add code, this is version 1"
,即可在服务器上将代码提交到服务器的版本库
一个在远程主机提交代码的例子
-
假设
假设服务器上的版本库中没有代码 -
流程
- 在一个你期望存放代码的地方打开终端
- 使用远程访问命令:
svn checkout svn+ssh://username@hostname/absolute/path/of/your/project/in/svn/folder
,此时从svn文件夹下拷贝了一个工作副本 - 将代码复制粘贴进2生成的文件夹
- 执行
svn add *
添加文件 - 执行
svn commit -m "first time add code, this is version 1"
,即可在远程主机上将代码提交到服务器的版本库
访问方法
上面是在存放版本库的服务器搭建仓库,下面是其他主机访问服务器的方法。访问方法一共有五种:
- 本地访问:一般是在服务器上自身访问自己
- http访问
- https访问
- svn访问
- svn+ssh访问
在这里只讲svn+ssh的访问方法,其他方法的细节见参考链接的第一条。
本机直接访问
该方法只用于访问来自同一台机器(服务器自己访问自己)的svn,在版本库搭建好后,在期望存放代码的地方直接打开终端,使用下面的命令,即可拉取代码:
svn checkout file:///absolute/path/to/your/project
svn checkout file://localhost/absolute/path/to/your/project
上面两个命令的区别在于file冒号后的斜杠(/)数量,使用///就不需要再加上主机名,使用//则需要加上主机名
svn+ssh访问
使用该方法的前提是能够在终端中使用ssh远程登录服务器。如果满足上面的条件,则
- 先在本地主机中新建一个存放项目副本的文件夹
svn checkout svn+ssh://username@hostname/absolute/path/to/your/project projectName
即可拉取远程服务器上的文件/文件夹到本机,后续修改后,直接add+commit提交到远程服务器即可