05Linux 第4天 SVN(重点)

1、创建一个SVN项目仓库)

项目仓库是服务器端存储项目数据的地方(类似于apache的虚拟主机)。

 

服务端通常使用命令行模式操作。

创建svn仓库命令:svnadmin create 仓库路径地址

示例:svnadmin create “G:\svn\svn_server_cangku”

这里先在G盘新建svn\svn_server_cangku目录,然后打开命令行窗口执行命令创建blog仓库。

05Linux 第4天 SVN(重点)

注意事项:

①仓库地址建议加上双引号,避免路径中有空格产生错误。

②如果直接使用svnadmin 命令报错,提示“不是一个内部或外部命令”,有两种解决方式:

第一是直接执行svnadmin.exe可执行文件,第二配置环境变量

③svnadmin 命令本身对应一个可执行文件svnadmin.exe,可以拖拽到命令行直接执行。

svnadmin.exe可执行文件在svn服务端软件安装目录中。其位置及执行方式参考下图:

05Linux 第4天 SVN(重点)

  1. 启动仓库服务

要使用svn仓库,必须先启动svn仓库服务。比如使用apache也需要先启动apache服务。

如果在以后的使用中,出现以下错误,就是由于svn服务没有开启(在linux下可能还由于防火墙没允许)。

05Linux 第4天 SVN(重点)

在命令行模式下执行以下命令启动仓库服务:

svnserve  -d[启动模式]  -r[仓库地址]  仓库地址

示例:svnserve -d -r “G:\svn\svn_server_cangku\blog”

执行完成之后:会发现光标换行,持续闪烁,这代表执行成功,此时SVN服务端已经启动:

05Linux 第4天 SVN(重点)

注意:启动仓库服务之后,这个命令行窗口需要保持打开(挂起)状态。

如果关闭窗口,仓库服务也会关闭。如果要执行其他命令,再重新打开一个新的命令行窗口。

在启动仓库服务之后,会有一个svn协议的地址svn://localhost或者svn://IP地址,指向我们启动服务时使用的仓库地址。示例:

svn://localhost    ->   G:\svn\svn_server_cangku\blog 。

 

这类似于使用apache时,http://localhost 指向一个目录。

 

后续使用svn仓库时,我们需要使用svn://localhost这个svn协议的地址代表仓库地址。

  • 客户端使用svn(重点)

1、从svn仓库检出代码

在工作目录(这里为G:\svn\svn_client_cangku)里,在空白处右键菜单->SVN checkout打开检出界面

05Linux 第4天 SVN(重点)

点击ok检出

第一次检出成功,会在工作目录中出现一个.svn的隐藏目录

05Linux 第4天 SVN(重点)

注:这个目录充当svn软件管理当前目录下的文件和文件夹的一个“管理员”角色

不要轻易删除或者修改里面的东西,如果不想看到(有洁癖)可以隐藏掉

05Linux 第4天 SVN(重点)

2、给svn仓库提交第一个程序文件

①首先在工作目录新建程序文件

例如:创建一个项目文件,index.php

05Linux 第4天 SVN(重点)

②选中文件,右键TortoiseSVN -> add(加入)操作,点击把要提交的文件,添加到svn的提交列表

05Linux 第4天 SVN(重点)

③再次选中文件,右键点击SVN commit(提交)操作

④在打开的提交页面中填写相关信息

05Linux 第4天 SVN(重点)

④点击ok完成提交

提交之后,如果之前没有做任何配置,则会显示提交失败:

05Linux 第4天 SVN(重点)

3、设置仓库权限

在第一次向仓库提交操作时,会提示没有操作权限,由于默认匿名用户是不可写,但是可以读

05Linux 第4天 SVN(重点)

说明:仓库创建后,默认只有读权限,没有写权限(没有提交的权限)

服务端仓库目录中conf目录下:svnserve.conf主配置文件

05Linux 第4天 SVN(重点)

打开这个文件:

给匿名用户设置写权限

05Linux 第4天 SVN(重点)

重新完成提交操作

05Linux 第4天 SVN(重点)

提交成功之后版本号会在之前的版本号上加1。

05Linux 第4天 SVN(重点)

  1. 常用指令

Checkout检出指令:第一次和svn仓库取得联系时,下载仓库中所有的代码到本地,一般只需要执行一次。

Commit提交指令:每次修改了文件后,都要执行一次提交操作。按照需要每隔一段时间执行一次。

Update更新指令:把仓库的最新部分代码更新到本地。每次提交之前或者每次开始工作之前需要执行。

Add添加指令:把要提交的文件添加到提交列表(针对新增的文件)。

 

更多的专业术语,可以翻阅pdf帮助文档:

05Linux 第4天 SVN(重点)

4、文件和目录的提交

