使用Ruby SVN绑定将本地工作区更新为SVN存储库“Head”

时间:2012-07-23 11:55:58

标签: ruby svn

我正在用Ruby编写一个程序,需要在启动时从SVN下载我团队软件的最新版本。

结帐功能(来自Ruby SVN绑定)是我认为我想要使用的,因为更新不会添加我机器的本地“主干”工作区中不存在的任何文件。 checkout语句将更新与HEAD不匹配的文件,它将下载根本不存在的文件。实际上,在运行完全递归检出之后,我希望能够获得最新SVN存储库的精确副本。

根据此API,结帐语句基本上采用以下内容:

  • 确切的SVN网址
  • 本地根项目目录
  • 修订版(我将使用字符串'HEAD')
  • 递归(整数1或0)
  • 一个池对象(我无法确定这是什么,但我认为它不会影响我)

这是我写的内容,在为SVN存储库中的每个文件迭代的块中:

if status != NORMAL #any file that changed or is 'missing'
  ctx.checkout(status.entry.url, ROOTDIR, 'HEAD', 0, nil) #update abnormal file to HEAD
end

作为测试,我从本地工作区擦除了一个目录,并尝试使用此命令恢复它。它会一直运行,直到到达其中一个丢失的文件,此时它会引发错误:

`svn_client_checkout3':subversion / libsvn_fs_fs / tree.c:663:Svn :: Error :: FsNotFound:找不到文件:版本0,路径'/trunk/project-gadfly/SocketServer/DiscoveryServer.cpp'(Svn: :错误:: FsNotFound)

我不明白为什么会出现这个错误,因为我认为checkout语句会看到目录(即文件)本地不存在,然后创建它。也许我做错了什么?

回顾我写的内容,我认为所有这些都是一个冗长的方式,提出以下简单的问题:如何使用SVN Ruby将最新版本的SVN存储库放到我的本地硬盘上命令?

提前致谢, 埃尔伍德霍普金斯

1 个答案:

答案 0 :(得分:0)

我不知道特定于Ruby的部分问题,但很明显你要求SVN API在版本0检查“status.entry.url”,这当然不存在。

您在使用Ruby编写Perl文档时也很奇怪。我建议你改为查看Subversion源代码。

这是Ruby方法声明: http://svn.apache.org/repos/asf/subversion/branches/1.7.x/subversion/bindings/swig/ruby/svn/client.rb

  def checkout(url, path, revision=nil, peg_rev=nil,
               depth=nil, ignore_externals=false,
               allow_unver_obstruction=false)
    revision ||= "HEAD"
    Client.checkout3(url, path, peg_rev, revision, depth,
                     ignore_externals, allow_unver_obstruction,
                     self)
  end

正如您所看到的,您已将0指定为peg修订版。但是你应该指定HEAD。

游泳池怎么样 - 它们是SVN内存管理的一部分。以下是解释:http://subversion.apache.org/docs/community-guide/conventions.html#apr-pools