87682715 2019-06-26
版本控制工具就是记录项目代码文件夹和文件的每一个改动,并为每次改动编上序号(也叫版本号),用于存储,跟踪文件夹和文件的修改历史的工具。通过版本控制,可以恢复文件的旧版本并查看历史-谁在什么时间如何进行的修改。
目前主流的版本控制工具:Git和VSN。本学习笔记是SVN学习笔记,因为我在的公司就用这个。
SVN是Subversion的简称,是一个开放源代码的版本控制系统,是用于多个人共同开发同一个项目,共用资源的目的。
版本库:Subversion使用集中的数据库,它包含了所有的版本控制文件及其完整历史。这个数据库就是版本库。版本库通常位于运行 Subversion 服务器的文件服务器上,向 Subversion 客户端提供需要的数据。
工作副本:这是实际工作的地方。每一个开发者在自己的电脑上都有属于自己的工作副本。可以通过Subversion客户端将最新的版本从版本库上取下来,在本地的副本上工作而不影响其他人,如果对更改满意就可以将其提交到版本库中。
1.搭建svn服务器:安装服务器端软件、创建项目仓库、启动仓库服务
2.在个人开发电脑,安装svn客户端软件
3.创建项目目录,通过checkout检出操作,与svn版本库建立连接,下载所有的代码
4.日常开发,通过commit提交操作,将本地的修改,提交到svn版本库
5.其他人提交过代码,可以通过update更新操作,将版本库中最新的代码(被修改部分)更新到本地。
注意:svn服务器的地址 svn://IP , 由服务器搭建服务器的ip地址和相关目录组成,由搭建者管理
1.多人协作开发(解决代码合并覆盖问题)
2.版本退回(将一个或多个文件恢复到旧版本)
3.查看修改历史(日志),方便把控开发进度
创建svn版本库命令:svnadmin create "仓库地址"
在Windows中打开cmd输入命令执行即可。
执行命令成功后,仓库地址中创建好相应的仓库文件夹。
Linux服务器上通过命令行就能创建,而Windows中有时候执行命令会出现错误。解决方式有:
1.将svn服务器端安装目录设置到环境变量中2.将svnadmin.exe拖到命令行窗口或者书写完整路径,加上 create “仓库地址” 执行
使用SVN版本库前要启动SVN仓库服务,命令是:svnserve -d -r "仓库地址"
执行成功后,光标换行并持续闪烁,这叫“挂起”状态,表示Svn仓库服务已启动,不能关掉执行命令的窗口,想要别的操作新窗口操作。
SVN使用的协议是SVN协议,协议地址格式:svn://localhost 指向 仓库目录
SVN默认使用匿名用户,只有读(read)的权利,只能执行检出和更新操作。
需要手动设置匿名用户写入权限,才能执行提交操作。
配置文件是SVN仓库目录中conf目录下的svnserve.conf文件,在第19-20行有注释文件,可以取消注释,最好自己写一个,注意这里不能再语句后写注释:anon-access=write
我的开发环境是为Windows,相关操作如下:1.在自己写代码的文件中创建一个工作副本(workspace),创建自定义文件名,进入目录,鼠标右键->svn checkout,打开checkout界面,填写SVN仓库地址和工作副本地址提交即可。
2.检出成果后,工作副本中就会出现.svn隐藏目录,这是SVN对当前目录下的文件进行版本控制的,相当于管理员,不能动里面的内容(禁止修改,删除)。
3.在工作副本中,开发相应的程序文件(test.html)选中文件,鼠标右键->TortoiseSVN ->Add 操作,表示将文件添加到svn版本控制范围,将文件标记为已添加状态,再次选中文件,右键-> SVN Commit 打开提交界面,填写版本说明(日志),选中要提交的文件,ok即可。
4.成功后版本号自动加1,第一次提交的就是第一个版本。
1.Checkout检出指令:
从版本库检出仓库项目文件,一般只在第一次从版本库下载代码时执行,一般在一个空目录中执行。
2.Commit提交指令
将本地的更改提交到版本库。根据实际情况进行提交,一般在下班前至少提交一次。
3.Update更新指令:
从版本库更新最新的文件,一般在上班后先执行一次,或者每次开发一个新的功能前执行一次。
4.Add添加指令:
将一个新增的文件标记为已添加,会出现在提交列表并默认选中。
可以对文件和目录单个进行添加和提交操作,也可以进行批量提交。
提交方式:在最顶层目录 空白处右键->SVN Commit 打开提交界面,手动选中要提交的文件,点击ok进行提交,提交成功版本号+1注:提交列表中,只会出现新增的文件目录或者修改过的文件目录。
常规图标:当本地文件与服务器端文件完全同步时,系统显示常规图标冲突图标:如果两个程序员同时修改同一个文件,系统在上传时就会显示冲突图标
已删除图标:服务器文件已删除,本地就会显示删除图标
增加图标:文件还未上传但是已经添加到上传的队列中
无版本控制图标:当前文件是新建的,还未上传
修改图标:如果本地文件有修改但未上传就显示修改图标
只读图标:服务器端文件如果设置为只读,客户端就显示只读图标
锁定图标:如果服务器端文件已锁定,本地就显示锁定图标
忽略图标:有的电脑图标可能不显示,如果某些文件与项目无关,可以添加到忽略列表
查看日志(版本说明):空白处右键-> TortoiseSVN ->show log 查看日志
忽略文件:在开发过程中,项目文件夹(工作副本)中,可能会出现一些和项目代码没有直接关系的文件,没必要添加到svn版本库中去。可以对这些文件设置为忽略文件。
设置方式:选中要忽略的文件 -> 右键 -> TortoiseSVN -> add to ignore list 添加到忽略列表,其中四个选项:文件名.后缀 忽略当前目录中的指定文件
*.后缀 忽略当前目录中的指定后缀的所有文件
文件名.后缀(recursively) 忽略当前目录以及子目录中的指定文件
*.后缀(recursively) 忽略当前目录以及子目录中的指定后缀的所有文件
对某个文件设置为忽略文件后,其不会出现在提交列表中。设置为忽略文件之后,一般可以通过反向操作,取消忽略的设置
选中要忽略的文件 -> 右键 -> TortoiseSVN -> remove from ignore list 从忽略列表移除
回退版本:空白处右键 -> TortoiseSVN -> update to revision 更新至版本可以直接输入版本号,或者点击show log去选中一个指定版本。
关于版本退回特别说明:
注意:版本回退功能,只是将本地工作副本中的内容,更新到了一个指定版本,svn版本库中还是有最新的代码,除非提交版本退回文件。版本回退功能,只用于获取某一个历史版本的代码,并且备份用于其他用途。
不要在版本回退后的历史版本中直接进行开发。可以先通过svn update指令更新到最新的代码,再进行开发。
多个人同时对同一个文件做修改,并且修改在同一行。先后提交到版本库时,第一个人提交成功,版本号+1,其他人提交时,svn会提示必须先更新到最新版本再提交。如果其他人在本地工作副本进行更新,svn会提示发生了冲突。
冲突的模拟:在本地检出两个工作副本,模拟两个人同时开发。两个工作副本先都更新最新的版本,然后先后更改代码并提交。
两个表现:一是发生冲突的文件中,包含了多个版本的代码;二是目录中发生冲突的文件多出来几个不同后缀版本的文件
发生了版本冲突后没法提交文件,必须先解决冲突然后再提交到版本库。
处理版本冲突问题一般直接能够区分头儿和小弟的。因为难且重要。
解决版本冲突的方式:
1.继续提交本地的修改,使用svn resolve操作,修改发生冲突的文件中的代码,保留指定的代码(删除冲突标记行)。选中发生冲突的文件,右键-> TortoiseSVN -> resolve 解决,打开解决冲突界面,选中要解决冲突的文件,点击ok;将指定的文件设置为已解决状态,因冲突产生的多余的文件都被自动删除;继续执行svn commit提交操作即可。2.放弃本地的修改,使用svn revert操作 将指定文件还原成最新版本,选中发生冲突的文件,右键->TortoiseSVN -> revert 还原 打开还原界面,选中要还原的文件,点击ok, 放弃本地的修改,并将指定文件变为最新版本,适合用于少量代码修改;
版本冲突只是发生在本地的工作副本的,版本库中并没有版本冲突,因为有冲突文件无法提交。
在开发过程中,通常可能同时开发多个项目,都是用svn来进行管理。每个项目对应着对应的版本库。
使用svn客户端进行检出操作时,需要使用到svn版本库的地址svn://ip/目录,这个地址在启动svn仓库服务后,指向了启动服务时指定的目录。一个地址只能指向一个目录。
配置方式:
在启动svn仓库服务时,仓库地址指向多个版本库的共同的上级目录(父级目录)。也就创建仓库时将svn://ip地址指向共同目录
#创建项目1仓库 svnadmin create "共同目录/项目1" #启动SVNserve大目录 svnserve -d -r "共同目录" #重新开一个新命令窗口,不需要启动SVNserve目录 svnadmin create "共同目录/项目2"
命令说明:
1.对于已经在使用的项目1仓库,需要将仓库地址重新定位到svn://ip/项目1定位方式 空白处右键->TortoiseSVN -> relocate 重新定位点击ok确认进行重新定位,之后可以正常使用。2.对于准备使用的项目2仓库,检出时直接使用svn://ip/项目2地址。
注意:检出操作必须在一个空文件夹中进行。
svn提供了一个可选的权限控制功能,可以限制用户的访问权限。权限控制分为两部分:认证(Authentication)和授权(Authorization)
认证文件:鉴别用户身份,可以设置用户名和密码(passwd)授权文件:判断用户是否具备某种操作(读写)的权限(authz)
注意:版本库的配置文件,只对当前版本库生效,每个版本库都有自己的配置文件。
权限控制设置步骤:去掉注释,顶格,等于开启相应权限,不能有任何无关字符
1.修改svnserve.conf,关闭匿名用户的访问权限:anon-access=none
2.修改svnserve.conf,开启认证文件,开启授权文件:password-db=passwd(开启认证),authz-db=authz(开启授权)。
3.修改passwd文件,设置用户名和密码
#格式:用户名=密码 ak=ak1234 aklman=aklman1234 ahmatbek=ahmatbek1234
4.修改authz文件,设置哪些用户具有哪些权限:
第一种方式:给指定用户直接授权;
#1.指定仓库名称,如果使用单仓库,仓库所在目录设置为[/];如果使用了多仓库,仓库所在目录设置为[项目1:/] [项目1:/] #2.格式:用户名=权限 ak=rw aklman=r ahmatbek=rw
第二种方式:对用户进行分组,对分组统一授权
#1.格式:分组名称=用户名1,用户名2 T5=aklman,ahmatbek T4=ak,xiaoming #2.指定仓库名称,如果使用单仓库,仓库所在目录设置为[项目/];如果使用了多仓库,仓库所在目录设置为[项目1:/] [项目1:/] #3.给分组授权 @T5=rw @T4=r
5.完成以上设置之后,重新在工作副本中,进行svn的相关操作,会提示需要先认证:
填写正确的用户名和密码进行认证,可以选择记住认证信息,以后不需要进行重复认证,否则每一次都需要进行认证。
保存认证信息后,如果因为一些原因比如修改了密码,需要重新进行认证,需要先清除保存的认证信息才能打开认证界面。
清楚方式:空白处右键 -> TortoiseSVN -> settings设置 打开设置界面,在左侧找到Saved Data点击,在右方找到Authentication data ,点击后面的清除按钮进行清除。
使用svn仓库,需要先启动仓库服务,必须保持命令行窗口的挂起状态,如果关闭窗口,则仓库服务会停止。这种方式不太友好,更好的方式,将svn仓库服务设置为开机自启动的服务。
创建自启动服务,通过以下命令实现:
#windows中,1.必须使用管理员身份打开命令行窗口;2.箭头位置必须放置一个空格,否则创建会失败 sc create svn binPath= "F:\Subversion\svnserve.exe -r F:\svncangku --service" start= auto #Linux中,只启动一次永久有效,除非关掉 sudo svnserve -d -r /home/data/svn/
--service 表示其为服务项目,start= auto表示电脑开机就自动启动该服务
创建成功之后,下次重启电脑,svn仓库服务会自动启动(偶尔可能会自动启动失败,需要手动启动),可以在计算机的服务界面查看相关服务(右键计算机-> 管理->服务)。
1.net start svn 启动svn服务
2.net stop svn 停止svn服务
3.sc delete svn 删除svn服务(记住:svn如果需要删除必须先停止)
可以通过以上命令在cmd窗口中执行(这些命令也必须以管理员身份打开cmd窗口)可以将在cmd命令行执行的命令,保存到一个.bat后缀的文件中,这就是批处理文件;需要执行对应命令时,直接运行对应的批处理文件。如:开启
net start svn
需要开启svn服务时,直接以管理员身份运行svnstart.bat即可。
当项目开发到一定阶段,部署到另外一台服务器的apache下运行后。如果继续对项目进行开发,将新的代码提交到版本库,另外服务器的apache下的代码,需要执行svn更新操作,才能得到最新的代码。为此Svn提供了一个钩子程序同步代码的功能,可以通过一些设置,每当svn版本库中有更新,则在指定服务器apache项目目录中自动执行svn update命令。
使用同步钩子的步骤:
1.在服务器端apache下创建一个文件夹用于接收同步数据2.在本地和服务器端同时检出或者更新svn仓库最新数据
3.打开服务器的项目1仓库,找到hooks钩子目录,新建post-commit.bat批处理文件,然后输出如下代码
#SET SVN=”F:\Subversion\svn.exe” 设置svn指令目录 #SET DIR=”F:\workspace\online” 设置需要同步的目录 #SVN update %DIR% --username username --password password 使用update指令更新数据到同步目录 SET SVN="F:\Subversion\svn.exe" SET DIR="F:\workspace\online" SVN update %DIR% --username aklman --password aklman1234