通常要提交的是多个文件和目录的整体,但是按照提交第一个文件的方式,一个一个提交操作麻烦

 

如何解决?

提交方式:

①在工作目录空白处右键->svn commit 打开提交界面,手动选中要提交的文件,进行提交

05Linux 第4天 SVN(重点)

点击ok进行提交:

05Linux 第4天 SVN(重点)

②对于新增的目录下的新增的文件,不能直接执行add操作和commit操作,右键菜单没有相关选项,解决办法:到上一级目录:通过批量提交的方式,在空白处右键svn commit进行提交

05Linux 第4天 SVN(重点)

点击ok进行提交

05Linux 第4天 SVN(重点)

  1. svn图标集
  2. 05Linux 第4天 SVN(重点)

1)常规图标:当本地文件与服务器端文件完全同步时,系统显示常规图标

2)冲突图标:如果两个程序员同时修改同一个文件,系统在上传时就会显示冲突图标

3)已删除图标:服务器文件已删除,本地就会显示删除图标

4)增加图标:文件还未上传但是已经添加到上传的队列中

5)无版本控制图标:当前文件是新建的,还未上传

6)修改图标:如果本地文件有修改但未上传就显示修改图标

7)只读图标:服务器端文件如果设置为只读,客户端就显示只读图标

8)锁定图标:如果服务器端文件已锁定,本地就显示锁定图标

9)忽略图标:有的电脑图标可能不显示,如果某些文件与项目无关,可以添加到忽略列表

 

常用的:

常规图标、冲突图标、增加图标、修改图标

说明:这些图标只是一个辅助功能,用作参考。

 

  • SVN使用细节

由于当前在学习环境下,服务器端与客户端均为当前电脑,需要理清目录关系。本地学习环境下,目前应该是存在四个大目录:

05Linux 第4天 SVN(重点)

1、SVN中的存储机制(了解)

Svn中有一种特有的存储机制,叫差异存储,每个版本只存储与上一个版本有差异的地方。

表现形式:

05Linux 第4天 SVN(重点)

通过在服务端仓库中搜索“.php”的内容,并没有发现包含.php的任何文件。

原理:

05Linux 第4天 SVN(重点)

比如记录日志信息的目录中:

05Linux 第4天 SVN(重点)

  1. 忽略文件

有的时候,我们在工作目录中存放了一些与项目代码没有直接关系的参考文件,这些文件不需要提交到svn仓库进行管理,所以可以设置为忽略文件,避免它们出现在提交列表中,干扰我们的操作。

操作方式:右键->TortoiseSVN -> add to ignore list 添加到忽略列表, 有四个选项:

05Linux 第4天 SVN(重点)

设计.psd   选中这一项忽略当前文件

*.psd   选中这一项忽略当前目录下后缀为.psd的所有文件

设计.psd(recursively)  recursively是递归的意思,忽略掉所有目录中的该名称的文件

*.psd(recursively) 忽略所有目录中的.psd后缀的文件

05Linux 第4天 SVN(重点)

反向操作(取消忽略):右键->TortoiseSVN -> remove from ignore list(取消忽略列表) 从忽略列表移除

3、版本回退(重点、坑)

查看项目代码的提交历史日志信息:右键->TortoiseSVN -> show log(查看日志)

05Linux 第4天 SVN(重点)

版本回退的操作方式:

右键 -> TortoiseSVN -> update to revision(更新至版本)

例如需要恢复到第1个版本,则可以操作如下:

05Linux 第4天 SVN(重点)

恢复到版本2的效果:

05Linux 第4天 SVN(重点)

可以手动设置版本号:选中Revision,在输入框填写版本号

也可以点击Show log 选中一个版本,自动填入版本号

设置好要回退的版本号,点击ok进行版本回退。

回退到历史版本后,右键 -> SVN Update 可以回到最新版本

注意:版本回退功能仅用于查看历史版本代码或者获取历史版本代码,不能回退到历史版本后直接在历史版本基础上继续开发。

版本回退之后,如果在历史版本中修改文件代码,然后提交,会提示错误,文件过期,需要先更新到最新版本再提交。更新时又可能会引起冲突。

比如:

在版本2基础上,先修改一下index.php,写一些代码并提交

05Linux 第4天 SVN(重点)

提交之后显示必须先更新副本:

05Linux 第4天 SVN(重点)

点击ok提示我们要更新代码

05Linux 第4天 SVN(重点)

更新之后,会有冲突的提示:

05Linux 第4天 SVN(重点)

产生冲突之后会在对应的目录下生成三个临时文件:

05Linux 第4天 SVN(重点)

关于冲突的几句话:

①冲突是发生在客户端的,服务端一切正常(不用服务端代码丢失问题)

②遇到冲突一定要解决冲突,如果不解决冲突则无法提交代码

