2010-11-30 92 views
1

我正在編寫一個post-commit鉤子,其中我使用svn diff -summarize來獲取更改內容的摘要。當添加或修改文件/文件夾時,我可以簡單地將它們的文件類型保存在一個工作副本中,該副本隨時自動更新。但是,當文件或文件夾被刪除時,我無法確定svn diff -summarize中的項目是文件還是文件夾。如何識別SVN diff中的項目是文件還是文件夾?

我曾想過的一種解決方法是保留另一個工作副本,自動更新,但始終將一個修訂保留在另一個工作副本的後面。這樣,如果一個文件/文件夾被刪除,我可以在舊的工作副本中得到它。但是,我認爲這是一種非常低效的方式,迫使我同時保留兩個不同的工作副本,而且我想知道SVN中是否有任何東西可以幫助完成此任務。

回答

2

在編寫任何類型的svn鉤子時,如果需要關於倉庫或關於事務的信息,您希望使用shell腳本中的svnlook程序,或者使用您選擇的語言使用svn API。使用svnlook速度更快,因爲它繞過了所有svn RA(遠程訪問)代碼,包括授權檢查層 - 因爲腳本正在服務器上下文中運行,所以這不是問題。此外,您沒有更新您不使用的工作副本以及文件類型信息以外的任何額外開銷。

svnlook包含許多選項用於調查修訂(用於post-* hooks)和事務(用於預處理*事務)。這裏特別感興趣的是changed選項。顯示

            
 
changed: usage: svnlook changed REPOS_PATH Print the paths that were changed. Valid options: -r [--revision] ARG : specify revision number ARG -t [--transaction] ARG : specify transaction name ARG --copy-info : show details for copies

即由修訂或事務的變化,像這樣:

A trunk/src/new-dir/ 
A trunk/src/new-dir/newheader.h 
A trunk/src/new-dir/newsrc.c 
U trunk/src/existingsrc.c 

從svnlook的輸出,引用一個目錄時,總是在/結束。這是用於檢測文件或目錄的簡單鑑別器。

但是,在處理刪除操作時,事情確實會變得模糊不清。如果目錄被刪除,目錄下的所有內容也會被刪除,並且此信息不會顯示在changed中。看到這裏:

D trunk/src/new-dir/ 
U trunk/src/existingsrc.c 

根據你在看什麼的描述,我會猜測你正在尋找某種形式的提交後報告。如果是這樣,你可能想檢查出the subversion mailer post-* hook。即使您不想通過電子郵件發送結果,該代碼也會演示如何使用svn API瀏覽事務或修改更改。

+0

哇,我從來沒有想過這件事。感謝您回答這個問題,儘管我已經放棄了這個並轉移到了Git。 – 2011-03-19 15:00:07

相關問題