TortoiseSVN

一 基本用法

下载

下载链接:https://tortoisesvn.net/downloads.zh.html

image-20210117222450453

image-20210117225326975

下载对应系统版本的软件本体和语言包,先安装软件本体,在安装语言包的时候选择设置为对应语言,如果忘记选的话,右键进入setting设置。

image-20210117234512912

在这里插入图片描述

使用

检出项目

假如项目已经在服务器仓库中,如何将项目检测到本地?

首先选择好要检出的目录,创建一个空文件夹,在空文件夹上面右键,选择:SVN检出(SVN Checkout)在弹出的界面填入版本库地址,选择确认。

image-20210117230214948

如果是第一次配置,会弹出认证窗口。输入仓库管理员提供的账户和密码并勾选保存认证,点击确定。

image-20210117232248778

等待检出完成就可以看到项目在本地的副本了。

提交

绿色图标表示当前文件没有被修改过。

在这里插入图片描述

如果在 我是新项目.txt 被修改,会发现图标变成了红色。

在这里插入图片描述

在这里插入图片描述

提交有两种方式。

  1. 在选中的文件上右键,并选择 SVN 提交(SVN Commit…)
  2. 在项目最外层目录右键,并选择 SVN 提交(SVN Commit…)

之后会弹出提交信息的输入框,这里如果仓库管理员不做限制是可以不填写的,但是建议即使一个很简单的修改也要写个日志,方便团队中其他人知道你做了什么修改。提交后文件上面的角标就又会变成绿色了。

image-20210117232917071

image-20210117233002564

如果是加入一个新文件,新文件上会有一个蓝色的角标。蓝色表示不属于版本库的未知文件。未知文件是不可以提交的。

在这里插入图片描述

image-20210117232807828

如果想要提交一个未知的文件,需要先将文件增加到版本库中,当文件的角标变成蓝色的加号,表示文件已经执行了增加到版本库的操作,此时点击提交。文件才会提交到版本库中。

提交之前需要检查本地版本是否为最新版本,如果不是则需要更新项目为最新版本才可提交。

Svn的版本管理是以库版本为唯一版本的,即使只提交了一个文件,那么整个库的版本都会加1。

image-20210117233402707

更新

如果你要更新的目录里面,或者你选择要更新的文件没有文件修改冲突,那么恭喜你,你是幸运的,并且此次更新是最简单的更新。

如果更新的目录中或者文件有修改,并且修改的地方不重复,那么软件会帮你自动合并。此时绝大部分也不会有什么问题、

如果两个人都修改了文件的同一行,并且修改的内容也不一样。那么此时文件就会有冲突了。

如果文件冲突,那么更新列表中的文件就会变红,此时双击文件,查看冲突的地方。

冲突的文件会有一个黄色感叹号的下标。

image-20210118000353890

image-20210117235344318

image-20210117235415346

如上图,红色的部分就是冲突的文件了。

image-20210117235545187

如果想要保留用户1和2的修改,就将两个文件的修改部分添加到下面的文本框中。并ctrl + s 进行保存,选择标记为解决。

那么两个文件冲突的部分就修改好了。如果别人修改了大量的内容,你只是改了很少,那么也可以使用其他人的文件,再将自己的内容加回去。只需要右键冲突的文件,选择 使用他们的文本解决冲突。如果其他人修改了很少的地方,你修改了很多的东西,也可以和对方商量,使用你的文件解决冲突,并通知对方添加他的修改。

image-20210118000258872

SVN还原

如果文件坏掉了,或者一些文件想还原到服务器版本,可以通过SVN还原操作进行还原。

image-20210118000745532

image-20210118000825348

如果我们写错了东西,并且提交上去了,可以通过版本回滚将文件恢复到以前的版本。

右键目录或者文件,选择更新至版本

image-20210118002152991

image-20210118002047560

查看日志

选择查看日志,可以看到团队中其他人做了哪些修改。

在想要看到日志的文件上面右键,选择显示日志。

image-20210118001014039

image-20210118001050801

如果某一个版本的文件修改出现了问题,又不想影响到后期的版本,那么可以执行 复原此版本做出的修改。

版本控制

版本控制有几种办法

在提交版本的时候添加板门信息,这是最简单的一种办法。

image-20210118002500653

打标签

每次发布版本的时候应该打标签。右键选择分支/标记。在至路径以版本号打上标签。