③保留自己需要提交的代码,标记冲突为解决,提交即可

 

总结:在版本回退之后,不要在历史版本中修改代码只是用于查看,并不能用于直接修改】。要先更新到最新版本,然后写代码后再提交。

 

  1. 版本冲突(重点)

版本冲突:如果多个人对同一个文件做了修改,然后都做提交,后提交的人会发生代码覆盖的问题,这在svn中就叫“版本冲突”。

发生版本冲突,本质还是因为后提交的人,其提交代码时代码的版本不是最新的,也就是其在一个历史版本提交了代码,引起了版本冲突。

这个冲突不是直接发生在svn仓库,是发生在提交者本地的代码。svn提示后提交的人需要先更新svn仓库中的最新版本代码,然后其本地的代码就会有冲突提示。

冲突的表现:

①文件上出现冲突图标,文件下方出现一些新的文件

05Linux 第4天 SVN(重点)

②文件中的代码有变化,里面有多个版本的代码

代码中冲突的部分会出现很多标记,每个标记之间的代码分别是不同版本的代码。

05Linux 第4天 SVN(重点)

说明:这里变化的这部分代码是发生冲突的代码,如果文件中有其他不受冲突影响的代码,会正常的显示,我们要处理的只是其中发生冲突的部分。

强调:发生冲突之后,一定要解决冲突,再提交。

处理冲突的方式:

①根据需要,处理文件(有冲突标记的文件)中的代码,保留最终需要留下并提交的代码

05Linux 第4天 SVN(重点)

保留代码如下:

05Linux 第4天 SVN(重点)

②选中冲突的文件,右键->TortoiseSVN -> resolve(解决)解决冲突,这个操作是标记文件,表示这个冲突已经被处理,代码可以直接提交了。操作之后会自动把冲突产生的多余文件删除。

05Linux 第4天 SVN(重点)

05Linux 第4天 SVN(重点)

注:冲突是发生在客户端本地的,版本回退也是在本地回退,svn仓库中的代码是不受影响的,各个版本在svn仓库中都还是存在的

冲突处理完成,进行提交操作。

05Linux 第4天 SVN(重点)

05Linux 第4天 SVN(重点)

提交成功。

5、配置多仓库

在工作中,通常我们要同时开发多个项目,比如一个blog博客,一个shop商城,都需要使用svn来管理,这里需要新建一个仓库shop。(类似于apache的多站点)

创建新的仓库:

#svnadmin create “仓库目录”

例如:

05Linux 第4天 SVN(重点)

检出初始的代码库:

05Linux 第4天 SVN(重点)

检出发现还是blog的项目代码。

在工作目录shop中直接进行检出checkout操作,发现得到的是blog仓库的代码,并不是shop仓库的代码

即使重新开启一次仓库服务,想把svn://localhost 绑定到shop仓库,实际上没有生效。

解决办法:

配置多仓库

重新开启仓库服务,把仓库地址改为多个仓库的共同上级目录,会把svn://localhost指向该上级目录,

05Linux 第4天 SVN(重点)

在需要使用仓库时比如检出操作时,在svn://localhost后面加上/仓库名称:

比如svn://localhost/shop

删除原先的svn_client_cangku2目录,重新创建目录,重新的去检出

05Linux 第4天 SVN(重点)

结果:正确检出了shop仓库。

在原来的blog工作目录,直接使用update等操作时会提示错误:

05Linux 第4天 SVN(重点)

 

原因是blog仓库的检出地址还是原来的svn://localhost,需要改变为svn://localhost/blog

操作方式:右键->TortoiseSVN -> relocate(重新定位)重新定位仓库地址

05Linux 第4天 SVN(重点)

点击之后修改路径为svn://localhost/blog

点击迁移:

05Linux 第4天 SVN(重点)

05Linux 第4天 SVN(重点)

重新执行update等操作就可以成功了

 

上述多仓库的配置思想和apache的二级目录是一样的

6、权限控制(重点)

我们之前通过给匿名用户设置写权限来使用svn,这种方式在实际工作中是不安全的。

svn提供了一个权限控制功能,可以限制用户对仓库的读写权限。

权限控制分为认证(Authentication,认证是认证用户身份的合法性)和授权(Authorization,对用户的权限的判定)

认证文件(用户身份【帐号】):鉴别用户身份,可以设置用户名和密码(passwd)

授权文件:判断用户是否具备某种操作的权限(authz)

两个文件均存在于服务端仓库的conf目录下

05Linux 第4天 SVN(重点)

设置权限控制的步骤:

①打开该仓库主配置文件svnserve.conf,关闭匿名用户的访问权限

开启用户名和密码的存储文件

开启权限列表文件

05Linux 第4天 SVN(重点)

②打开passwd文件,设置用户名和密码

05Linux 第4天 SVN(重点)

