前言

在很多游戏公司,通过游戏体量和团队体量会有很多公司使用SVN(包括我公司),

主要原因在于SVN对于二进制文件比起Git来说适配,以及对于非技术人员(美术和策划)有着很低的学习成本

一、介绍

SVN是什么?

SVN 是一种代码版本管理工具,它具有以下功能:

  • 记住每次的修改
  • 查看所有的修改记录
  • 恢复到任何历史版本
  • 恢复已经删除的文件

SVN跟Git相比的优势

  • 使用简单,上手快
  • 目录级权限控制,企业安全必备
  • 子目录 Checkout,减少不必要的文件检出

主要应用

  • 开发人员用来做代码的版本管理
  • 用来存储一些重要的文件,比如合同
  • 公司内部文件共享,并且能按目录划分权限

SVN仓库推荐

安装SVN客户端

  • TortoiseSVN (windows)
  • Cornstone (mac)

二、SVN基本操作

  • 检出 checkout
操作步骤 1 2 3 4 5
操作 TortoiseSVN checkout URL of repository Checkout directory user,password
说明 打开乌龟(bushi) 检出 填写版本库URL 填写检出目录/本地工作区位置 输入用户名和密码

有绿色的勾就代表已经把库拉到本地了,绿色勾代表和服务器一样的

  • 新增add
  • 提交 commit

​ SVN commit 提交 最好选择你需要提交的文件 不要全提交

​ (在游戏开发中有很多meta文件会被引擎修改)

  • 更新 update

    SVN update 会覆盖掉本地的文件,绿色勾代表和服务器一样的

    如果想要本地完全为服务器的话可以把修改的内容给删除重新拉

  • 历史记录show log

​ show log 会看到版本提交的文件以及commit信息

三、 撤销和恢复 Revert

  • 撤销本地修改

​ 本地直接某个文件Revert(SVN还原),就会把你修改的还原成服务器一样的文件

  • 撤销已提交内容

​ 提交完发现代码有问题

​ 在show log中 右键 Revert changes from this revision(恢复此版本中的更改) ->使得本地变成上一个版本

​ 然后去重新commit 并且 commit log 打上 “ revert ”

  • 恢复到指定版本

    在show log中 右键 Revert to this revision(复原到此版本)

四、添加忽略

选中文件 使用 Unversion and add to ignore list

对于忽略的文件如果在服务器的话那么就会被删除

五、SVN冲突

什么情况容易发生冲突?

多个人修改了同个文件的同行

无法进行合并的二进制文件

怎么避免冲突?

经常update同步下他人的代码

二进制文件不要多个人同时操作

冲突了怎么办?

解决冲突很简单,不用怕

产生冲突后update会有红色警告,并且会生成一个.mine文件

  • 使用”他们的”文本块解决冲突 ->使用对方的文本进行恢复

  • 使用“我”解决有冲突的文件 ->使用我的文本进行恢复

  • 编辑冲突 ->手动编辑代码合并

六、分支

什么时候需要开分支?

隔离线上版本和开发版本

大功能开发,不想影响到其他人,自己独立开个分支去开发

SVN经典目录结构:

trunk(主干)

branches(分支)

tags(标记)

注意SVN分支是服务器和本地同时的分支

  • 开分支

在主干目录打开 branch/tag

选择服务器保存路径 to path (/trunk/+ “ branches/onlinev1.0”)

Create copy in the repository from 从此复制到版本库 -> HEAD revision in the repository 版本库中最新版本

  • 更新分支

打开branches文件夹 update分支版本

可以把分支单独checkout出来一份

  • 合并分支

打开branches文件夹 -> show log -> Merge revision to…..(合并版本到) -> 选择trunk

打开trunk 文件夹 可以看到已经合并成功了

commit 可以看到类似 【合并了修改版本号24从Franches/onlinev1.0:修复图片名字错误】 的log

最后commit trunk 的代码

  • 切换分支

Switch….

七、代码暂存 Shelve

  • 情况

代码改了很多,突然需要紧急修复一个bua,但是代码还没写完,不能提交

代码重构了很多,突然需要发布新版本,但是代码还跑不起来,不能提交

步骤 1 2 3 3 4 5
操作步骤 Shelve Path+Name+log Cheakpoint按钮 Shelve按钮 UnShelve Name Version
说明 暂存 选中暂存文件并写暂存名字和log
如果版本名字之前有了那么会把版本号迭代更新
暂存,本地修改保留 暂存,本地修改打回 取出暂存 寻找暂存的名字和版本号

八、复杂代码合并

  • 情况

