0

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

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

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

  • 一个准确的 SVN URL
  • 本地根项目目录
  • 修订版(我将使用字符串“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: File not found: revision 0, path '/trunk/project-gadfly/SocketServer/DiscoveryServer.cpp' (Svn::Error: :FsNotFound)

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

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

在此先感谢,埃尔伍德霍普金斯

4

1 回答 1

0

我不知道问题中特定于 Ruby 的部分,但很明显,您要求 SVN API 在修订版 0 处签出“status.entry.url”,这里当然不存在。

您查看 Perl 文档以使用 Ruby 编写也很奇怪。我建议您改为查看 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 指定为挂钩修订版。但是您应该指定 HEAD。

池呢 --- 它们是 SVN 内存管理的一部分。这是解释:http ://subversion.apache.org/docs/community-guide/conventions.html#apr-pools

于 2012-07-23T14:18:27.130 回答