image-20210118003027111

image-20210118003050860

此时版本的分支就创建好了,想要切换版本,可以右键切换。

image-20210118003154213

此时选择一个版本切换即可。

image-20210118003222311

二 进阶用法

初始化工程目录

branches 分支,分支基于主干(Trunk)的代码创建,所有的开发均使用分支目录,最终提交(Commit)到远程分支,再合并(Merge)到主干(Trunk);

tags 标签,标签常用作版本记录,它可以认为是 GitHub 上的 release 版本;

trunk 主干,所有的分支(Branches)都会合并(Merge)到主干目录中,然后就可以基于主干代码发布到 tags 中,它可以认为是 GitHub 上的 master 分支。

首先创建一个版本库,并检出到本地。

再目录中创建三个目录:branches、tags、trunk

将三个目录加入到版本库并提交。

image-20210118114008081

image-20210118114106499

image-20210118114129159

image-20210118114222537

image-20210118114245292

创建分支(Branches)

在主干(Trunk)目录上右键,选择【TortoiseSVN】-【Branches/tag…】创建分支。

image-20210118114551156

image-20210118115115610

这里一定要填写一个没有的目录,不然会目录冲突。

image-20210118115207842

建立好项目并检出到本地后,我们就可以在本地进行项目的初始化构建了,我们可以往其中添加一些文件作为最初的版本,然后右键-【TortoiseSVN】-【Add…】,最后右键 -【SVN Commit…】提交到 SVN 服务器上的主干代码中,以后的开发就从这个最原始的主干代码开始。

合并操作 (Merge)

SVN 的合并操作咋一听还是很绕的:我们平时讲“合并到主干”,看上去是应该是把分支合并到主干,即 分支→主干,但实际操作中却是反向操作的,即 把来自分支的代码合并到主干。也就是说:合并(Merge)操作是在主干(Trunk)目录上执行的右键操作!!!

image-20210118120217928

image-20210118120522878

image-20210118120631993

image-20210118120741619

image-20210118120808792

image-20210118120853336

image-20210118121030525

image-20210118121051538

这样,就合并过来了,将合并的文件提交,就完成版本合并了。

创建标签 (Tags)

在主干上点右键,仍然选择【TortoiseSVN】-【Branches/tag…】,但这次选择的保存路径(To path)是 tags 目录。

image-20210118142805258

标签可以理解为一个正式的版本,其中的代码一般为只读状态(这个需要在 SVN 环境所在的服务器上对目录做读写权限设置),一般一个大功能完成都会做一个 tag,它可以认为是 GitHub 上的 release 版本。

常见问题

拖拽文件

在版本库浏览器(Repository Browser)中,可以直接使用鼠标进行文件的拖拽操作,不管是拖入还是拖出,但该操作会阻塞住界面,出现版本库浏览器(Repository Browser) 假死的状态,特别是比较大的文件,尤其严重,等待传输完成即可。拖拽出来的文件没有版本控制,拖入的文件类似Add操作添加的文件。

仓库地址变更

在磁盘中找到当前项目,直接在项目目录上点击右键,选择TortoiseSVN-重新定位(Relocate)

image-20210118143432924

image-20210118143620493

在打开的界面中填入新的地址并根据引导一步一步完成迁移即可!

变更账号

有时我们可能的账号可能出现问题,或者有权限不够,并临时使用其他账号的情况。此时我们默认保存的账号可以通过TortoiseSVN-设置-已保存数据

image-20210118144027989

找到认证数据,将数据清除,再次访问的时候就会弹出输入用户名和密码的界面了。

一些报错

  1. 无法打开文件’XXX\nnn-n.txn\changes’:无法访问,文件正被其它程序使用。

通常报告这个错误的人都说这个问题是随机发生的,并且通常会在一次大的提交中发生。重新提交可能成功,也可能在别的地方出错。

最有可能的原因是,有一个病毒扫描程序正在非正常地占用这个文件。你可以试着禁用病毒扫描,或者让它忽略你的版本库文件。

类似的错误也可能发生在你的工作拷贝,试试让它忽略 .svn 文件夹。

还有一些类似的,比如在更新的文件列表中,有一个excel,这个文件处于打开状态,那么此时更新就会失败。需要先关闭这个文件再次更新,如果提示Clean工程,那么就先执行清理操作,再更新工程。


  1. 当我们提交文件时.so后缀的文件会被忽略,不会一起提交上去。

