2012-07-23 51 views
0

我正在用Ruby編寫一個程序,它必須在啓動時從SVN下載我的團隊軟件的最新版本。使用Ruby SVN綁定將本地工作區更新爲SVN倉庫'Head'

結帳功能(從Ruby SVN綁定)是我相信我想要使用的,因爲更新不會添加我的機器的本地「主幹」工作區中不存在的任何文件。結帳語句會更新不匹配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:版本0,路徑'/trunk/project-gadfly/SocketServer/DiscoveryServer.cpp'(Svn :: Error :: FsNotFound)

我不明白爲什麼會引發這個錯誤,因爲我認爲結帳語句會看到該目錄(即文件)本地不存在,然後創建它。也許我做錯了什麼?

回想我所寫的內容,我認爲所有這些都是一個冗長的方式來提出以下一個簡單問題:如何將最新版本的SVN存儲庫加載到本地硬盤上,並使用SVN Ruby命令?

由於提前, 埃爾伍德·霍普金斯

回答

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

+0

哦,我的確在一些地方看過那個頁面上的Perl這個詞,但由於某種原因,我從來沒有質疑SVN綁定可能與Ruby不同。這解釋了一切。謝謝。 – 2012-07-23 15:28:23