文章目录
- 基础知识-Windows下版本控制器(SVN)
- 3.4 TortoiseSVN使用
- 3.4.1 SVN检出(SVN Checkout)
- 3.4.2 SVN更新(SVN Update)
- 3.4.3 **SVN**提交(SVN Commit)
- 3.4.4 **SVN**还原(SVN Revert)
- 3.4.5 解决文件冲突
- 3.4.6 授权访问
- 3.4.7 显示日志(Show log)
- 3.4.8 版本库浏览(Repo-browser)
- 3.4.9 TortoiseSVN更换或重置登录用户
- 3.4.10 如何修改提交仓库地址
- 3.4.11 TortoiseSVN中创建版本库和导入区别
- 3.4.12 合并分支代码
- TortoiseSVN有2种合并方式
- 演示场景1:(合并一个版本范围 Merge a range of revisions)
- 演示场景2:(合并两个不同的树 Merge two different trees),不设置主分支版本
- 演示场景3:(合并两个不同的树 Merge two different trees),设置主分支版本
- 结论总结:
- 3.4.13 删除分支
- 3.4.14 Import(导入)
- 3.4.15 Add(加入)
- 3.4.16 Revision Graph(版本分支图)
- 3.4.17 Branch/Tag(分支/标记)
- 3.5 权限配置
- 3.5.1 单一版本库权限配置
- 3.5.2 多版本库共享配置
- 3.6 合并深度介绍
- 3.7 分支介绍
- 本人其他相关文章链接
基础知识-Windows下版本控制器(SVN)
3.4 TortoiseSVN使用
3.4.1 SVN检出(SVN Checkout)
3.4.2 SVN更新(SVN Update)
3.4.3 SVN提交(SVN Commit)
3.4.4 SVN还原(SVN Revert)
指代项目版本回滚之前的某个版本
点击显示日志可以查看版本信息
3.4.5 解决文件冲突
选中冲突文件,鼠标右键选择“编辑冲突”
在下方进行复制编辑,最后点击“保存”即可。
到现在文件状态就已经变了
3.4.6 授权访问
总结:
如果是匿名访问(就是不用输入用户名+密码的访问方式),请只开启anon-access = write
如果授权访问,请先设置anon-access = none,然后打开3个:auth-access = write、password-db = passwd、authz-db = authz
注意
:必须设置anon-access = none,否则会代码提交报错失败。
①要设置授权访问就需要创建用户,并为用户设定权限
②打开授权访问的配置
[1]打开 D:\DevRepository\Subversion\CRM\conf\svnserve.conf (svnserve.conf文件: 核心配置文件)
[2]将第 19 行 anon-access = write 注释掉:# anon-access = write
表明该版本库不接受匿名访问
[3]将第 20 行# auth-access = write 注释打开:auth-access = write
表明该版本库使用授权访问
[4]将第 27 行注释打开:password-db = passwd
表明使用同目录下的 passwd 文件保存用户信息
[5]将第 36 行注释打开:authz-db = authz (authz文件: 权限认证相关)
[6]打开 passwd 文件创建用户 (passwd文件: 用户密码相关)
tom = 123456
jerry = 123456
nick = 123456
tester = 123456
[7]打开 authz 文件:#后面注释的是例子
[/]
表示该仓库下的所有路径
[CRM:/oneLayer/1]
中CRM为仓库名,表示该仓库下的“/oneLayer/1”路径
@developer= rw
表示developer该组的所有成员访问权限为可读可写,设置组权限需要用@符号表示,而直接设置用户权限则不需要添加@
[CRM:/oneLayer/1]
jerry = rw
,表示jerry 用户只拥有CRM仓库下/oneLayer/1路径下的所有读写权限访问权限,而/oneLayer/1前面的路径则没有访问权限
*=
因为后面没有写访问权限,所以表示其他人没有访问权限
<1>创建用户组
[groups]
# harry_and_sally = harry,sally
# harry_sally_and_joe = harry,sally,&joe
@developer = rw
<2>指定路径,给用户和用户组授权
# [/foo/bar]
# harry = rw
# &joe = r
# * =屏蔽那些未设定的用户,让它们没有任何权限
[/]
@developer = rw
tester = r
* =
[CRM:/oneLayer/1]
jerry = rw
[CRM:/oneLayer/2]
nick = rw
<3>权限的继承性
:父目录设置的权限,对子目录同样有效——除非子目录进行 了更为具体的设定(这个没验证过,需博主自己验证下)
[/subDir]
userOther = rw
* =
这个例子表示当前版本库下的 subDir 目录只有 userOther 有读写权限,其它用户 无任何权限
模拟登录tom用户,验证能否提交成功。答案是可以提交。
模拟登录测试用户tester,验证能否提交成功。答案是不可以提交,因为权限不够。
做一个小测验,需求:假设我的项目结构如图,假设每一个包含text.txt的文件夹都是一个真实的项目,且存在多层级结构,我现在想实现
tom用户
具有CRM路径(目前CRM路径就是SVN的某一仓库的根目录)下的所有读写访问权限,而jerry用户
只CRM/oneLayer/1路径下的读写权限,而nick用户
只有CRM/oneLayer/2路径下的读写权限,而tester测试用户
只有读权限没有写权限。
- 这个项目想模拟的就是新建的tom用户具有管理员权限,jerry和nick用户只有部分路径的访问读写权限,而测试用户只有读没有写的权限。对应的真实场景就是:我自己搭建了SVN,我自己创建管理员账户并授权,但是新建别的用户我想控制权限,让他们只有自己项目的访问权限,而别人的项目没有拉取代码的权限,想演练下如何实现。
-
前提说明
:目前CRM路径就是SVN的某一仓库的根目录,就是对应auth配置文件中的[/] -
passwd文件
tom = 123456 jerry = 123456 nick = 123456 tester = 123456
-
auth文件
[groups] # 控制新增用户权限 [/] @developer = rw tester = r * = [CRM:/oneLayer/1] jerry = rw [CRM:/oneLayer/2] nick = rw
-
演练场景1
,验证tom用户能否checkout下载/CRM/oneLayer/1下的项目oneLayerProject,如图,答案是可以成功下载,说明它拥有/路径下的所有权限。
演练场景2
,验证nick用户能否checkout下载/CRM/oneLayer/2下的项目twoLayerProject,如图,答案是可以成功下载,说明它拥有/oneLayer/2路径下的所有权限。
演练场景3
,验证nick用户能否checkout下载/CRM/oneLayer/1下的项目oneLayerProject,如图,答案是不可以成功下载,说明它没有/oneLayer/1路径下的所有权限。
3.4.7 显示日志(Show log)
通过此功能可以查到谁,什么时候,对那个目录下的那些文件进行了那些操作,如下图:
3.4.8 版本库浏览(Repo-browser)
此功能是用来浏览需要查看的资料库,在本地文件夹下点击右键,选择TortoiseSVNàRepo-browser,在弹出的对话框中输入资料库地址,再输入用户名和密码,就能查看到你需要查看到版本库的内容,在这你还能看到那些文件被谁锁定了,如下图:
3.4.9 TortoiseSVN更换或重置登录用户
1,打开SVN的settings
2,找到Saved Data栏,右侧Authentication data项点击清除按钮clear
3,再次打开SVN,会要求输入username和password
3.4.10 如何修改提交仓库地址
如果项目提交地址编写不规范,想重新命名提交个新的地址,但是不用IDEA只用TortoiseSVN情况下如何操作
答案
:可以打开“版本库浏览器”,在左侧的目录树中进行创建、移动目录即可。
3.4.11 TortoiseSVN中创建版本库和导入区别
创建版本库
:对于真实的项目,您将在安全的地方设置一个存储库,并使用Subversion服务器对其进行控制。每个项目都需要创建版本库,才会有.svn文件,才能将项目进行SVN管理(实际是相当于创建了个某一种分类类型的仓库,它里面可以存放很多路径的项目,比如版本库叫“CRM仓库”,那么该路径下存储客户关系管理系统相关的项目;如果版本库叫“粮食仓库”,那么该路径下存储粮食管理系统相关的项目)导入
:就是将某些文件导入到已创建版本库中。
3.4.12 合并分支代码
需求
:这里为了演练一种场景,我主分支trunk_V01创建一个新的开发分支trunk_V02,然后主分支和新分支一起开发不同通能,最后我要把trunk_V02新分支合并到主分支trunk_V01上,要求是主分支新创建的文件要存在,新分支trunk_V02新创建的文件也要存在,冲突的相同文件名内容解决冲突即可。
说明
:主分支trunk_V01里面只有一个文件text.txt文件,内容如图,然后将依照当前主分支创建新分支命名叫trunk_V02
接下来模拟两个分支不同开发,主分支创建新文件trunk_V01_01.txt,并且修改text.txt内容,然后新分支trunk_V02创建新文件trunk_V01_02.txt,并且修改text.txt内容,项目目录如图1,主分支如图2,新分支如图3
TortoiseSVN有2种合并方式
TortoiseSVN有2种合并方式:
合并一个版本范围 Merge a range of revisions
:此类型应用最为广泛,主要是把分支中的修改合并到主干上来
。在主干上点击右键选择合并,然后选择合并类型:合并一个范围的版本。合并的源URL填写的是要合并的分支的URL,待合并的版本范围如果为空,则指的是合并分支上所有的版本,即自从分支创建以来到分支当前最新版本的所有演变。如果只是选择其中一个版本,或者几个版本,那么就表示只是将制定的n个版本的变化合并到主干上。如果只是选择其中一个版本,那么表示只是选择那个版本的修改,之前或之后的修改将不被采纳。合并两个不同的树 Merge two different trees
:此类型与前1种类型不同,第一种类型可以选择分支合并的版本,主干不能选择版本;而这种类型则是无论是主干还是分支都可以选择合并的版本,即可以选择过去的一个主干版本与分支的某个版本进行合并
。合并的时候以选择的分支版本为主,如果选择的主干版本与分支版本有不同的地方,合并时主干部分将被放弃
。起始URL
:选择主干目录的URL(应当和当前工作副本的URL一致,这个是所谓的合并点)。结束URL
:选择要合并的分支的URL。起始和结束的版本
:一般起始版本应当找到最后一次同步时的版本,如果从没有同步过(第一次合并),则选择创建分支时的版本,结束版本一般是最新版本,如果你不想将某些内容合并进主干的话,也可以选择一个合并点。
演示场景1:(合并一个版本范围 Merge a range of revisions)
演示场景1:(合并一个版本范围 Merge a range of revisions)
第一步,在文件夹trunk_V01点击右键“合并”
选择第一种合并类型
合并源url选择trunk_V01的地址,将要合并的修改版本范围选择所有版本
打开合并后的文件夹查看,最终效果是:text.txt冲突了但解决了冲突之后拥有全新的代码,主分支trunk_V01新创建的文件trunk_V01_01.txt依然存在,新分支trunk_V02新创建的文件trunk_V02_01.txt也存在。(即:最终效果正确,就是我们想要的)
演示场景2:(合并两个不同的树 Merge two different trees),不设置主分支版本
演示场景2:(合并两个不同的树 Merge two different trees),不设置主分支版本
重复上面的第一步
选择第2种合并类型
选择起始、结束url,版本都用最新的版本
打开合并后的文件夹查看,最终效果是:text.txt冲突了但解决了冲突之后拥有全新的代码,但主分支trunk_V01新创建的文件trunk_V01_01.txt被删除了,新分支trunk_V02新创建的文件trunk_V02_01.txt存在。(即:最终效果不正确,新分支的确实都存在,但主分支新创建的文件全丢了)
问题:思考为啥这种方式对导致主分支新创建的文件丢失?
答案
:因为创建新分支trunk_V02的时候主版本只有text.txt文件,而trunk_V01_01.txt是主分支后面新开发创建的,在合并的时候由于主分支采用最新版本情况下导致合并的时候不认识,所以导致合并会删除它。而场景3由于设置了主分支版本号,就相当于合并代码的时候是从主分支在最开始刚创建新分支的时候版本进行合并的,因此主分支新创建的文件trunk_V01_01.txt会被保留。
(我用大白话再表述一遍:当前主分支trunk_V01版本号为1的时候,主分支trunk_V01只有text.txt文件,这时候创建的新分支trunk_V02版本号为2,这时候分别开发提交自己代码,主分支trunk_V01新创建trunk_V01_01.txt文件并提交此时版本号为3,新分支trunk_V02也新创建trunk_V02_01.txt文件并提交此时版本号为4,此时再进行合并代码的时候由于新分支trunk_V02是从主分支trunk_V01版本号为1时创建过来的,所以SVN只认识主分支上版本号为1之前的所有改动,即只认识text.txt文件,而后来的trunk_V01_01.txt文件是主分支trunk_V01新创建的,所以SVN不认识,这就导致合并的时候给它删了。即:所谓的分支版本合并,就是把两个分支设置版本号之前的所有改动给统一合并代码。)
演示场景3:(合并两个不同的树 Merge two different trees),设置主分支版本
演示场景3:(合并两个不同的树 Merge two different trees),设置主分支版本
重复上面的前两步
主分支版本设置为创建新分支trunk_V02时候的版本,具体方法可查看“版本分支图”,选中新分支trunk_V02文件夹点击右键“版本分支图”查看,可以查看起始版本是116,说明主分支当时的版本是115(即在主分支115版本时进行创建了新分支trunk_V02,所以第三步这里输入115)
选择起始、结束url,主分支版本进行设置,新分支采用最新的版本
打开合并后的文件夹查看,最终效果是:text.txt冲突了但解决了冲突之后拥有全新的代码,主分支trunk_V01新创建的文件trunk_V01_01.txt依然存在,新分支trunk_V02新创建的文件trunk_V02_01.txt也存在。(即:最终效果正确,就是我们想要的)
结论总结:
结论总结:
结论1
:“合并一个版本范围”方式是默认合并方式。
结论2
:“合并一个版本范围”方式相当于往主分支最新版本上面合代码,因为它不像第二种方式可以指定主分支版本号。
结论3
:“合并两个不同树“方式相当于更细化的合并操作,可以分别指派主分支和新分支的版本号进行两两合并,效果更自由。
结论4
:“合并一个版本范围”方式和“合并两个不同树且设置主分支版本”方式效果是一样的。
结论5
:“合并两个不同树且不设置主分支版本”方式,那么最终的效果就是:如果选择的主干版本与分支版本有不同的地方,合并时主干部分将被放弃。(这就是为什么演练场景2时发现主分支丢文件了,被删除了。)
3.4.13 删除分支
假设我想删除copyCRM项目分支代码
选中文件夹,鼠标右键打开“版本库浏览器”
在“版本库浏览器”页面中选中文件夹,点击右键直接删除
3.4.14 Import(导入)
选择要提交到服务器的目录,右键选择TortoiseSVN----Import,系统弹出导入提示框,在URL of repository输入框中输入服务器仓库地址,在Import Message输入框中输入导入日志信息,点击确定,则文件导入到服务器仓库中。
3.4.15 Add(加入)
如果有多个文件及文件夹要提交到服务器,我们可以先把这些要提交的文件加入到提交列表中,要执行提交操作,一次性把所有文件提交,如图,可以选择要提交的文件,然后点击执行提交(SVN Commit),即可把所有文件一次性提交到服务器上。
3.4.16 Revision Graph(版本分支图)
查看文件的分支,版本结构,可以点击Revision Graph,系统以图形化形式显示版本分支。
3.4.17 Branch/Tag(分支/标记)
当需要创建分支,点击Branch/Tag,在弹出的提示框中,输入分支文件名,输入日志信息,点击确定,分支创建成功,然后可查看文件的版本分支情况。
3.5 权限配置
3.5.1 单一版本库权限配置
①要设置授权访问就需要创建用户,并为用户设定权限
②打开授权访问的配置
[1]打开 D:\DevRepository\Subversion\ERP\conf\svnserve.conf
[2]将第 19 行 anon-access = write 注释掉:# anon-access = write 或者放开写成anon-access = none
表明该版本库不接受匿名访问
[3]将第 20 行# auth-access = write 注释打开:auth-access = write
表明该版本库使用授权访问
[4]将第 27 行注释打开:password-db = passwd
表明使用同目录下的 passwd 文件保存用户信息
[5]将第 36 行注释打开:authz-db = authz
表明使用同目录下的 authz 文件保存权限信息
[6]打开 passwd 文件创建用户
userWrite01 = 123456
userWrite02 = 123456
userRead = 123456
userOther = 123456
[7]打开 authz 文件:#后面注释的是例子
<1>创建用户组
[groups]
# harry_and_sally = harry,sally
# harry_sally_and_joe = harry,sally,&joe
canWrite = userWrite01,userWrite02
<2>指定路径,给用户和用户组授权
# [/foo/bar]
# harry = rw
# &joe = r
# * =屏蔽那些未设定的用户,让它们没有任何权限
[/]
@canWrite = rw
userRead = r
* =
<3>权限的继承性:父目录设置的权限,对子目录同样有效——除非子目录进行
了更为具体的设定
[/subDir]
userOther = rw
* =
这个例子表示当前版本库下的 subDir 目录只有 userOther 有读写权限,其它用户 无任何权限 。
3.5.2 多版本库共享配置
在版本库根目录 D:\DevRepository\Subversion 下创建 commConf 目录
将未修改的 authz 和 passwd 文件拷贝到 commConf 目录下
修改需要设置权限的版本库的 svnserve.conf 文件
①password-db = …/…/commConf/passwd
②authz-db = …/…/commConf/authz
在 password 中创建用户
[users]
# harry = harryssecret
# sally = sallyssecret
userERP = 123456
userOA = 123456
userCRM = 123456
在 authz 中针对不同版本库为不同用户授予权限
# [repository:/baz/fuz]
# @harry_and_sally = rw
# * = r
[ERP:/]
userERP = rw
* =
[OA:/]
userOA = rw
* =
[CRM:/]
userCRM = rw
* =
3.6 合并深度介绍
Working copy(工作副本)
:即你当前的工作目录,一般默认为这个选项;Recursively(递归)
:即你选择的目录的版本库,包括了其下面的子文件,子文件夹,包括子文件夹里面的内容;Direct children(直接子节点)
:即你选择的目录下面的文件,文件夹,但是不包括文件夹里面的子文件,子文件夹;Files in a folder(仅文件子节点)
:即你选择的目录下面的文件,但不包括文件夹,当然不包括的文件夹下面的所有内容也都不纳入合并范围;Only a folder(仅此项)
:没有任何合并内容。
总结:默认每次提交就选“工作副本”选项就可以的,其他的我没验证过效果。
3.7 分支介绍
大致分类为3种:trunk、branches、tags
trunk
:主干,我们一般把项目提交到此文件夹里面,在trunk中开发。branches
:分支,我们一般把那些需要打分支,但是有可能会修改的项目代码,打分支到此目录。tags
:分支,我们一般把那些阶段性(如迭代各期)的项目代码,打分支到此目录。
本人其他相关文章链接
1.Windows下版本控制器(SVN) - 1、开发中的实际问题+2、版本控制简介
2.Windows下版本控制器(SVN)-验证是否安装成功+配置版本库+启动服务器端程序
3.Windows下版本控制器(SVN)-TortoiseSVN使用+权限配置+合并深度介绍+分支介绍
4.Windows下版本控制器(SVN)- 配置版本库
5.Windows下版本控制器(SVN)-启动服务器端程序
6.TortoiseSVN使用-授权访问
7.TortoiseSVN使用-TortoiseSVN更换或重置登录用户
8.TortoiseSVN使用-合并分支代码
9.TortoiseSVN使用-权限配置
10.TortoiseSVN使用-合并深度介绍