2012-03-19 79 views
0

我想爲svn編寫一個post commit鉤子腳本來將倉庫導出到團隊基礎服務器。 (所以當你提交代碼時,代碼的最新版本會被複制到團隊基礎倉庫中)如何編寫一個svn鉤子腳本

我使用的語言只有C++和C,我從來沒有寫過腳本。有人能給我一步一步的指導嗎?使用哪種語言,讀什麼等......以及一些示例代碼可能?

是否可以使用C++編寫鉤子腳本?或者我應該學習如何使用Python或Ruby等。

+1

首先,[答案已經可以在這裏(http://stackoverflow.com/questions/139315 /可-i的運行-A-腳本時-I-提交到顛覆)。其次:不。它不一定是一個「腳本」。任何與可執行位的作品。你也可以用C或C++編寫鉤子。 – 2012-03-19 16:16:39

回答

5

如果您願意,可以使用C或C++編寫鉤子。大多數人使用Perl或Python。

最主要的是svnlook應該用在你的鉤子腳本中而不是svn。 svnlook比svn更快更安全。事實上,在預提交腳本中,由於您沒有存儲庫修訂版,您必須使用svnlook

這裏有一些事情要記住你的post-commit鉤:

  • 你不能改變一個版本,不要試圖提交更改。你的提交後掛鉤最終會自行調用。如果您希望開發人員遵循某些參數,那麼您需要有一個pre-commit掛鉤,如果開發人員做得不對,它會失敗。
  • 當Subversion調用您的post-commit掛鉤時,PATH環境變量已被刪除。如果您需要訪問其他命令或文件,則必須自行提供完整路徑。
  • Subversion會通過您的命令行傳遞某些參數。不是實際的命令行,但它意味着您可以在ARGV中找到這些參數。兩個參數將傳遞給您:
    1. 服務器上的存儲庫路徑(對於svnlook命令)。
    2. 修訂版本庫。

一切你必須推斷雖然svnlook(你可以通過system命令來運行。但是,因爲你實際編寫C和C++的東西,你也許可以使用內置的Subversion API )。

另一種可能性:使用像Jenkins這樣的連續構建系統來爲你做髒活。您可能會發現通過Jenkins工作起來更容易,而不必擔心後提交掛鉤如何完成此任務。 Jenkins的優點之一是,當事情出錯時,您不會將失敗的提交後消息發回給用戶(可能沒有錯)。相反,您可以對發生的事情進行完整記錄,並提醒可以真正解決問題的人員。

這是我寫的Perl的一個sample of one。不知道它會對你有什麼好處。

+0

我們正在考慮使用Jenkins或Team Foundation服務器,如果我們使用團隊基礎服務器,我們需要同步svn和TFS,這就是爲什麼我正在考慮post-commit hook。有沒有一種方法可以爲團隊基礎服務器(svn - 團隊基礎服務器)使用同步功能?並感謝您的深刻回覆 – kiki 2012-03-19 17:32:06

+0

@kiki - 實際上,您可以使用Jenkins來完成更多的任務,有時甚至不會將它用於構建。我只是想在這種情況下使用Jenkins只是爲了在Subversion和TeamFoundation之間進行同步。 – 2012-03-19 18:02:41

1

你可以找到關於如何定義這裏pre-commit鉤子說明: http://wordaligned.org/articles/a-subversion-pre-commit-hook

的承諾後是類似的指令創建。

將提交後的模板複製到新文件後,您可以簡單地添加一行來調用您用C++編寫的程序,並將參數傳遞給您的程序。

這取決於您的工作,但大多數情況下使用腳本語言作爲shell腳本或python來完成您的工作可以節省更多的時間。

+0

是否存在將結果導出到其他位置或將代碼複製到其他位置(備份)的現有提交後掛鉤? – kiki 2012-03-19 16:52:47

+0

是的,在svn源代碼中有一個模板:http://svn.apache.org/repos/asf/continuum/trunk/continuum-release/src/test/scm/hooks/post-commit.tmpl現在你有版本庫和版本,你可以簡單地調用'svn'來獲得你需要的所有提交信息。 – devsnd 2012-03-19 16:54:40

+0

我想我需要實際編寫腳本的幫助。有沒有我可以閱讀或看的好資源?用小例子來嘗試它並獲得它的感覺? – kiki 2012-03-19 17:11:45