主干开发新功能 改了

分支是线上版本,修复了很多bug

两个分支的代码时间久了差异很大,无法直接分支合并或者指定提交记录合并代码

BeyondCompare

使用 BeyondCompare合并

拉入俩个文件夹

一个本地 一个服务器 (本人习惯本地在左边 服务器在右边)

使用rules-> Comparison -> Compare contents 比较文件夹

文件夹会有三种颜色

  • 灰:表示俩个文件一样

  • 紫:文件是新增文件

  • 红:文件比对有修改(不一样)

对于三种不同文件采用解决方法

可以在文件夹或者文件内部

使用右键 Move To Right (Ctrl + R) 来处理冲突

或者文件夹内手动修改冲突

九、Git和SVN区别

Git与SVN对比

GitSVN都是版本控制系统,版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一,最主要的功能就是追踪文件的变更。

描述

SVN是集中式管理的版本控制器,而Git是分布式管理的版本控制器,这是两者之间最核心的区别。
SVN只有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
Git每一个终端都是一个仓库,客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来,每一次的提取操作,实际上都是一次对代码仓库的完整备份。
相对来说分布式管理系统功能更强大一些,但同样的上手难度也就高一些,当然分布式代码版本管理系统并不一定适合所有团队,比如中小团队可能更关心的只是成本更低,简单易用,那么SVN等这类集中式版本管理工具还是更为适合,但是不管团队最终选用什么代码版本管理工具,只要适合自己的团队的开发流程和工作方式,并且代码管理顺畅就可以了

细节差异

差异 SVN Git
系统特点 1. 集中式版本控制系统,文档管理很方便。
2. 企业内部并行集中开发
3. windows系统上开发推荐使用
4. 克隆一个拥有将近一万个提交commit,五个分支,每个分支有大约1500个文件,用时将近一个小时
1. 分布式系统,代码管理很方便。
2. 开源项目开发。
3. MacLinux系统上开发推荐使用。
4. 克隆一个拥有将近一万个提交commit、五个分支、每个分支有大约1500个文件,用时1分钟。
灵活性 1. 搭载SVN的服务器如果出现故障,就无法与之交互。
2. 所有的SVN操作都需要中央仓库交互,例如拉分支,看日志等。
1. 可以单机操作,Git服务器故障也可以在本地Git仓库工作。
2. 除了pushpullfetch操作,其他都可以在本地操作。
3. 根据自己开发任务任意在本地创建分支。
4. 日志都是在本地查看,效率较高。
安全性 较差,定期备份,并且是整个SVN都得备份。 较高,每个开发者的本地就是一套完整版本库,记录着版本库的所有信息。
分支方面 1. 拉分支更像是copy一个路径。
2. 可针对任何子目录进行branch
3. 拉分支的时间较慢,因为拉分支相当于copy
4.创建完分支后,影响全部成员,每个人都会拥有这个分支。
5.多分支并行开发较重,工作较多而且繁琐。
1. 我可以在Git的任意一个提交点commit point开启分支。
2. 拉分支时间较快,因为拉分支只是创建文件的指针和HEAD
3. 自己本地创建的分支不会影响其他人。
4. 比较适合多分支并行开发。
5. Git checkout hash切回之前的版本,无需版本回退。
6. 强大的cherry-pick
工作流程 1. 每次更改文件之前都得update操作,有的时候修改过程中这个文件有更新,commit不会成功。
2. 有冲突,会打断提交动作,冲突解决是一个提交速度的竞赛:手快者,先提交,平安无事;手慢者,后提交,可能遇到麻烦的冲突解决。
1. 开始工作前进行fetch操作,完成开发工作后push操作,有冲突解决冲突。
2. Git的提交过程不会被打断,有冲突会标记冲突文件。
3. Gitflow经典流程。
内容管理 SVN对中文支持好,操作简单。 对程序的源代码管理方便,代码库占用的空间少,易于分支化管理。
学习成本 使用起来更方便,SVN对中文支持好,操作简单。 更在乎效率而不是易用性,成本较高,有很多独有的命令如rebase、远程仓库交互的命令等等。
权限管理 SVN的权限管理相当严格,可以按组、个人针对某个子目录的权限控制,每个目录下都会有个.SVN的隐藏文件。 Git没有严格的权限管理控制,只有账号角色划分。
管理平台 有功能非常完善的插件。 除功能插件外,还有GitlabGerritGithub等。

SVN使用教程 - 快速上手_哔哩哔哩_bilibili

https://www.cnblogs.com/WindrunnerMax/p/14171924.html