我们打开TortoiseSVN-设置-常规设置,找到全局忽略样式。这里 *.so 表示所有so后缀格式的文件都会忽略。根据实际情况配置即可。如果只是想提交个别文件,也可以找到文件右键添加再提交,也可以提交。


  1. svn: Server sent unexpected return value (500 InternalServer Error) in response to OPTIONS request for’http://svn.moon.ossxp.com/svn/test

错误的用户名
检查登录的用户名是否输入错误

svn: 服务器发送了意外的返回值(500 Internal Server Error),在响应 “OPTIONS” 的请求“http://svn.moon.ossxp.com/svn/test”


  1. svn: OPTIONS of ‘http://svn.moon.ossxp.com/svn/test‘:authorization failed: Could not authenticate to server: rejected Basicchallenge (http://svn.moon.ossxp.com)

错误的口令
用正确的用户名/口令登录

svn: 方法 OPTIONS 失败于 “http://svn.moon.ossxp.com/svn/test”: 认证失败: Couldnot authenticate to server: rejected Basic challenge(http://svn.moon.ossxp.com)


  1. svn: Server sent unexpected return value (403Forbidden) in response to OPTIONS request for’http://svn.moon.ossxp.com/svn/test

用户无权限
联系管理员,为用户分配权限

svn: 服务器发送了意外的返回值(403 Forbidden),在响应 “OPTIONS” 的请求 “http://svn.moon.ossxp.com/svn/test”


  1. svn: OPTIONS of ‘http://www.moon.ossxp.com/svn/test‘:200 OK (http://www.moon.ossxp.com)

服务器地址错误,是普通Web页面,不支持SVN的 WebDAV 协议
确认输入正确的 SVN 服务地址。可以在浏览器中输入该地址进行确认

svn: 方法 OPTIONS 失败于 “http://www.moon.ossxp.com/svn/test”: 200 OK(http://www.moon.ossxp.com)


  1. The version of your subversion (client) is below 1.5.0,upgrade to 1.5.0 or above. SVN below 1.5.0 can not handle mergeinfo properly.It can mess up our automated merge tracking!

是由于客户端的软件版本低于1.5.0造成的。服务器端对客户端软件版本进行了限制,以免对合并跟踪破坏。
升级本地的Subversion客户端软件到1.5.0或以上版本。


  1. svn: This client is too old to work with working copy’.’. You need to get a newer Subversion client, or to downgrade this workingcopy. See http://subversion.tigris.org/faq.html#working-copy-format-change fordetails.

安装了多个版本的SVN客户端(TSVN,Subclipse,…),且各个客户端的版本不一致。高版本的SVN客户端会自动更新本地工作目录中的 .svn 目录下的文件格式,导致旧版本的SVN客户端不能继续访问该本地工作目录
将本机安装的所有的SVN客户端都更新到同一个大版本,以避免本地工作目录的格式不一致

svn: 此客户端对于工作副本 “.” 太旧。你需要取得更新的 Subversion 客户端,或者降级工作副本。参见 http://subversion.tigris.org/faq.html#working-copy-format-change 以获得更详细的信息。


  1. svn: Working copy ‘trunk/src’ locked svn: run ‘svncleanup’ to remove locks (type ‘svn help cleanup’ for details)

异常操作导致目录没有解锁。
一个简单的重现方法:在 .svn 目录下创建空的名为 lock的文件
使用命令行 “svn cleanup” 或者类似的“清理”动作删除锁定

svn: 工作副本“trunk/src”已经锁定 svn: 运行“svn cleanup”删除锁定 (输入“svn help cleanup”得到用法)


  1. 日志中没有作者信息: ------------------------------------ r9 | (没有作者信息) | … ossxp.com anonymous commit test

匿名提交导致没有作者信息
检查版本库权限控制,禁止匿名提交


  1. 正在发送 … 传输文件数据.svn:提交失败(细节如下): svn: Commit blocked by pre-commit hook (exitcode 1) with output:提交说明至少应包含 4 个字符, 或者太简单了。

这是由于用户提交的提交说明(commit log),太过简单了。在提交时需要输入有意义的 commit log。
写有意义的提交说明,或者请求管理员更改版本库插件


  1. with output: Wide character in print at/opt/svn/svnroot/myrepos/hooks/scripts/check-case-insensitive.pl line 259. 发现文件名大小写冲突: trunk/src/Logger.c已经存在于 logger.c

