posts - 262,  comments - 221,  trackbacks - 0
前面认识了svn log命令的用法,知道了该文件的最新版本号是19。那么现在我们就来试试回滚到版本号18。下面将通过三种不同的方式来演示如何回滚到指定的历史版本

●使用svn update -r 命令

C:\>svn cat E:\Temp\ECoupon\read-from-wc.txt
modify by user qlinpen

C:
\>svn cat -r HEAD http://localhost:8000/svn/Workspace/Ericsson/ECoupon/read-from-wc.txt
modify by user qlinpen

C:
\>svn cat -18 http://localhost:8000/svn/Workspace/Ericsson/ECoupon/read-from-wc.txt

C:
\>svn update -18 E:\Temp\ECoupon\read-from-wc.txt
U    E:
\Temp\ECoupon\read-from-wc.txt
Updated 
to revision 18.

C:
\>svn cat E:\Temp\ECoupon\read-from-wc.txt

C:
\>svn cat -r HEAD http://localhost:8000/svn/Workspace/Ericsson/ECoupon/read-from-wc.txt
modify by user qlinpen

上面的例子中,在执行回滚前,本地工作副本和版本库的read-from-wc.txt文件的内容都是一样的:modify by user qlinpen。当我们执行了svn update -r 18 ...命令后可以看到本地的read-from-wc.txt文件的内容已经被回滚到版本18时的状态:即空文本。但是版本库上面的read-from-wc.txt文件依然是版本号19的,也即是最新状态。如果此时执行svn status命令,就可以看到差别了:

C:\>svn status E:\Temp\ECoupon --show-updates
       
*       18   E:\Temp\ECoupon\read-from-wc.txt
Status against revision:     
19

结论:对于没有本地修改的资源,svn update可以回滚到指定的历史版本。但是如果资源已经被修改,则svn update不会对其进行update。

●使用svn copy命令

实际上,除了使用svn update。另外一种更好的办法是使用svn copy命令。那么svn copy命令的用法如何呢?根据SVN手册,svn copy的用法有4种:
 
 A.WC->WC:即从工作副本到工作副本
 B.WC->URL:即从工作副本到版本库,立即产生一次commit操作
 C.URL->WC:即从版本库到工作副本,相当于check out操作
 D.URL->URL:即从版本库到版本库,通常用于创建分支和标记

而且更加有用的是,svn copy支持针对特定版本的拷贝。下面我们通过实际的例子来演示如何通过svn copy来回滚资源到历史版本。首先检查read-from-wc.txt文件的版本历史:

C:\>svn log --18:HEAD E:\Temp\ECoupon\read-from-wc.txt
------------------------------------------------------------------------
r18 
| qlinpen | 2009-12-08 23:11:45 +0800 (星期二, 08 十二月 2009| 1 line
Changed paths:
   A 
/Ericsson/ECoupon/read-from-wc.txt

commit after update
------------------------------------------------------------------------
r19 
| qlinpen | 2009-12-09 16:08:59 +0800 (星期三, 09 十二月 2009| 1 line
Changed paths:
   M 
/Ericsson/ECoupon/read-from-wc.txt

update read
-from-local.txt file
------------------------------------------------------------------------

接下来我们要回滚到版本18.也就是刚刚创建的哪一个版本。

C:\>svn copy E:\Temp\ECoupon\read-from-wc.txt@18 E:\Temp\ECoupon
svn: Path 
'E:\Temp\ECoupon\read-from-wc.txt' already exists

C:\
>svn del E:\Temp\ECoupon\read-from-wc.txt
D         E:\Temp\ECoupon\read
-from-wc.txt

C:\
>svn copy E:\Temp\ECoupon\read-from-wc.txt@18 E:\Temp\ECoupon
A         E:\Temp\ECoupon\read
-from-wc.txt

C:\
>svn status E:\Temp\ECoupon --show-updates
R  
+            -   E:\Temp\ECoupon\read-from-wc.txt
Status against revision:     
19

C:\
>svn cat -r BASE E:\Temp\ECoupon\read-from-wc.txt

C:\
>svn cat -r HEAD http://localhost:8000/svn/Workspace/Ericsson/ECoupon/read-from-wc.txt
modify by user qlinpen

通过svn copy的做法是
 A.首先用svn del删除本地已经存在的同名文件,否则copy操作失败
 B.然后用svn copy PATH/URL@REV PATH/URL来拷贝指定版本的资源到目的地

和svn update -r REV相比,这里多了一个“删除”的动作,所以在svn status命令的执行结果中会出现一个“R +”,R是Replace的缩写:表明这个文件已经被同名的文件所取代。从以上的实例可以看到svn copy不单可以拷贝当前的文件,还可以拷贝历史版本。

●使用svn cat命令配合重定向

最后介绍另外一种办法:svn cat重定向。和svn log类似,svn cat也可以查看历史版本的内容,但它不能指定版本范围而只能使用单个版本号。配合重定向功能我们可以在查看历史版本后重定向到本地。

C:\>svn cat -18 E:\Temp\ECoupon\read-from-wc.txt

C:\
>svn cat -18 E:\Temp\ECoupon\read-from-wc.txt > E:\Temp\ECoupon\read-from-wc.txt

C:\
>svn status E:\Temp\ECoupon --show-updates
M              
19   E:\Temp\ECoupon\read-from-wc.txt
Status against revision:     
19

和svn update,svn copy命令相比,svn cat 配合重定向显得“高效”和“霸道”多了---因为它不会给出任何提示或警告就直接覆盖了


-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。
posted on 2009-12-09 17:19 Paul Lin 阅读(418) 评论(0)  编辑  收藏 所属分类: 项目管理

只有注册用户登录后才能发表评论。


网站导航:
 
<2009年12月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(21)

随笔分类

随笔档案

BlogJava热点博客

好友博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