打开authz文件,设置哪些用户具有哪些权限

③直接给指定的用户设置权限

05Linux 第4天 SVN(重点)

重新在工作目录中进行操作比如更新操作:

会弹出以下权限认证界面

05Linux 第4天 SVN(重点)

输入用户名和密码,可以选择保存认证信息(即记住用户名和密码),如果认证成功,以后就不用再次认证。否则,每一次操作都需要进行认证。

②对用户进行分组,然后对分组设置权限

05Linux 第4天 SVN(重点)

设置完成之后,配置都会立即生效(不需要重启仓库服务)

  1. 清除保存的认证信息

保存认证信息后,不会再次弹出认证界面,如果需要更改认证信息(用户名和密码),则需要先清除svn保存的认证信息

在svn的设置页面 (右键->TortoiseSVN->settings【设置】)

05Linux 第4天 SVN(重点)

点击clear(清除)选择指定的用户信息进行清除或者clearAll (清除全部)可以清除所有

然后重新执行update等操作就可以

唤起用户名密码输入界面

清除之后再次操作则需要使用帐号和密码进行授权:

05Linux 第4天 SVN(重点)

通过授权则更新完成:

05Linux 第4天 SVN(重点)

三步骤:

禁用匿名用户并且开启认证和授权文件

编写认证文件(用户名和密码)

编写授权文件(指定用户的权限)

、SVN服务自启动与批处理指令

1、为什么需要自启动服务

开启仓库服务,我们是要保持命令行黑窗口的挂起状态,这种方式不友好,如果不小心关闭了这个窗口,整个svn服务就关闭了。更友好的方式,是把svn仓库服务设置成自启动的服务。

2、创建自启动服务

05Linux 第4天 SVN(重点)

示例:sc create svn binPath= "H:\SVN\Subversion\svnserve.exe -r H:\SVN\Workspace --service" start= auto

 

--service 说明其为服务项目

start= auto说明电脑开机就自动启动该服务

① 必须使用管理员身份打开命令行窗口,否则会提示

05Linux 第4天 SVN(重点)

② 图示指定位置必须放置一个空格,否则创建会失败。

执行:05Linux 第4天 SVN(重点)

第一次需要手动启动,以后重启电脑之后可以自动启动

3、批处理指令

服务的启动停止可以通过执行命令来实现:

net start svn69  启动svn服务

net stop svn69  停止svn服务

sc delete svn69  删除svn服务(记住:svn如果需要删除必须先停止)

这些命令都需要在管理员权限下来执行。

05Linux 第4天 SVN(重点)

Svn为上述创建服务时候使用的名称。

 

为了方便(了解),可以把这些指令分别保存到一个文件当中,比如start.bat  stop.bat、restart.bat

然后以管理员的身份运行这些文件,可以达到和执行命令相同的效果

05Linux 第4天 SVN(重点)

钩子程序同步代码

  1. 钩子程序原理

每次向svn仓库提交代码之后,需要在apache下来更新一次最新的代码,这样比较麻烦,有一种自动同步代码的解决方案---使用钩子程序

原理:每次想svn仓库提交代码,这个钩子程序会检测到这次改动,自动在apache下执行一次svn的update操作更新代码。

05Linux 第4天 SVN(重点)

钩子程序的作用:SVN服务器本身不能够给用户提供代码执行的操作,该操作需要是由apache/nginx等其他web服务器软件去处理,而仓库中代码,web服务器是不认识,因此需要通过一个程序去负责转化和推送,这个程序就是钩子程序,其操作就是钩子程序的作用。

2、使用同步钩子(post-commit)程序

① 在服务器端apache创建一个文件夹接收同步数据,比如创建G:\htdocs目录

05Linux 第4天 SVN(重点)

② 在本地和服务器端(刚才创建的apache站点目录)同时检出svn仓库最新数据【可以使用检出方式(建议),也可以直接复制粘贴】(保证本地仓库、线上仓库与apache目录中的代码版本得一致

05Linux 第4天 SVN(重点)

05Linux 第4天 SVN(重点)

③打开服务器的Blog仓库,找到hooks钩子目录,新建一个post-commit.bat批处理文件,然后输出如下代码(需要根据实际情况修改里面的内容)

SET SVN=”F:\Subversion\svn.exe”  设置svn指令目录

SET DIR=”F:\workspace\online”  设置需要同步的目录

SVN update %DIR%  [--username a --password b] 使用update指令更新数据到同步目录

比如:

05Linux 第4天 SVN(重点)

设置完成,可以测试一下:

将之前的代码修改为phpinfo

05Linux 第4天 SVN(重点)

修改完成之后的提交,发现apache站点下的文件修改时间已经发生变化:

05Linux 第4天 SVN(重点)

通过浏览器测试:

05Linux 第4天 SVN(重点)