今天老大跑过来问我如何把SVN服务器上的当前版本回退到某一个版本上去,我没回答上来,很失败,所以现在整理一下Tortoise SVN的操作知识,当然所有内容都来自于网络,不多废话:
TortoiseSVN用户指南中文版(http://www.svn8.com/shouce/tortoisesvn1.5.8/)
0:SVN的版本号是怎么回事?
svn commit 操作可以作为一个原子事务操作发布任意数量文件和目录的修改。在你的工作副本中,你可以改变文件内容,创建、删除、改名和复制文件和目录,然后作为一个整体提交。
在版本库中,每次提交被当作一次原子事务操作: 要么所有的改变发生,要么都不发生,Subversion 努力保持原子性以应对程序错误、系统错误、网络问题和其他用户行为。每当版本库接受了一个提交,文件系统进入了一个新的状态,叫做版本,每个版本被赋予一个独一无二的自然数,一个比一个大,初始修订号是 0,只创建了一个空目录,没有任何内容。
可以形象的把版本库看作一系列树,想象有一组版本号,从 0 开始,从左到右,每一个修订号有一个目录树挂在它下面,每一个树好像是一次提交后的版本库“快照”。
需要特别注意的是,工作副本并不一定对应版本库中的单一版本,他们可能包含多个版本的文件。举个例子,你从版本库检出一个工作副本,最新的版本是 4:
calc/Makefile:4 integer.c:4 button.c:4
此刻,工作目录与版本库的版本 4 完全对应,然而,你修改了 button.c
并且提交之后,假设没有别的提交出现,你的提交会在版本库建立版本 5,你的工作副本会是这个样子的:
calc/Makefile:4 integer.c:4 button.c:5
假设此刻,Sally 提交了对 integer.c
的修改,建立修订版本 6,如果你使用 svn update 来更新你的工作副本,你会看到:
calc/Makefile:6 integer.c:6 button.c:6
Sally 对 integer.c
的改变会出现在你的工作副本,你对 button.c
的改变还在,在这个例子里,Makefile
在 4、5、6 版本都是一样的,但是 Subversion 会把 Makefile
的版本设为 6 来表明它是最新的,所以你在工作副本顶级目录作一次干净的更新,会使所有内容对应版本库的同一修订版本。
1:如何查看SVN上当前代码库的最新版本号是多少?
打开右键菜单中的show log,然后看到一系列版本更新历史,最上面的那一行,即是最新版本号,所谓的head revision。
2:如何查看本地SVN管理的代码库的当前版本号是多少?
打开右键菜单中的show log,然后看到一系列版本更新历史,显示为粗体的那一行即你本地当前的版本。
3:如何将本地代码库的版本回退到某一个旧版本?
打开右键菜单中的update to revision 在弹出的对话框中进行版本号指定即可,如果选择head revision则更新为最新版本。
4:如何将服务器上的版本回退到某一个旧版本?
将服务器上的版本回退到某一个旧版本我还没找到什么比较好的办法,现在的笨办法是先更一个旧版本到本地,然后没办法直接COMMIT上去,得先把整个文件夹下面的所有.SVN文件全部清除掉,然后覆盖本地一个版本,再进行COMMIT。
5:TortoiseSVN的export 和check out 有什么区别?
、新建一个空的文件夹,右键点击它,可以看到TortoiseSVN菜单以及上面的SVN Checkout。
、不用管这个Checkout,我们选择TortoiseSVN菜单下的Export...,接着它会让你输入url。
、比如输入【迷宫探宝】的SVN地址是:http://game-rts-framework.googlecode.com/svn/trunk/
、其他选项不需要更改,Omit externals不要勾选,HEAD Revision选中表示最新的代码版本,接着点击OK即可将代码导出到这个目录中。
而check out 意思 签出,虽然和Export的效果一样是把代码从服务器下载到本地,但是Checkout有验证的功能,Checkout到某处的代码,将会被TortoiseSVN监视,里面的文件可以享受各种SVN的服务。
6:每次commit 代码需要注意哪些问题?
如果你更新了目录中的文件,提交代码需要用到commit功能,commit的功能不仅仅是上传,他会和服务器上面的文件进行对比,假如你更新了某个文件而服务器上面也有人更新了这个文件,并且是在你checkout之后做的更新,那么它会尝试将你的更新和他人的更新进行融合(merge),假如自动merge不成功,那么报告conflict,你必须自己来手动merge,也就是把你的更新和别人的更新无冲突的写在一起。
commit的时候,最好填写Log信息,这样保证别人可以看到你的更新究竟做了写什么。这就相当于上传文件并且说明自己做了那些修改,多人合作的时候log非常重要。
TortoiseSVN的commit只会上传原先checkout然后又被修改了的文件,假如你新加入了某些文件,需要右键点击文件选择Add,然后文件上面会出现一个加号,在下次commit的时候它就会被upload并且被标记为绿色对勾。没有绿色对勾的文件不会被commit。
7:本地那些花花绿绿的图标都分别代表什么意思?
一个新检出的工作副本使用绿色的对勾做重载。表示 Subversion 状态正常.
在你开始编辑一个文件后,状态就变成了已修改,而图标重载变成了红色感叹号。通过这种方式,你可以很容易地看出哪些文件从你上次更新工作副本后被修改过,需要被提交。
如果在更新的过程中出现了冲突,图标会变成黄色感叹号。
如果你给一个文件设置了svn:needs-lock
属性,Subversion 会让此文件只读,直到你获得文件锁。具有这个重载图标的文件来表示你必须在编辑之前先得到锁。
如果你拥有了一个文件的锁,并且 Subversion 状态是正常,这个重载图标就提醒你如果不使用该文件的话应该释放锁,允许别人提交对该文件的修改。
这个图标表示当前文件夹下的某些文件或文件夹已经被调度从版本控制中删除,或是该文件夹下某个受版本控制的文件丢失了。
加号告诉你有一个文件或目录已经被调度加入版本控制。但还需要COMMIT一下才行。
This icon shows files and folders which are not under version control, but have not been ignored. This overlay is optional.
这个标志表示文件或文件夹不在版本控制之下。
8:SVN检出代码的检出深度指的是什么?
你可以选择要检出的深度,它允许你指定子目录递归的深度。如果你只需要大目录中的几个子条目,你可以只检出最高层目录,然后递归的更新选择的目录。
- 全递归
-
检出完整的目录树,包含所有的文件或子目录。
- 直接节点,包含目录。
-
检出目录,包含其中的文件或子目录,但是不递归展开子目录。
- 文件子节电
-
检出指定目录,包含所有文件,但是不检出任何子目录。
- 仅此项。
-
只检出目录。不包含其中的文件或子目录。
- 工作副本
-
保持工作副本指定的深度。此选项不用于检出对话框,但它是其它所有含有深度配置对话框的默认配置。
9:clean up是什么东东?
也许由于服务器问题,一个Subversion指令不能成功地完成,你的工作副本因此被滞留在一个不一致的状态。 那样的话,你需要在该目录上使用
clean up还有一个用处就是,如果一个文件的日期改变了但是它的内容没有变, SVN不能知道倒底是不是发生了变化,除非跟旧文档做一个逐字节的比较。如果你有很多文件是这种状态,那就导致更新操作非常慢,系统响应也会受到影响。这时候运行一个clean up就能够使那些文件的状态变为正常,使得以后的检查速度变好起来。
一个好习惯:如果项目中引用了其他的第三方的程序集,比如EnterpriseLibrary、FCKEditor等,这时候不要简单从他们的安装位置引用,而是在你的解决方案下,添加一个Library的目录,把需要的程序集复制到这里,然后从Library目录引用,这样有什么好处,自己想一想吧!