我们一直在犯错误,如果生活总会给你第二次机会,或者改正错误的机会,那不是很棒吗?幸运的是你使用了Subversion,大多数情况下,你可以轻松的修改错误。
假设我们的Subversion不能做的很简单,你犯了一些错误,但是删除了所有发生过的轨迹,Subversion记录在某个时间点的版本库,而且历史不可变,也是不可以修改。很不幸,这意味着一旦你不小心提交了包含密码的配置文件,你可以编辑文件并再次提交,但是Subversion保留初的提交,包含密码。删除这些东西的办法是把版本库dump到一个文件,从dump文件中小心的删除那些内容,然后重新加载版本库。这不适合胆小者,但是可以做。大多数Subversion安装使用提交钩子在每次提交时发送修改细节邮件,这很有价值,即使Subversion让删除轨迹变得容易,也无法避免邮件发送到全世界。
一个Subversion可以简单修正的常见错误是对于删除的恢复,我恨这一点,但是几个月以前我不小心将Subclipse版本库的整个branches目录删除了,你可以在这里看到使用ViewVC看到血淋淋的细节,我知道我可以简单将它找回来。如果你查看以前的链接,你可以看到我在修订版本2981提交了删除,我需要做的是将其从2980拷贝出来。
svn copy -r2980 http://subclipse.tigris.org/svn/subclipse/branches@2980
http://subclipse.tigris.org/svn/subclipse/branches
这个命令的意思是,”将2980修订版本的branches目录拷贝到branches(目前不存在的目录)”,你需要在第一个URL中添加 @2980,它告诉Subversion的历史跟踪规则找到这个目录。如果你省略这个参数,Subversion会查看版本库的HEAD修订版本,你可以在ViewVC的这里看到提交的结果,请注意你可以看到项目是从修订版本2980拷贝而来。
所以是这样将删除的东西恢复,如果事情更加细致该如何?你修改了一组文件,但是你不希望有这些修改。你希望从本质上”回退提交”,这对于 Subverison非常简单,你可以通过所谓的”反向合并实现”。本质上讲,是使用svn merge命令将修订版本号反转过来,对于命令行用户,这种情况已经在Subversion book中详细论述,请见回退修改部分,这一小节也有一些其他的例子,很值得一看。
Subclipse和TortoiseSVN在其图形界面中提供了更简单的方法,1月份我在我的个人blog里写了一个类似的例子,它介绍了使用Subclipse GUI完成这个功能的方法,如果你希望知道如何使用GUI完成这个功能可以看这个帖子。
如果说我希望这个帖子能带来什么,我希望是增加Subversion对于数据安全的信心,继续修改并提交,那是Subversion的工作,如果你犯了错误,不必担心,Subversion一直会给你第二次机会。