SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。互联网上很多版本控制服务已从 CVS 迁移到 Subversion。说得简单一点 SVN 就是用于多个人共同开发同一个项目,共用资源的目的。
svn 安装及配置
安装yum -y install subversion
创建 svn 中央版本库
# 指定svn调用的编辑器为vim
# 设置环境变量
SVN_EDITOR=vim
# 提交的文件存放路径
$svn/repo/db/revs/版本号
# 初始化版本库
mkdir -p /opt/svn/
svnadmin create /opt/svn/python3
# 配置版本库
cd /opt/svn/python3/conf/
--- svnserve.conf ---
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
realm = python3
## 参数解释
# 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,全局唯一标示)。
--- svnserve.conf ---
# 密码文件
--- passwd ---
[users]
admin = 123456
test = 123456
--- passwd ---
# 权限配置
--- authz ---
[groups]
all = admin, test
[python3:/]
* =
@all = r
admin = rw
--- authz ---
# 启动svn
svnserve -d -r /opt/svn
apache + svn
# 安装apache和dav_svn模块
yum -y install httpd httpd-tools mod_dav_svn subversion
# 配置apache
vim /etc/httpd/conf.d/svn.conf
<Location /py3>
DAV svn
SVNPath /opt/svn/py3
AuthzSVNAccessFile /opt/svn/py3/conf/authz
AuthType Basic
AuthName "Authorization SVN"
AuthUserFile /opt/svn/py3/conf/passwd
Require valid-user
Satisfy all
</Location>
# 创建passwd文件
htpasswd -cb /opt/svn/py3/conf/passwd admin 123456
htpasswd -b /opt/svn/py3/conf/passwd test 123456
# 启动apache
systemctl start httpd
# 检出svn库,和原来的方式没什么不同,只不过用http协议传输了,并且passwd是经过md5加密的,安全一些
svn checkout http://192.168.255.101/py3/ --username admin --password 123456
浏览器访问 http://192.168.255.101/py3/ 输入用户名密码即可访问
svn基本命令
cd ~
# checkout 检出版本库到工作区
svn checkout svn://127.0.0.1/python3 --username admin --password 123456
svn checkout svn://127.0.0.1/python3 --username admin --password 123456 my_works # 指定本地路径
yes -> 缓存密码
# 提交commit
cd python3
--- readme.md ---
hello, subversion!
--- readme.md ---
svn status # 查看待变更列表
svn status -u # 显示更新信息
svn status -v # 显示详细信息
svn add readme.md # 添加文件(夹)到暂存区
svn commit -m 'add file readme.md' # 提交暂存区至版本库
svn update # 同步最新版本库至工作区
svn update -r 15 # 同步指定版本
# 版本回退
svn revert fire # 回退工作区文件至暂存区版本
svn revert -R dir # 目录
svn merge -r 22:20 file # 回退文件至指定版本库版本(22->20)
svn log # 查看版本信息
svn log -r 1:4 # 查看指定版本之间的信息
svn log -l 3 -v # -v 详细信息,-l N 指定输出条目
svn diff # 对比工作区文件和暂存区文件
svn diff -r 3 readme.md # 对比工作区文件和版本库文件
svn diff -r 2:3 readme.md # 对比版本库文件
svn cat -r 3 readme.md # 查看指定版本文件
svn list svn://127.0.0.1/python3 # 查看版本库文件
svn export svn://127.0.0.1/python3 --username admin --password 123456 # 导出svn库(不包含.svn目录)
svn export svn://127.0.0.1/python3 --username admin --password 123456 exp # 导出至指定目录
svn import ~/works/dest/ -m '...' svn://127.0.0.1/python3 --username admin # 导入文件夹内容至版本库
svn import ~/.oh-my-zsh/ -m '...' svn://127.0.0.1/python3/oh-my-zsh --username admin # 指定版本库中的文件夹名
# 分支branch
ls
branches tags master
svn copy master branches/dev
svn commit -m 'add new branch'
cd branches/dev/
do something...
svn add ..
svn status
svn commit -m 'add ...'
## 合并
cd master
svn update
svn merge ../branches/dev/
svn commit -m '...'
# 标签tag
svn copy master tags/v1.0_stable
svn commit -m '...'
svn文件冲突
# 文件冲突原因:
当两个或者两个以上开发人员同时修改一个文件的同一个地方,就会出现冲突
# eg:
A和B两位工程师,版本库最新版本为10,A和B checkout,版本都是10,没问题
A 修改文件test的第一行为 A,然后提交到版本库,没问题,此时版本号已经是11了
B 修改文件test的第一行为 B, 然后提交到版本库,svn提示需要更新本地工作区副本至最新版本11
然后B执行 svn update , 又报错,提示文件冲突,需要手动解决,选择p
这时候工作区出现了4个文件
test test.mine test.r10 test.r11
test 冲突后的文件,主要就是手动修改此文件就行
test.mine B修改后的文件test
test.r10 B提交前的版本,也就是没有导致冲突的版本
test.r11 A提交后的版本,就是A修改的文件test, 导致冲突
## 分两种情况
1. A和B讨论后,决定保留A的修改,放弃B的修改:
svn resolve --accept theirs-full test
svn ci -m '保留A的更改'
1. A和B讨论后,决定保留B的修改,放弃A的修改:
svn resolve --accept working test
svn ci -m '保留B的修改'
# svn resolve 用法
svn resolve --accept base FILE/DIR # 保留test.r10
svn resolve --accept working FILE/DIR # 保留test
svn resolve --accept mine-full FILE/DIR # 保留test.mine
svn resolve --accept theirs-full FILE/DIR # 保留test.r11
svn resolve --accept mine-conflict FILE/DIR # 冲突部分以test.mine的为准
svn resolve --accept theirs-conflict FILE/DIR # 冲突部分以test.r11的为准
svn树冲突
# 树冲突:
当一名开发人员移动、重命名、删除一个文件或文件夹,而另一名开发人员也对它们进行了移动、重命名、删除或者仅仅是修改时就会发生树冲突。
# 解决: http://www.jianshu.com/p/e3cc83ca512d