1.SVN出现的背景
1.1为什么使用版本控制工具?
从个人开发到集体开发
ftp文件服务器,颗粒太大,最小单位是文件,后提交会覆盖前面提交的内容;
svn 服务器,以行为单位
ftp服务器以文件为单位
1.2版本控制工具的功能:
1.协同修改
多个人并行修改服务器端的同一个文件
2.数据备份
如果本地文件丢失可以服务器端文件进行恢复
3.增量式的版本管理;
服务器端保存每一个版本信息时只保存有修改的局部内容,节省服务器端资源
4.权限控制
对团队中,参与开发的人员进行权限控制
5.历史记录
查看修改人,修改时间,修改内容,日志信息
将本地文件回复到摸一个历史状态
2.概念区分
1.版本控制和版本控制工具:
版本控制:
工程涉及领域中使用版本控制管理工程蓝图的设计过程(需要版本的迭代),在IT开发过程中也可以使用版本控制思想管理代码的版本迭代
版本控制工具:
思想:版本控制
实现:版本控制工具
版本控制工具的演变过程:CVS->SVN VSS -->Git
VSS 不会出现版本冲突,对使用的文件,进行锁定,相应的我们要付出人力成本的代价
集中式版本控制工具:
CVS-》SVN VSS
分布式控制工具:
GIT
2.SVN的工作机制
版本库 集中配置管理,客户端需要svn 客户端
SVN常用命令介绍
基本操作:
检出 checkout
把服务器端版本内容完整下载到本地
在整个开发过程中只做一次
更新update
把服务器端相对于本地的新的修改下载到本地
提交: 把本地修改上传到服务器
3.SVN 服务器安装
1.Docker 中搭建SVN服务器
1.安装Docker
2.下载SVN Server
docker search svn
docker pull garethflowers/svn-server
docker images
3.运行Docker
docker run -v /opt/data/svn/repo:/var/opt/svn --name svn-server -p 3690:3690 --privileged=true -e SVN_REPONAME=repository -d garethflowers/svn-server
参数解释:
-name 重命名
-e传递key-value形式的环境变量,这里指定仓库名为 repository
-v /opt/data/svn/repo:/var/opt/svn 将容器/var/opt/svn 目录下的内容,挂载到宿主机/opt/data/svn/repo 下,且删除容器不会删除宿主机内容
-d 后台运行,守护线程
--privileged=true 指定容器是否为特权容器,特权容器拥有所有的capabilities
4.查看是否运行成功
查看运行起来的容器
docker ps
5.进入容器创建SVN服务器空间
##进入容器内部
docker exec -it svn-server /bin/sh
## 创建仓库 创建了一个为repository 的仓库
svnadmin create /var/opt/svn/repository
##进入仓库配置文件路径
cd /var/opt/svn/repository/conf
6.编译配置
vi svnserve.conf 编辑资源库配置:主要指定用户名和密码读取那个文件|权限读取那个文件
vim passwd
vim authz 1.编辑 authz 文件(注意:[/]也是必须的)
重启svn 客户端
docker restart svn-server
7.测试
svn://175.24.2.2:3690/repository
2.服务器通过tar包安装
系统环境:centos7.2
第一步:通过yum命令安装svnserve,命令如下:
yum -y install subversion
此命令会全自动安装svn服务器相关服务和依赖,安装完成会自动停止命令运行
若需查看svn安装位置,可以用以下命令:
rpm -ql subversion
第二步:创建版本库目录(此仅为目录,为后面创建版本库提供存放位置)
选择在var路径下创建版本库,当前处于根目录下,一次性创建如下:
mkdir /var/svnrepos
第三步:创建svn版本库
在第二步建立的路径基础上,创建版本库,命令如下:
svnadmin create /var/svnrepos/xxxx
(xxxx为你预期的版本库名称,可自定义)
创建成功后,进入xxxx目录下
cd /var/svnrepos/xxxx
进入目录,可以看见如下文件信息:
total 24
drwxr-xr-x 2 root root 4096 May 2 13:48 conf
drwxr-sr-x 6 root root 4096 May 2 13:48 db
-r--r--r-- 1 root root 2 May 2 13:48 format
drwxr-xr-x 2 root root 4096 May 2 13:48 hooks
drwxr-xr-x 2 root root 4096 May 2 13:48 locks
-rw-r--r-- 1 root root 229 May 2 13:48 README.txt
下面是这些目录的详细讲解
第四步:配置修改
进入已经创建好的版本库目录下,也就是前文说创建的xxxx,进入conf
cd /var/svnrepos/xxxx/conf
conf目录下,一共存放三份重要的配置文件,如下:
total 12
-rw-r--r-- 1 root root 1080 May 2 13:48 authz
-rw-r--r-- 1 root root 309 May 2 13:48 passwd
-rw-r--r-- 1 root root 3090 May 2 13:48 svnserve.conf
authz:负责账号权限的管理,控制账号是否读写权限
passwd:负责账号和密码的用户名单管理
svnserve.conf:svn服务器配置文件
1.编辑 authz 文件(注意:[/]也是必须的)
[/] 表示根目录,即 /var/svnrepos
luo = rw 表示用户luo对根目录具有读写权限。
2.编辑 passwd 文件
如上所示,用户名为:luo,认证密码为:luo123456
3.编辑 svnserve.conf 文件(注意:配置的前面不能有空格,一定要顶格写)
anon-access = none:表示禁止匿名用户访问。
auth-access = write:表示授权用户拥有读写权限。
password-db = passswd:指定用户名口令文件,即 passwd 文件。
authz-db = authz:指定权限配置文件,即 authz 文件。
realm = /var/svnrepos:指定认证域,即 /var/svnrepos 目录。
第五步:防火墙开启(这里以iptable防火墻为例)
多数情况下服务器安装完成,配置完成后,无法连接svn服务器,均是防火墙问题*【注意:如果是阿里云,腾讯云的服务器,还需在安全组添加端口开启规则】***
vi /etc/sysconfig/iptables
添加配置信息
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3690 -j ACCEPT
保存退出
systemctl restart iptables.service #重启防火墙使配置生效
六:启动svn服务器
svnserve -d -r /var/svnrepos
启动成功后,可用ps -aux查看服务启动是否成功
ps -ef | grep 'svnserve'
七:客户端访问svn服务器
在windows客户端,输入地址:svn://ip地址:3690/xxxx (iP地址为你linux的ip,xxxx为前文创建的版本库名称,3690为svn默认端口)
弹出输入用户名和密码,输入即可访问
或者在linux服务器输入命令测试:
svn co svn://ip地址:3690/xxxx
4.配置过程中的其余配置
1.设置随机启动
1.查看服务状态
chkconfig |grep svn //看和svn相关的命令
svnserve 默认开机不启动
设置svnserve 服务 自动启动 开机
名称: svnserve
默认开机不启动
chkconfig 管理所有服务
service svnserve status 的状态
service svnserve start 启动状态
centos7:systemctl enable svnserve.service
修改服务参数
对应可执行脚本文件的路径
cd /etc/rc.d/init.d
备份svnserve 服务器,配置
启动svn 服务:
service svnserve start
service svnserve status
svn 服务器启动
service svnserve start
service svnserve status
使用默认端口号的配置方式:
5.通过命令行客户端操作SVN服务器
命令行客户端:
创建两个工作区目录模拟两个开发人员
1.检出命令:
svn checkout svn://192.168.70.140/pro_oa ./(目的地) 完整下载版本库中的全部内容
ll 不能查看隐藏内容
ls -lA 查看隐藏文件 包含.svn 目录
附加效果:
在指定目录下创建.svn目录
保存本地目录和文件状态信息,用来和svn服务器进行比较
工作副本:
.svn 所在的目录就是工作副本
版本控制的相关操作都需要在工作副本目录下执行,例如提交/更新等等 这样的操作
为了保证工作副本能够正常和svn 服务器,不要删除和修改
2.提交文件:
svn commit [文件] --报尚未纳入版本控制体系中
svn add hello.txt 并且 需要提交修改日志
要求:1.附加日志信息
日志信息相当于写Java代码时的注释,用来标记本次操作所作的修改
svn commit -m "备注" hello.txt
要求2:必须具备相应的权限
使用文本编辑器 打开版本库 根目录 /conf/svnserve.conf
上传成功:
3.查看上传文件:
版本库中是通过数据库db 进行管理,我们不能直接查看到上传文件的基本信息
类似于读取数据库中文件的操作:
svn list svn://192.168.201.1/pro_oa
4.更新操作:
svn update [文件名称]
作用:把服务器端文件所产生的所有修改下载到本地
更新和检出的区别:
检出:全部下载,创建工作副本
更新:部分增量下载,更新修改的地方的工作副本
5.冲突文件的解决:
vss 工具 不会产生;
冲突:
有冲突发生,一定会出现过时文件
1.过时的文件:在一个相对服务器端版本来说时旧版本的基础上进行修改
要求:所有过时的文件都必须先执行更新操作,更新后在最新版本基础上修改的文件才允许提交
两个用户对同一个版本库的同一个文件的同一行进行不同的修改,且有一个先提交后,后一个提交(update 后),会出现冲突
冲突的产生:
条件1:本地当前编辑的文件已经过时
条件2:从服务器端更新下来的修改和本地的修改在同文件同位置 不一致
冲突的表现:
1.文件内
2.目录内
由于产生了冲突,目录中额外产生了3个文件,
用意:
hello.txt.mine 自己编写的文件(发生冲突时本地文件的内容)
hello.txt.r5 冲突版本前的文件(发生冲突前文件的内容)
hello.txt.r6 冲突版本后的第一个人提交的文件(发生冲突时服务器端的文件内容)
其中 r[小版本号]
r[大版本号]
形成对比的内容,根据文件提示,自己选择使用mine 和 r【大版本号】
冲突的解决:
1.手动的解决
第一步:删除冲突时发生的三个多余文件
第二部:删除冲突文件内多余的符号
第三步:把文件编辑到满意的状态
第四步:提交
2.冲突的半自动解决
根据svn 的推荐,选择编辑
选择e :svn将调用linux 的文本编辑器
需要知道文本编辑器的文件,需要我们指定SVN_EDITOR
/usr/bin/vim aaa 可以进入文本编辑器
which vim -->vim的位置 /usr/bin/vim
设置环境变量:
vim etc/profile
source /etc/profile
echo $SVN_EDITOR
svn info god.log 看本地文件的版本信息
svn info svn://ssl/rep_oa/god.log
查看版本库的的版本信息
解决的过程:
编辑文件内容:
编辑完成后,使用r,就会覆盖本地文件
3.如何尽量减少冲突的产生:
1.如何减少 过时文件:改文件之前先进行更新操作,尽量在最新版基础上修改文件内容
2.尽量减少多人修改同一个文件的可能性
3.加强团队成员之间的沟通。
6.Eclispe开发工具集成SVN工具
1.eclispe的svn插件的选择
1.subversive
eclipse 团队开发的svn 插件
2.subclipse
apache 的svn 团队开发的eclispe插件
subversive 用户体验和性能比较好
2.subversive的安装:
-
安装前的确认:workspace 的编码字符集 -》 utf-8
2.subversive+svnconnector
两种connector:
svn kit
svnHL:远程subversive改写,稳定性比较好
3.创建资源库位置:
目的:让本地的Eclipse SVN插件知道svn 服务器的位置:
4.上传工程的内容到svn:
1.哪些文件 上传 哪些文件不上传:
.setting
.project
文件不需要提交上去,eclispe 的特定文件,
eclipse 忽略文件:
eclipse 特定文件
忽略特定文件的原因:
在服务器山最终运行工程完全没有任何关系
开发团队中,并不是所有参与开发的 成员都是用相同的IDE,所以代码之外的IDE特定文件有可能有区别,如果这些文件也都上传到svn服务器,那么很可能产生冲突
上传是一个标准maven工程
不同IDE之间可以基于标准的maven工程进行开发
2.svn 忽略特定文件
配置全局范围,忽略文件的操作方式
配置文件位置
要修改的配置项:
去掉# 并且顶格写
3.subclipse的安装
如果装的subclipse,不会生成目录项,通常不建议使用
上传工程:在eclipse 中叫做分享工程
第一步:工程-》邮件-》team-》share project
第二部:
第三步:选择一个已经存在的版本库,或者新建一个版本库
可以直接点击finish ,工程在svn 服务器端的目录名和工程名一致,上传工程,
第四步:确认工程跟布鲁和子目录是否全部上传
分享工程后,会在原工程下添加工作副本文件 .svn
图标的意思:
检出工程:
在ecliscep 本地工作区中导入
project from svn
确认资源库位置
注意:在select resurouce 要精确定位到要下载 工程名
找到svn服务器端
选择检出方式:
转化工程类型:
configure->convert to maven project
最终的效果:整个检出 的操作
常规基本操作:
资源-》右键-》 team --》 add
资源-》右键-》 team --> commit
eclispe 中冲突解决:
手动解决:
半自动解决:
team -> edit conflict
第一步: 在冲突的文件上-》右键-》Edit conflict
保存 关闭即可
将自动删除 冲突后产生的文件
标记为已合并
冲突文件-》 右键-》team->mark as merged
7.客户化工具安装-小乌龟
1.tortoiseSVN:
安装后重新启动
设置setting:
-------------------------
分享工程
.svn 没有 这个文件,在新工程下
只有.svn 存在,才可以进行commit
问题:单独使用 tortoiseSVN将一个工程上传到svn 服务器中
思路:
人为的到svn 服务器上,创建一个目录(空目录)-》检出-》.svn 文件
-》mvn archetype:generate ->工程目录结构-》导入到eclispe中进行开发
骨架文件需要 archetype-catalog.xml 文件,
针对 archetype_catalog.xml文件的准备工作
作用:maven 生成工程目录过程中需要使用的配置文件
下载地址
放置的位置:
通过tortoise 创建目录和版本库
打开资源库浏览器
右击-》create folder
检出新建的目录
客户端 --》svn checkout
使用maven 命令 生车工股价:
mvn archetype:generate 命令参数含义
前提条件:空文件
找一个空文件夹创建后,复制到副本空间内
-------------------
导入maven 工程:
设置setting ,忽略掉 target
如果在eclispe插件操作,则并无此设置过程
最新版svn ,打开文件,就会自动更新