2013-07-22 146 views

回答

12

在預先提交中使用svnlooksvnlook changed給出了提交的更改路徑。將此與您的列表進行比較。如果找到/未找到路徑,則拒絕它。一個預先提交的簡單例子可能是。

#!/bin/sh 

REPOS="$1" 
TXN="$2" 
SPATH="specific/path" 
FOUND=$(svnlook changed -t "$TXN" "$REPOS" | tr -d '\n' | grep -E ".*$SPATH.*") 

if [ "$FOUND" != "" ] 
then 
    echo "Reject commit!" 1>&2 && exit 1 
else 
    exit 0 
fi 

在這裏我刪除了新行和grep感興趣的路徑。如果找不到路徑,請重新提交exit 1。用戶會看到你在那裏回顯的內容。

12

掛鉤腳本應該使用svnlook命令而不是svnsvnlook命令可以使用提交的事務編號(如果這是一個預提交鉤子,則需要使用事務編號,如果這是一個提交後鉤子,則需要修訂編號)。

做一個svnlook -h看到所有的子命令。這裏是他們的列表:

  • author - 檢索提交者
  • cat的用戶ID - 打印出文件中指定
  • changed - 打印出來的文件和目錄,改變
  • date - 打印出提交的時間戳
  • diff - 打印所有文件的差異
  • dirs-changed - 打印出修改的目錄(
  • filesize - 打印出bytes`
  • history文件大小 - 打印出歷史(更像svn log
  • info - 打印出文件的信息
  • lock - 打印鎖定信息
  • propget - 獲取特定屬性。
  • proplist - 列出所有屬性。
  • tree - 打印出來的目錄結構
  • uuid - 打印出庫
  • youngest的UUID - 打印出來的最後一個版本號。

看起來像svnlook changed是你想要的。

兩個約svnlook非常重要的事情:

  1. svnlook命令不能改變任何數據,只是顯示它。有些人希望看到如何使用svnlook更改房產價值。答案是,你不能。
  2. svnlook存儲庫目錄位置作爲參數,而不是存儲庫的URL。這意味着svnlook只能在服務器上運行。
+0

請你拿這個問題來看看http://stackoverflow.com/questions/29236308/how-to-print-arguments-in- svn-hook –

+0

答案已經給出。一個SVN鉤子只會顯示打印到'STDERR'而不是'STDOUT'的內容。而且,只有當hook _fails_(即以非零退出值退出)時纔會發生。 –

+0

好的,所以我在我的post-commit hook中有這個命令: $ msg ='$ svnlook changed -t「$ rev」「$ repos」'; 和msg的長度爲0,這意味着命令無法執行,這是在Windows上,所以這個命令是否正確,因爲我沒有在任何地方看到錯誤? –

-1

你可以嘗試這樣的事情:

FILTER="(some/path|other/path)" 
FOUND=$($SVNLOOK dirs-changed "$REPOS" -t "$TXN" | $GREP -E ".*/$FILTER/.*") 
if [[ "$FOUND" == "" ]]; then 
    echo "Your commit has been blocked." 1>&2 
    exit 1 
fi