管理员设置了对新增文件是否重名(只有大小写不同)的文件进行检查。文件名只有大小写不同,在Windows上进行检出会造成麻烦
不要添加重名(仅大小写不同)文件

增加 src/文件aBc.txt 传输文件数据.svn: 提交失败(细节如下): svn: Commit blocked by pre-commit hook (exit code 1) with output:Clash: ‘/trunk/src/文件aBc.txt’ ‘/trunk/src/文件abc.txt’


  1. svn: While preparing’/home/jiangxin/tmp/svn.test/trunk/src/README.txt’ for commit svn: Inconsistentline ending style

提交的文件已经设置了 svn:eol-style 属性,但是该文本内的换行符有DOS的换行符CRLF,也有Unix换行符LF,不一致!
统一该文本文件内的换行符。Linux 下可以用dos2unix, unix2dos, sed等命令。Windows下可用UltraEdit 进行转换。

svn: 当为提交操作准备“/home/jiangxin/tmp/svn.test/trunk/src/README.txt”时 svn: 不一致的行结束样式


  1. svn: Failed to add file ‘Makefile’: an unversioned fileof the same name already exists

执行更新(svn up)时报错。因为其他人新增一个文件到服务器,而本地却存在一个同名文件(未版本控制)
先将本地重名文件改名,再执行”svn up”,之后再比较、合并文件。或者执行 “svn up –force”

svn: 增加文件 ‘Makefile’ 失败: 同名未版本控制的文件已存在


  1. Adding src/Makefile svn: Commit failed (detailsfollow): svn: File ‘/svn/test/trunk/src/Makefile’ already exists

添加新文件,提交时报错。因为其他人已经先于我增加了该文件。
先执行更新操作(”svn up”),再根据提示进行操作:合并/提交…

增加 src/Makefile svn: 提交失败(细节如下): svn: 文件“/svn/test/trunk/src/Makefile”已存在


  1. $ svn up Conflict discovered in ‘Makefile’. Select: (p)postpone, (df) diff-full, (e) edit, (mc) mine-conflict, (tc) theirs-conflict,(s) show all options: p C Makefile Updated to revision 5. Summary of conflicts:Text conflicts: 1

多人同时编辑同一个文件时,可能会遇到冲突。别人先于我提交,则当我提交时要先更新。更新可能遇到不能自动解决的冲突
使用工具进行冲突解决

$ svn up 在 “Makefile” 中发现冲突。选择: (p) 推迟,(df) 显示全部差异,(e) 编辑, (mc) 我的版本, (tc) 他人的版本, (s) 显示全部选项: p C Makefile 更新到版本 5。冲突概要: 正文冲突:1


  1. svn: Commit failed (details follow): svn: File’Makefile’ is out of date svn: File not found: transaction ‘6-d’, path’/trunk/src/Makefile’

提交的文件已被他人删除
先执行更新操作(”svn up”),再根据提示解决该树冲突:删除文件或继续添加…

svn: 提交失败(细节如下): svn: 文件 “Makefile” 已经过时 svn: File not found: transaction ‘6-c’, path ‘/trunk/src/Makefile’


  1. svn: Commit failed (details follow): svn: File ordirectory ‘/trunk/XXX’ is out of date; try updating svn: resource out of date;try updating

基于旧版本修改是不允许的
先更新(”svn update”),再提交

svn: 提交失败(细节如下): svn: 文件或目录 “/trunk/XXX” 已经过时;请先更新 svn: resource out of date; try updating


  1. svn: DAV request failed; it’s possible that therepository’s pre-revprop-change hook either failed or is non-existent svn: Atleast one property change failed; repository is unchanged svn: Error settingproperty ‘log’: Repository has not been enabled to accept revision propchanges;ask the administrator to create a pre-revprop-change hook

修改提交说明等操作属于高风险操作,因为该操作没有被版本控制,属于不可恢复的操作。缺省禁止。
请联系管理员,启用该版本的相关钩子,允许修改“版本属性”。参见管理员钩子设置

svn: DAV 请求失败;可能是版本库的 pre-revprop-change 钩子执行失败或者不存在 svn: 至少有一个属性变更失败;版本库未改变 svn: 设置属性 “log” 出错: Repository has not been enabled to accept revision propchanges; askthe administrator to create a pre-revprop-change hook