svn安装使用subversion
linux
centos6版本;用7 版本的话命令不兼容;
SVN 笔记
- 从个人开发到团队协作
版本控制工具的功能
-
- 协同修改
- 多人并行不悖的修改服务器端的同一个文件。
- 数据备份
- 如果本地文件发生丢失可以服务器端文件进行恢复。
- 增量式的版本管理
- 服务器端保存每一个版本信息时只保存有修改的局部内容,节约服务器端资源。
- 权限控制
- 对团队中参与开发的人员进行权限控制。
- 历史记录
- 查看修改人、修改时间、修改内容、日志信息。
- 将本地文件恢复到某一个历史状态。
- 协同修改
- 版本控制简介
- 版本控制
工程设计领域中使用版本控制管理工程蓝图的设计过程。在 IT 开发过程中也可以使用版本控制思想管理代码的版本迭代。
-
- 版本控制工具
思想:版本控制
实现:版本控制工具
集中式版本控制工具:
CVS、SVN、VSS…… 分布式版本控制工具:
Git
- SVN 的工作机制
C/S 结构
-
- 基本操作
- 检出(Checkout)
- 把服务器端版本库内容完整下载到本地。
- 检出(Checkout)
- 基本操作
-
-
-
- 在整个开发过程中只做一次。
- 更新(Update)
- 把服务器端相对于本地的新的修改下载到本地。
- 提交(Commit)
- 把本地修改上传到服务器。
-
-
- 服务器端环境搭建步骤
- 安装服务器端程序
yum install -y subversion
-
- 创建并配置版本库
- 创建版本库目录
- 创建并配置版本库
mkdir -p /var/svn/repository
cd /var/svn/repository/
-
-
- 在版本库目录下创建具体项目目录
-
mkdir pro_oa
-
-
- 创建 SVN 版本库
-
svnadmin create /var/svn/repository/pro_oa
-
-
- 版本库内容
-
-
- 配置 SVN 对应的服务
- 配置 SVN 对应的服务
思路
-
-
- SVN 服务
- 名称:svnserve
- 默认情况下不是开机自动启动
- chkconfig|grep svn
- SVN 服务
-
[root@rich repository]# chkconfig|grep svn
svnserve 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
[root@rich repository]# chkconfig svnserve on #开机自启动命令
[root@rich repository]# chkconfig|grep svn
svnserve 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
开机自启动:
chkconfig svnserve on
chkconfig|grep svn
-
-
-
- 对应可执行脚本文件路径
-
-
cd /etc/rc.d/init.d/
/etc/rc.d/init.d/svnserve
修改: svnserve
copy svnserve svnserve.b
注意备份!
-
-
- SVN 服务具体配置
-
原版 |
args="--daemon --pid-file=${pidfile} $OPTIONS" |
修改版 |
args="--daemon --root 版本库根目录 --listen-port 指定端口号 --pid-file=${pidfile} $OPTIONS" |
args="--daemon --root /var/svn/repository --listen-port 2255 --pid-file=${pidfile} $OPTIONS" |
使用默认端口号的配置方式;
注意:我用指定端口后无法访问服务器,svn拒绝;建议用默认端口;
3690端口
args="--daemon --root /var/svn/repository --pid-file=${pidfile} $OPTIONS"
-
- 启动 SVN 服务
[root@rich init.d]# service svnserve start
正在启动 svnserve:[确定]
[root@rich init.d]# service svnserve status svnserve (pid 3443) 正 在 运 行 ... [root@rich init.d]# netstat -anp|grep :2255
tcp 0 0 0.0.0.0:2255 0.0.0.0:* LISTEN 3443/svnserve
[root@rich init.d]# ps -ef|grep svnserve|grep -v grep
root 3443 1 0 11:41 ? 00:00:00 /usr/bin/svnserve --daemon --root
/var/svn/repository --listen-port 2255 --pid-file=/var/run/svnserve.pid [root@rich init.d]# cat /var/run/svnserve.pid
3443
- 命令行客户端
- 创建两个工作区目录模拟两个开发人员
mkdir -p /root/workspace/harry mkdir -p /root/workspace/sally
-
- 检出
- 作用:完整下载版本库中的全部内容。
- 命令:
- svn checkout svn://192.168.70.140/pro_oa ./
- 附加效果
- 在指定目录下创建.svn 目录
- 保存本地目录和文件状态信息,用来和 SVN 服务器进行交互
- 工作副本
- .svn 所在的目录
- 版本控制相关操作都需要在工作副本目录下执行。例如:提交、更新等等 这样的操作。
- 为了保证工作副本能够正常和服务器进行交互,请不要删除或修改.svn 目录中的内容。
- 检出
-
- 添加
- SVN 要求提交一个新建的文件前先把这个文件添加到版本控制体系中。
- svn add 文件名
- 添加
-
- 提交
- 要求 1:附加日志信息
- 日志信息相当于写 Java 代码时的注释,用来标记本次操作所做的修改。
- svn commit -m "xxx" [文件名]
- 要求 2:必须具备相应的权限
- 使用文本编辑器打开版本库根目录/conf/svnserve.conf 文件
- 要求 1:附加日志信息
- 提交
把匿名访问配置项的注释打开。注意:行的开头不能有空格
[root@rich harry]# svn commit hello.txt
svn: 提交失败(细节如下):
svn: “/root/workspace/harry/hello.txt” 尚未纳入版本控制
[root@rich harry]# svn add hello.txt A hello.txt
[root@rich harry]# svn commit hello.txt
svn: 提 交 失 败 ( 细 节 如 下 ): svn: 无法使用外部编辑器获得日志信息;考虑设置环境变量 $SVN_EDITOR,或者使用
--message (-m) 或 --file (-F) 选项
svn: 没有设置 SVN_EDITOR,VISUAL 或 EDITOR 环境变量,运行时的配置参数中也没有“editor-cmd” 选项
[root@rich harry]# svn commit -m "My first commit" hello.txt
svn: 提交失败(细节如下):
svn: 认证失败
[root@rich harry]# svn commit -m "My first commit" hello.txt
增加 hello.txt
传输文件数据.
提交后的版本为 1。
-
- 查看服务器端文件内容
[root@rich harry]# svn list svn://192.168.70.140/pro_oa good.log
hello.txt
-
- 更新操作
- 作用:把服务器端文件所产生的所有修改下载到本地
- 命令:svn update [文件名]
- 更新操作
- 冲突
- 过时的文件
- 概念:在一个相对服务器端版本来说是旧版本的基础上进行了修改的文件。
- 要求:所有过时的文件都必须先执行更新操作,更新后在最新版基础上修改的 文件才允许提交。
- 过时的文件
-
- 冲突的产生
- 条件 1:本地当前编辑的文件已经过时。
- 条件 2:从服务器端更新下来的修改和本地的修改在“同文件同位置”不一致。
- 冲突的产生
-
- 冲突的表现
- 冲突的表现
文件内
-
-
- 目录内
-
xxx.mine 文件:发生冲突时本地文件内容
xxx.r[小版本号]文件:发生冲突前文件内容
xxx.r[大版本号]文件:发生冲突时服务器端文件内容
-
- 冲突的手动解决
- 第一步:删除冲突发生时产生的三个多余文件
- 第二步:删除冲突文件内多余的符号
- 第三步:把文件编辑到满意的状态
- 第四步:提交
- 冲突的手动解决
-
- 冲突的半自动解决
- 冲突的半自动解决
设置 SVN_EDITOR 环境变量
vim /etc/profile
-------------------------------------------
SVN_EDITOR=/usr/bin/vim export SVN_EDITOR
-------------------------------------------
source /etc/profile echo $SVN_EDITOR
-
-
- 解决的过程
- 解决的过程
-
使用 e 选项进入文件内容编辑界面
-
-
-
- 进入 vim 编辑器编辑文件内容
-
-
-
-
-
- 编辑完成后使用 r 选项标记为已解决
-
-
-
- 减少冲突的发生
- 尽可能在修改文件前先进行更新操作,尽量在最新版基础上修改文件内容。
- 尽量减少多人修改同一个文件的可能性。
- 加强团队成员之间的沟通。
- 减少冲突的发生
- Eclipse 的 SVN 插件
- 简介
- Subversive
- 简介
Eclipse 团队开发的 SVN 插件。
-
-
- Subclipse
-
Apache 的 SVN 团队开发的 Eclipse 插件。
-
- Subversive 的安装
- 安装前
- 安装前
- Subversive 的安装
Eclipse→Window→Preferences→Team
-
-
-
- 用户家目录下没有 Subversion 目录
- 安装过程
- 打开 Eclipse 应用市场
-
-
搜索 Subversive
-
-
-
- 确认安装项目
-
-
点 yes 即可
-
-
-
- 同意协议,点 Finish
-
-
安装过程
-
-
-
- 确认重启
-
-
-
- SVN Connector 安装
- Get Connectors
- SVN Connector 安装
-
-
- 选择要安装的 Connector
-
-
-
- 下一步、下一步……
-
同意协议,Finish
-
-
- 点击 Install anyway
-
确认重启
-
- 创建资源库位置
- 目的:让本地 Eclipse SVN 插件知道 SVN 服务器的位置
- 操作步骤
- 创建资源库位置
第一步:切换透视图
-
-
-
- 第二步:创建资源库位置
-
-
输入 SVN 服务器的 URL 地址
-
-
-
- 效果
-
-
-
- Eclipse 工程中忽略文件
- Eclipse 工程中忽略文件
Eclipse 特定文件
-
-
- 忽略特定文件的原因
- 在服务器上最终运行工程完全没有关系
- 开发团队中,并不是所有参与开发的成员都使用相同的 IDE,所以代码文件之外的 IDE 特定文件有可能有区别。如果这些文件也都上传到 SVN 服务器,那么很可能产生冲突。不同 IDE 之间可以基于 Maven 的标准目录结构识别工程。
- 配置全局范围忽略文件的操作方式
- 配置文件位置
- 忽略特定文件的原因
-
~\AppData\Roaming\Subversion\config
例如:C:\Users\Lenovo\AppData\Roaming\Subversion\config
-
-
-
- 要修改的配置项
-
-
把 global-ignores 的注释打开
global-ignores = *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo pycache *.rej *~
#*# .#* .*.swp .DS_Store .settings */.settings/* .classpath .project target */target/*
※如果在 Eclipse 中操作,target 目录会自动忽略;如果使用 TortoiseSVN 则需要追加 target 目录设置。
-
- 分享工程
- 第一步:工程→右键→Team→Share Project...
- 第二步:版本控制工具中选择 SVN
- 第三步:选择一个已经存在的资源库位置或新建一个
- 分享工程
可以直接点 Finish(工程在 SVN 服务器端的目录名和工程名一致;上传工程目录的日志使用默认值)
-
-
- 第四步:确认工程根目录下子目录和文件是否全部上传
-
常见图标含义
-
- 检出操作
- 检出操作
在 Eclipse 中执行 Import 操作
-
-
- 确认资源库位置
-
-
-
- 找到 SVN 服务器端工程对应的目录
-
-
-
- 选择检出方式
-
Finish
-
-
- 转换工程类型
-
最终效果
-
- 基本操作
资源→右键→Team→相关菜单项
-
- 解决冲突
- 第一步
- 解决冲突
冲突文件→右键→Team→Edit Conflicts
-
-
- 第二步
-
在这个界面中修改至满意,关闭界面。
-
-
- 标记为“已合并”
-
冲突文件→右键→Team→Mark as merged
-
-
- 提交
-
- 分支
- 概念
在版本控制过程中,使用多个分支同时推进多个不同功能开发。
不使用分支开发:人与人之间协作 使用分支开发:小组和小组之间协作
-
- 应用场景举例
蓝色皮肤界面功能:小组 1
用户账号管理功能:小组 2
支付功能:小组 3
……
-
- 作用
- 多个功能开发齐头并进同时进行
- 任何一个分支上功能开发失败,删除即可,不会对其他分支造成影响
- 作用
-
- 相关目录
- trunk
- 相关目录
主干
-
-
- branches
-
分支
-
-
- tags
-
存放项目开发过程中各个里程碑式的代码
-
- 创建相关目录
-
-
- trunk
-
主干
-
-
- branches
-
分支
-
-
- tags
-
存放项目开发过程中各个里程碑式的代码
资源库位置→右键→New...→Folder
创建各个具体分支的目录
-
- 创建代码分支
项目→右键→Team→branch...
-
- 切换分支
项目→右键→Team→Swith...
效果:
-
- 合并分支
工程→右键→Team→Merge...
※说明:如果两个分支各自都有新内容,需要合并两次才能够让他们内容一致 分支 1:☆☆☆★★★
分支 2:☆☆☆○○○
分支 1→分支 2:
分支 1:☆☆☆★★★
分支 2:☆☆☆○○○★★★
分支 2→分支 1:
分支 1:☆☆☆★★★○○○ 分支 2:☆☆☆○○○★★★
- SVN 权限管理
- 版本库中三个对应的配置文件
- 版本库配置文件目录
- 版本库中三个对应的配置文件
/var/svn/repository/pro_oa/conf
-
-
- svnserve.conf 文件
-
| 匿名访问 授权访问 |
20 passw ord-db = passwd | 指定设置用户名密码的配置文件 |
27 authz-db = authz | 分配权限的配置文件 |
-
-
- passwd 文件
-
[users] |
|
# harry = harryssecret | 例子 |
# sally = sallyssecret |
|
tom = 123123 | 用户名 = 密码 |
jerry = 123123 |
|
kate = 123123 |
|
-
-
- authz 文件
-
|
例子
用户组 = 用户,用户 |
30 [/] | 针对版本库根目录进行权限设置 |
31 @kaifa = rw | @组名 = 权限值 |
32 kate = r | 用户名 = 权限值 |
33 * = | 上面已经授权的用户以外其他用户没有任何 |
| 权限 |
-
- 客户端测试
※Eclipse 中删除曾经登录过的用户名密码的操作方式
- 查看历史记录
条目不可读问题解决
到 svnserve.conf 文件中把 anon-access 注释打开设置为 none
8[general]
9### These options control access to the repository for unauthenticated 10 ### and authenticated users. Valid values are "write", "read",
11 ### and "none". The sample settings below are the defaults. 12 anon-access = none
13 auth-access = write
让文件回到某一个历史状态
- TortoiseSVN
-
- 独立将工程上传到服务器的思路
-
- 针对 archetype-catalog.xml 文件的准备工作
- 作用:Maven 生成工程目录结构过程中需要使用的配置文件
- 下载地址
- 针对 archetype-catalog.xml 文件的准备工作
http://repo.maven.apache.org/maven2/archetype-catalog.xml
-
-
- 复制到 Maven 的本地仓库
-
Maven 本地仓库根目录\org\apache\maven\archetype\archetype-catalog\[版本号目录]
-
- 操作步骤
- 打开资源库浏览器
- 操作步骤
-
-
- 在 SVN 服务器上创建目录
-
检出新建的目录
-
-
- 执行 Maven 命令
-
mvn archetype:generate 命令参数含义
参数名 | 作用/可选值 |
-DgroupId | 生成工程坐标的 groupId 部分 |
-DartifactId | 生成工程坐标的 artifactId 部分 |
-DarchetypeArtifactId | maven-archetype-quickstart 对应 jar 包工程 maven-archetype-webapp 对应 war 包工程 |
-DinteractiveMode | 设置为 false 关闭用户交互模式 |
-DarchetypeCatalog | 设置为 local 表示使用本地 archetype-catalog.xml 文件 |
-X | 使用 DEBUG 级别打印日志 |
导入 Eclipse 效果
小岗哥哥: rosshow 显示有这个服务消息,但是rosservice list 查不到这个服务
雾都杰克: 还是一样到错误
_无往而不胜_: 作者主要表达的意思是:个人的成功并非仅仅取决于自身努力,基因和成长环境起着至关重要的作用。一个人的成功需要具备天时地利人和的条件以及努力付出,然而这些看似自主的行为实则受到基因和环境塑造的观念所驱动。人们的成功具有必然性,失败也同样如此。大家应该承认运气在成功中的作用,感恩所拥有的一切,同时尊重每个人因不同出身而导致的差异,不要轻视他人。
_无往而不胜_: 用chatgpt转一下
姜山如画: 那个不是只有crc校验代码嘛