SVN 使用简介及个人总结

  1. SVN
  2. 如何来进行多人协作开发?
  3. 在实际工作中,通常是一个小组或者一个团队一起开发同一个项目,不同的人开发不同的功能模块,有一个公共的地方存放项目代码。
  4. 如果多个人同时对同一个文件做了修改,比如按照分工,两个人分别做文章模块的增删改查功能,需要操作同一个文件article控制器,如果大家同时完成工作并提交代码,会出现一个代码覆盖的问题。
  5.  
  6. 解决办法:
  7. ①合理分配工作任务
  8. ②合理分配工作时间
  9. 以上两种思路都有一定的局限性。
  10. 今天要学习的svn就是用来解决多人协作开发的问题。
  11. 一、SVN概述
  12. 1、什么是SVN
  13. SVN是Subversion的简称,是一个开放源代码的版本控制系统,是用于多个人共同开发同一个项目,共用资源的目的。
  14.  
  15. 所谓的版本控制,就是记录项目代码文件夹和文件的每一次改动,并为每次改动编上序号,也叫做版本号,用于存储、追踪文件夹和文件的修改历史。
  16.  
  17. 通过版本控制软件,我们可以对项目代码的修改历史进行查看,或者直接把代码恢复到以前的一个版本代码。
  18.  
  19. 2、同类型产品
  20. vss版本控制软件:visual source safe,微软公司开发的基于Windows平台的版本控制软件,入门简单,微软不再对VSS提供技术支持。
  21. cvs版本控制软件:出现比较早的版本控制软件,由于稳定性不是很好,现在基本被替代。
  22. svn版本控制软件:简单、入门容易、国内使用量多,目前主流的版本控制软件。
  23. git版本控制软件:也是使用量比较多的一个版本控制软件
  24. 3、使用SVN的好处
  25. ①协作开发
  26. ②版本回退
  27. ③查看项目代码修改历史(领导可以掌控项目的开发进度)
  28. 4、SVN执行流程(理解)
  29. ①搭建svn服务器,安装svn服务器端软件
  30. ②在svn服务器创建项目文件夹(在svn中叫做仓库)
  31. ③在开发电脑上安装svn客户端软件
  32. ④和svn服务器建立联系(checkout检出操作)
  33. 检出操作完成了两件事:一和服务器建立联系 二从svn服务器的仓库下载代码
  34. ⑤开发经理写初始版本的核心代码
  35. ⑥通过提交操作(commit)把代码提交到svn仓库
  36. ⑦开发经理会把svn服务器仓库的地址给到程序员,这个地址是svn协议的地址
  37. svn://ip地址或者svn://localhost
  38. ⑧程序员在自己电脑安装svn客户端软件
  39. ⑨程序员通过svn的地址从svn仓库下载代码
  40. ⑩开发自己的功能模块的代码,需要把代码提交到svn仓库
  41. ⑪开发经理从svn仓库更新代码(update),查看代码。
  42. 以上流程涉及了三个svn操作:checkout检出,commit提交, update更新。
  43.  
  44. 二、SVN软件的下载和安装
  45. 1、服务端与客户端软件的下载
  46. 服务端软件(Subversion)
  47. 客户端软件(TortoiseSVN)
  48. ①服务端软件下载地址:
  49. https://www.collab.net/downloads/subversion
  50. 注:服务端软件下载需要先注册登录
  51.  
  52. 下载之后得到下列软件之一:
  53.  
  54.  
  55. ②客户端下载地址:
  56. https://tortoisesvn.net/downloads.html
  57.  
  58. 下载之后得到下列软件之一:
  59.  
  60. 2、安装服务端软件
  61. 安装软件,以64位软件为例:
  62. ①双击软件打开以下界面。 
    
  63. ②点击Next下一步,两次Next之后打开以下界面。
  64. 建议:路径中尽量避免出现空格和中文字符,在以后使用命令时有可能引出问题
  65. ③确认安装路径,点击Install安装,进入以下界面,等待进度完成。
  66. ④安装进度完成自动进入以下界面,点击Finish完成安装即可,界面关闭。
  67. 3、安装客户端软件(重要)
  68. 安装软件,以64位软件为例:
  69. ①双击软件打开以下界面。
  70. ②点击Next下一步,两次Next之后进入以下界面。
  71. ③确认安装路径,点击Next下一步,继续点击Install安装,进入以下界面,等待进度完成。
  72. ④安装进度完成自动进入以下界面,点击Finish完成安装即可,界面关闭。
  73. ⑤客户端软件安装完成,在桌面右键菜单可以看到 svn checkout选项和TortoiseSVN选项,如果没有出现,可能需要重启电脑。
  74. 4、中文语言包的安装下载
  75. 下载地址:https://tortoisesvn.net/downloads.html
  76. 在客户端软件下载页面的下方,有各种语言包的安装文件可供下载。
  77.  
  78. 我们选择下载简体中文语言包,下载对应的32位或64位安装软件。
  79. 下载之后得到下列软件之一:
  80. 双击软件,点击next下一步,就会自动安装完成。
  81. 安装完成之后,一般会自动应用中文,如果没有自动使用中文,需要打开设置页面进行设置:
  82. 桌面或空白处 右键菜单->TortoiseSVN->settings 
    
  83. 打开设置页面如下:
  84. 根据图示可修改软件使用的语言包。
  85. 注意:如果要卸载软件重新安装,需要通过软件管家或者控制面板的程序与功能,完整的卸载软件。直接删除安装目录的方式不可行。
  86. 三、服务端创建仓库与建立连接
  87. 1、创建一个SVN项目(仓库)
  88. 服务端通常使用命令行模式操作。
  89. 创建svn仓库命令:svnadmin create仓库地址
  90. 示例:svnadmin create“F:\svncangku\blog”
  91. 这里先在F盘新建svncangku目录,然后打开命令行窗口执行命令创建blog仓库。
  92.  
  93. 注意事项:
  94. ①仓库地址建议加上双引号,避免路径中有空格产生错误。
  95. ②如果直接使用svnadmin 命令报错,提示“不是一个内部或外部命令”,有两种解决方式:
  96. 第一是直接执行svnadmin.exe可执行文件,第二配置环境变量。 
    
  97. ③svnadmin 命令本身对应一个可执行文件svnadmin.exe,可以拖拽到命令行直接执行。
  98. svnadmin.exe可执行文件在svn服务端软件安装目录中。其位置及执行方式参考下图:
  99. 2、启动仓库服务
  100. 要使用svn仓库,必须先启动svn仓库服务。比如使用apache也需要先启动apache服务。
  101. 如果在以后的使用中,出现以下错误,就是由于svn服务没有开启。
  102. 在命令行模式下执行以下命令启动仓库服务:
  103. svnserve  -d[启动模式]  -r[仓库地址]  仓库地址
  104. 示例:svnserve -d -r“F:\svncangku\blog”
  105. 执行完成之后:会发现光标换行,持续闪烁,这代表执行成功
  106. 注意:启动仓库服务之后,这个命令行窗口需要保持打开(挂起)状态。
  107. 如果关闭窗口,仓库服务也会关闭。如果要执行其他命令,再重新打开一个新的命令行窗口。
  108. 在启动仓库服务之后,会有一个svn协议的地址svn://localhost或者svn://IP地址,指向我们启动服务时使用的仓库地址。示例:svn://localhost    ->   F:\svncangku\blog 。
  109. 这类似于使用apache时,http://localhost指向一个目录。
  110. 后续使用svn仓库时,我们需要使用svn://localhost这个svn协议的地址代表仓库地址。
  111. 四、客户端使用svn(重点)
  112. 1、从svn仓库检出代码
  113. 在工作目录(这里为F:\workspace\blog),在空白处右键菜单->SVN checkout打开检出界面
  114.  
  115. 点击ok检出
  116.  
  117. 第一次检出成功,会在工作目录中出现一个.svn的隐藏目录
  118. 注:这个目录充当svn软件管理当前目录下的文件和文件夹的一个“管理员”角色
  119. 不要轻易删除或者修改里面的东西
  120. 2、给svn仓库提交第一个程序文件
  121. ①首先在工作目录新建程序文件
  122. ②选中文件,右键TortoiseSVN -> add操作,点击把要提交的文件,添加到svn的提交列表
  123. ③再次选中文件,右键点击SVN commit操作
  124. ④在打开的提交页面中填写相关信息
  125. ④点击ok完成提交
  126. 3、设置仓库的写权限
  127. 在第一次向仓库提交操作时,会提示没有操作权限 
    
  128. 说明:仓库创建后,默认只有读权限,没有写权限(没有提交的权限)
  129. 在仓库目录中conf目录下:svnserve.conf主配置文件
  130. 打开这个文件:
  131. 给匿名用户设置写权限 
    
  132. 重新完成提交操作 
    
  133. 3、常用指令
  134. Checkout检出指令:第一次和svn仓库取得联系时,下载仓库中所有的代码到本地,一般只需要执行一次。
  135. Commit提交指令:每次修改了文件后,都要执行一次提交操作。按照需要每隔一段时间执行一次。
  136. Update更新指令:把仓库的最新部分代码更新到本地。每次提交之前或者每次开始工作之前需要执行。
  137. Add添加指令:把要提交的文件添加到提交列表(针对新增的文件)。
  138. 4、文件和目录的提交
  139. 通常要提交的是多个文件和目录的整体
  140. 提交方式:
  141. ①按照提交第一个文件的方式,一个一个提交(操作麻烦)
  142. ②在工作目录空白处右键->svn commit 打开提交页面,手动选中要提交的文件,进行提交
  143.  
  144.  
  145.  
  146.  
  147. 点击ok进行提交:
  148.  
  149. ③对于新增的目录下的新增的文件,不能直接执行add操作和commit操作,右键菜单没有相关选项,解决办法:到上一级目录:通过批量提交的方式,在空白处右键svn commit进行提交
  150. 点击ok进行提交
  151. 5、svn图标集
  152. 1)常规图标:当本地文件与服务器端文件完全同步时,系统显示常规图标
  153. 2)冲突图标:如果两个程序员同时修改同一个文件,系统在上传时就会显示冲突图标
  154. 3)已删除图标:服务器文件已删除,本地就会显示删除图标
  155. 4)增加图标:文件还未上传但是已经添加到上传的队列中
  156. 5)无版本控制图标:当前文件是新建的,还未上传
  157. 6)修改图标:如果本地文件有修改但未上传就显示修改图标
  158. 7)只读图标:服务器端文件如果设置为只读,客户端就显示只读图标
  159. 8)锁定图标:如果服务器端文件已锁定,本地就显示锁定图标
  160. 9)忽略图标:有的电脑图标可能不显示,如果某些文件与项目无关,可以添加到忽略列表
  161.  
  162. 常用的:
  163. 常规图标、冲突图标、增加图标、修改图标
  164. 说明:这些图标只是一个辅助功能,用作参考。
  165.  
  166. 五、SVN使用细节
  167. 目录关系:
  168.  
  169. 1、SVN中的存储机制(了解)
  170. Svn中有一种特有的存储机制,叫差异存储,每个版本只存储与上一个版本有差异的地方。
  171.  
  172. 在svn仓库中看不到原始的代码文件就是因为差异存储的原因。
  173. 在仓库目录blog下的db目录中,有存放每个版本的具体信息的目录:revprops和 revs
  174.  
  175. 比如记录日志信息的目录中:
  176.  
  177. 2、忽略文件
  178. 有的时候,我们在工作目录中存放了一些与项目代码没有直接关系的参考文件,这些文件不需要提交到svn仓库进行管理,所以可以设置为忽略文件,避免它们出现在提交列表中,干扰我们的操作。
  179. 操作方式:右键->TortoiseSVN -> add to ignore list添加到忽略列表, 有四个选项:
  180.  
  181. 设计.psd   选中这一项忽略当前文件
  182. *.psd   选中这一项忽略当前目录下后缀为.psd的所有文件
  183. 设计.psd(recursively)  recursively是递归的意思,忽略掉所有目录中的该名称的文件
  184. *.psd(recursively) 忽略所有目录中的.psd后缀的文件
  185.  
  186. 反向操作(取消忽略):右键->TortoiseSVN -> remove from ignore list从忽略列表移除
  187. 3、版本回退(重点)
  188. 查看项目代码的提交历史日志信息:右键->TortoiseSVN -> show log
  189.  
  190.  
  191. 版本回退的操作方式:
  192. 右键 -> TortoiseSVN -> update to revision
  193.  
  194. 可以手动设置版本号:选中Revision,在输入框填写版本号
  195. 也可以点击Show log 选中一个版本,自动填入版本号
  196. 设置好要回退的版本号,点击ok进行版本回退。
  197. 回退到历史版本后,右键 -> SVN Update可以回到最新版本。
  198. 注意:版本回退功能仅用于查看历史版本代码或者获取历史版本代码,不能回退到历史版本后直接在历史版本基础上继续开发。
  199. 版本回退之后,如果在历史版本中修改文件代码,然后提交,会提示错误,文件过期,需要先更新到最新版本再提交。更新时又可能会引起冲突。
  200. 比如:
  201. 在版本3基础上,先修改一下Application.class.php,写一些代码并提交
  202.  
  203. 提交:
  204.  
  205. 提交后版本为4号
  206.  
  207. 通过版本回退功能,回到3号版本
  208.  
  209. 然后重新修改Application.class.php
  210.  
  211. 直接进行提交操作
  212.  
  213. 点击ok提示我们要更新代码
  214.  
  215. 更新之后,会有冲突的提示:
  216.  
  217. 总结:在版本回退之后,不要在历史版本中修改代码。要先更新到最新版本,然后写代码后再提交。
  218. 4、版本冲突
  219. 版本冲突:如果多个人对同一个文件做了修改,然后同时提交,后提交的人会发生代码覆盖的问题,这在svn中就叫“版本冲突”。
  220. 发生版本冲突,本质还是因为后提交的人,其提交代码时代码的版本不是最新的,也就是其在一个历史版本提交了代码,引起了版本冲突。
  221. 这个冲突不是直接发生在svn仓库,是发生在提交者本地的代码。svn提示后提交的人需要先更新svn仓库中的最新版本代码,然后其本地的代码就会有冲突提示。
  222. 冲突的表现:
  223. ①文件上出现冲突图标,文件下方出现一些新的文件
  224.  
  225. ②文件中的代码有变化,里面有多个版本的代码
  226. 代码中冲突的部分会出现很多标记,每个标记之间的代码分别是不同版本的代码。
  227.  
  228. 说明:这里变化的这部分代码是发生冲突的代码,如果文件中有其他不受冲突影响的代码,会正常的显示,我们要处理的只是其中发生冲突的部分。
  229. 强调:发生冲突之后,一定要解决冲突,再提交。
  230. 处理冲突的方式:
  231. ①根据需要,处理文件中的代码,保留最终需要留下并提交的代码
  232.  
  233. ②选中冲突的文件,右键->TortoiseSVN -> resolve解决冲突,这个操作是标记文件,表示这个冲突已经被处理,代码可以直接提交了。操作之后会自动把冲突产生的多余文件删除。
  234.  
  235. 注:冲突是发生在客户端本地的,版本回退也是在本地回退,svn仓库中的代码是不受影响的,各个版本在svn仓库中都还是存在的。
  236. 冲突处理完成,进行提交操作。
  237.  
  238. 提交成功:
  239.  
  240.  
  241.  
  242. 5、配置多仓库
  243. 在工作中,通常我们要同时开发多个项目,比如一个blog博客,一个shop商城,都需要使用svn来管理,这里需要新建一个仓库shop
  244.  
  245. 在工作目录shop中直接进行检出checkout操作,发现得到的是blog仓库的代码,并不是shop仓库的代码
  246. 即使重新开启一次仓库服务,想把svn://localhost 绑定到shop仓库,实际上没有生效。
  247. 解决办法:
  248. 配置多仓库
  249. 重新开启仓库服务,把仓库地址改为多个仓库的共同上级目录,会把svn://localhost指向该上级目录,
  250.  
  251. 在需要使用仓库时比如检出操作时,在svn://localhost后面加上/仓库名称:
  252. 比如svn://localhost/shop
  253. 在工作目录shop中重新checkout:
  254.  
  255. 结果:正确检出了shop仓库
  256.  
  257. 在原来的blog工作目录,直接使用update等操作时会提示错误:
  258.  
  259. 原因是blog仓库的检出地址还是原来的svn://localhost,需要改变为svn://localhost/blog
  260. 操作方式:右键->TortoiseSVN -> relocate重新定位仓库地址
  261.  
  262. 点击之后
  263.  
  264. 修改路径为svn://localhost/blog
  265.  
  266. 重新执行update等操作就可以成功了
  267.  
  268. 6、权限控制
  269. 我们之前通过给匿名用户设置写权限来使用svn,这种方式在实际工作中是不安全的。
  270. svn提供了一个权限控制功能,可以限制用户对仓库的读写权限。
  271. 权限控制分为认证(Authentication)和授权(Authorization)
  272. 认证文件:鉴别用户身份,可以设置用户名和密码(passwd)
  273. 授权文件:判断用户是否具备某种操作的权限(authz)
  274.  
  275. 设置权限控制的步骤:
  276. 打开该仓库主配置文件svnserve.conf,关闭匿名用户的访问权限
  277. 开启认证文件
  278. 开启授权文件
  279. 打开passwd文件,设置用户名和密码
  280.  
  281. 打开authz文件,设置哪些用户具有哪些权限
  282. ①直接给指定的用户设置权限
  283. 重新在工作目录中进行操作比如更新操作:
  284. 会弹出以下权限认证界面
  285.  
  286. 输入用户名和密码,可以选择保存认证信息(即记住用户名和密码),如果认证成功,以后就不用再次认证。否则,每一次操作都需要进行认证。
  287. ②对用户进行分组,然后对分组设置权限
  288.  
  289. 设置完成之后,配置都会立即生效
  290. 7、清除保存的认证信息
  291. 保存认证信息后,不会再次弹出认证界面,如果需要更改认证信息(用户名和密码),则需要先清除svn保存的认证信息
  292. 在svn的设置页面 (右键->TortoiseSVN->settings)
  293.  
  294. 点击clear选择指定的用户信息进行清除或者clearAll可以清除所有
  295. 然后重新执行update等操作就可以唤起用户名密码输入界面
  296. 六、SVN自启动服务与批处理指令
  297. 1、为什么需要自启动服务
  298. 开启仓库服务,我们是要保持命令行黑窗口的挂起状态,这种方式不友好,如果不小心关闭了这个窗口,整个svn服务就关闭了。更友好的方式,是把svn仓库服务设置成自启动的服务。
  299. 2、创建自启动服务
  300.  
  301. 示例:sc create svn binPath= "F:\Subversion\svnserve.exe -r F:\svncangku --service" start= auto
  302.  
  303. --service 说明其为服务项目
  304. start= auto说明电脑开机就自动启动该服务
  305. 执行:必须使用管理员身份打开命令行窗口
  306. 图示指定位置必须放置一个空格,否则创建会失败。
  307.  
  308.  
  309. 成功之后,可以右键我的电脑-管理,打开计算机管理页面来查看服务
  310. 点击“服务”,查找创建服务时使用的服务名称比如svn
  311.  
  312. 第一次需要手动启动,以后重启电脑之后可以自动启动
  313. 3、批处理指令
  314. 服务的启动停止可以通过执行命令来实现:
  315. net start svn  启动svn服务
  316. net stop svn  停止svn服务
  317. sc delete svn  删除svn服务(记住:svn如果需要删除必须先停止)
  318. 这些命令都需要在管理员权限下来执行
  319. 为了方便,可以把这些指令分别保存到一个文件当中,比如start.bat  stop.bat
  320. 然后以管理员的身份运行这些文件,可以达到和执行命令相同的效果
  321.  
  322. 七、钩子程序同步代码
  323. 1、钩子程序原理
  324. 每次向svn仓库提交代码之后,需要在apache下来更新一次最新的代码,这样比较麻烦,有一种自动同步代码的解决方案---使用钩子程序
  325. 原理:每次想svn仓库提交代码,这个钩子程序会检测到这次改动,自动在apache下执行一次svn的update操作更新代码。
  326.  
  327. 2、使用同步钩子(post-commit)程序
  328. ① 在服务器端apache创建一个文件夹接收同步数据,比如创建F:\workspace\online目录
  329. ② 在本地和服务器端同时检出svn仓库最新数据
  330. ③打开服务器的Blog仓库,找到hooks钩子目录,新建一个post-commit.bat批处理文件,然后输出如下代码(需要根据实际情况修改里面的内容)
  331. SET SVN=”F:\Subversion\svn.exe”  设置svn指令目录
  332. SET DIR=”F:\workspace\online”  设置需要同步的目录
  333. SVN update %DIR%  [--username a --password b] 使用update指令更新数据到同步目录
  334. 比如:
  335.  
  336. 设置完成,可以测试一下:
  337. 在工作目录blog新增一个文件并提交
  338. 在线上目录online下发现,新增的文件自动更新下来了。
  339.  
  340.  

你可能感兴趣的:(杂七杂八)