TortoiseSVN
TortoiseSVN
一 基本用法
下载
下载链接:https://tortoisesvn.net/downloads.zh.html
下载对应系统版本的软件本体和语言包,先安装软件本体,在安装语言包的时候选择设置为对应语言,如果忘记选的话,右键进入setting设置。
使用
检出项目
假如项目已经在服务器仓库中,如何将项目检测到本地?
首先选择好要检出的目录,创建一个空文件夹,在空文件夹上面右键,选择:SVN检出(SVN Checkout)在弹出的界面填入版本库地址,选择确认。
如果是第一次配置,会弹出认证窗口。输入仓库管理员提供的账户和密码并勾选保存认证,点击确定。
等待检出完成就可以看到项目在本地的副本了。
提交
绿色图标表示当前文件没有被修改过。
如果在 我是新项目.txt
被修改,会发现图标变成了红色。
提交有两种方式。
- 在选中的文件上右键,并选择 SVN 提交(SVN Commit…)
- 在项目最外层目录右键,并选择 SVN 提交(SVN Commit…)
之后会弹出提交信息的输入框,这里如果仓库管理员不做限制是可以不填写的,但是建议即使一个很简单的修改也要写个日志,方便团队中其他人知道你做了什么修改。提交后文件上面的角标就又会变成绿色了。
如果是加入一个新文件,新文件上会有一个蓝色的角标。蓝色表示不属于版本库的未知文件。未知文件是不可以提交的。
如果想要提交一个未知的文件,需要先将文件增加到版本库中,当文件的角标变成蓝色的加号,表示文件已经执行了增加到版本库的操作,此时点击提交。文件才会提交到版本库中。
提交之前需要检查本地版本是否为最新版本,如果不是则需要更新项目为最新版本才可提交。
Svn的版本管理是以库版本为唯一版本的,即使只提交了一个文件,那么整个库的版本都会加1。
更新
如果你要更新的目录里面,或者你选择要更新的文件没有文件修改冲突,那么恭喜你,你是幸运的,并且此次更新是最简单的更新。
如果更新的目录中或者文件有修改,并且修改的地方不重复,那么软件会帮你自动合并。此时绝大部分也不会有什么问题、
如果两个人都修改了文件的同一行,并且修改的内容也不一样。那么此时文件就会有冲突了。
如果文件冲突,那么更新列表中的文件就会变红,此时双击文件,查看冲突的地方。
冲突的文件会有一个黄色感叹号的下标。
如上图,红色的部分就是冲突的文件了。
如果想要保留用户1和2的修改,就将两个文件的修改部分添加到下面的文本框中。并ctrl + s
进行保存,选择标记为解决。
那么两个文件冲突的部分就修改好了。如果别人修改了大量的内容,你只是改了很少,那么也可以使用其他人的文件,再将自己的内容加回去。只需要右键冲突的文件,选择 使用他们的文本解决冲突。如果其他人修改了很少的地方,你修改了很多的东西,也可以和对方商量,使用你的文件解决冲突,并通知对方添加他的修改。
SVN还原
如果文件坏掉了,或者一些文件想还原到服务器版本,可以通过SVN还原操作进行还原。
如果我们写错了东西,并且提交上去了,可以通过版本回滚将文件恢复到以前的版本。
右键目录或者文件,选择更新至版本
查看日志
选择查看日志,可以看到团队中其他人做了哪些修改。
在想要看到日志的文件上面右键,选择显示日志。
如果某一个版本的文件修改出现了问题,又不想影响到后期的版本,那么可以执行 复原此版本做出的修改。
版本控制
版本控制有几种办法
在提交版本的时候添加板门信息,这是最简单的一种办法。
打标签
每次发布版本的时候应该打标签。右键选择分支/标记。在至路径以版本号打上标签。
此时版本的分支就创建好了,想要切换版本,可以右键切换。
此时选择一个版本切换即可。
二 进阶用法
初始化工程目录
branches 分支,分支基于主干(Trunk)的代码创建,所有的开发均使用分支目录,最终提交(Commit)到远程分支,再合并(Merge)到主干(Trunk);
tags 标签,标签常用作版本记录,它可以认为是 GitHub 上的 release 版本;
trunk 主干,所有的分支(Branches)都会合并(Merge)到主干目录中,然后就可以基于主干代码发布到 tags 中,它可以认为是 GitHub 上的 master 分支。
首先创建一个版本库,并检出到本地。
再目录中创建三个目录:branches、tags、trunk
将三个目录加入到版本库并提交。
创建分支(Branches)
在主干(Trunk)目录上右键,选择【TortoiseSVN】-【Branches/tag…】创建分支。
这里一定要填写一个没有的目录,不然会目录冲突。
建立好项目并检出到本地后,我们就可以在本地进行项目的初始化构建了,我们可以往其中添加一些文件作为最初的版本,然后右键-【TortoiseSVN】-【Add…】,最后右键 -【SVN Commit…】提交到 SVN 服务器上的主干代码中,以后的开发就从这个最原始的主干代码开始。
合并操作 (Merge)
SVN 的合并操作咋一听还是很绕的:我们平时讲“合并到主干”,看上去是应该是把分支合并到主干,即 分支→主干,但实际操作中却是反向操作的,即 把来自分支的代码合并到主干。也就是说:合并(Merge)操作是在主干(Trunk)目录上执行的右键操作!!!
这样,就合并过来了,将合并的文件提交,就完成版本合并了。
创建标签 (Tags)
在主干上点右键,仍然选择【TortoiseSVN】-【Branches/tag…】,但这次选择的保存路径(To path)是 tags 目录。
标签可以理解为一个正式的版本,其中的代码一般为只读状态(这个需要在 SVN 环境所在的服务器上对目录做读写权限设置),一般一个大功能完成都会做一个 tag,它可以认为是 GitHub 上的 release 版本。
常见问题
拖拽文件
在版本库浏览器(Repository Browser)中,可以直接使用鼠标进行文件的拖拽操作,不管是拖入还是拖出,但该操作会阻塞住界面,出现版本库浏览器(Repository Browser) 假死的状态,特别是比较大的文件,尤其严重,等待传输完成即可。拖拽出来的文件没有版本控制,拖入的文件类似Add操作添加的文件。
仓库地址变更
在磁盘中找到当前项目,直接在项目目录上点击右键,选择TortoiseSVN-重新定位(Relocate)
在打开的界面中填入新的地址并根据引导一步一步完成迁移即可!
变更账号
有时我们可能的账号可能出现问题,或者有权限不够,并临时使用其他账号的情况。此时我们默认保存的账号可以通过TortoiseSVN-设置-已保存数据
找到认证数据,将数据清除,再次访问的时候就会弹出输入用户名和密码的界面了。
一些报错
- 无法打开文件’XXX\nnn-n.txn\changes’:无法访问,文件正被其它程序使用。
通常报告这个错误的人都说这个问题是随机发生的,并且通常会在一次大的提交中发生。重新提交可能成功,也可能在别的地方出错。
最有可能的原因是,有一个病毒扫描程序正在非正常地占用这个文件。你可以试着禁用病毒扫描,或者让它忽略你的版本库文件。
类似的错误也可能发生在你的工作拷贝,试试让它忽略 .svn 文件夹。
还有一些类似的,比如在更新的文件列表中,有一个excel,这个文件处于打开状态,那么此时更新就会失败。需要先关闭这个文件再次更新,如果提示Clean工程,那么就先执行清理操作,再更新工程。
- 当我们提交文件时
.so
后缀的文件会被忽略,不会一起提交上去。
我们打开TortoiseSVN-设置-常规设置,找到全局忽略样式。这里 *.so
表示所有so后缀格式的文件都会忽略。根据实际情况配置即可。如果只是想提交个别文件,也可以找到文件右键添加再提交,也可以提交。
- 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” 中
- 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)
- 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” 中
- 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)
- 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或以上版本。
- 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 以获得更详细的信息。
- 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”得到用法)
- 日志中没有作者信息: ------------------------------------ r9 | (没有作者信息) | … ossxp.com anonymous commit test
匿名提交导致没有作者信息
检查版本库权限控制,禁止匿名提交
- 正在发送 … 传输文件数据.svn:提交失败(细节如下): svn: Commit blocked by pre-commit hook (exitcode 1) with output:提交说明至少应包含 4 个字符, 或者太简单了。
这是由于用户提交的提交说明(commit log),太过简单了。在提交时需要输入有意义的 commit log。
写有意义的提交说明,或者请求管理员更改版本库插件
- 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’
- 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: 不一致的行结束样式
- svn: Failed to add file ‘Makefile’: an unversioned fileof the same name already exists
执行更新(svn up)时报错。因为其他人新增一个文件到服务器,而本地却存在一个同名文件(未版本控制)
先将本地重名文件改名,再执行”svn up”,之后再比较、合并文件。或者执行 “svn up –force”
svn: 增加文件 ‘Makefile’ 失败: 同名未版本控制的文件已存在
- 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”已存在
- $ 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
- 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’
- 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
- 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