2010-07-22 97 views
18

我想使用一個預先提交的鉤子來阻止開發人員在非根目錄上設置svn:mergeinfo。也就是說,我想強制執行svn:mergeinfo只能將設置爲像「trunk」或「branches/branchName」這樣的目錄。開發人員有時需要「提醒」,將根的子目錄用作合併目標(根據列出的最佳實踐here)是不好的做法。有沒有人有這樣的鉤子腳本或知道我能找到一個?我在一個Windows環境中,所以批處理或PowerShell會更好,但任何事情肯定會有所幫助。Svn pre-commit hook不允許在非根目錄下使用svn:mergeinfo

+0

嚴格的好奇心 - 你使用Subversion 1.5或1.6? (我也遭受了svn:mergeinfos在各種目錄/文件上的合併,因爲合併到非根目錄,但是在1.5上) – 2010-07-23 01:05:28

+1

我們在1.6。我遇到的問題不是由於svn客戶端在所有事物上設置了mergeinfo的舊的1.5錯誤。相反,這些問題是由於「用戶錯誤」導致的,用戶使用諸​​如「trunk/mySubProject」之類的非根目錄作爲合併目標執行合併,因此在該目錄上設置合併信息。這會導致後續的合併,因爲我相信你知道。 – 2010-07-23 13:43:57

+0

確實 - 感謝您的信息。我們最近只有1.6,所以我沒有時間觀察事情的變化。不過,我需要解決同樣的問題。 +收藏 – 2010-07-23 14:22:11

回答

7

首先,我建議使用perl或python來完成這個任務,windows的批處理還有很多不足之處。

您可以使用http://svn.apache.org/repos/asf/subversion/trunk/tools/hook-scripts/中的一些示例腳本作爲開始。例如,verify-po.py腳本檢查文件編碼和commit-access-control.pl.in檢查作者是否有權提交。您可能會在腳本中使用svnlook diff(如後者)以獲取目錄的更改屬性,並通過相應的路徑查看它們是否使用正則表達式的分支或標記。

更新

找到enforcer pre-commit hook script這似乎是你在找什麼。

這是什麼腳本所做的是它採用 svnlook的窺視交易 是一種進步。當它通過 交易篩選時,它會調用一組 鉤子,這使得管理員可以檢查012xx上的內容並確定它是否可接受爲 。

它包含幾個方法和verify_property_line_added其中(),因爲它是要求被添加到一個屬性上的文件每一行。

+0

看起來這將是最有可能的解決方案,因此是賞金的贏家,除非任何人能夠拿出一些東西。 – Charles 2010-08-07 01:33:48

+0

順便說一下,在你的問題後,我開始對svn鉤子感興趣,並且我將實現一些(以禁止沒有日誌消息的提交爲開始),並且可能會在提交時達到檢查屬性 - 然後將在這裏放置另一個更新。 – pmod 2010-08-07 20:45:55

0

如果你能CPAN在服務器上:

https://github.com/gnustavo/SVN-Hooks/blob/master/examples/check-mergeinfo.pl

如果不是(基於http://comments.gmane.org/gmane.comp.version-control.subversion.user/118969):

REPOS="$1" 
TXN="$2" 
SVNLOOK=/usr/bin/svnlook 

if !($SVNLOOK log -t "$TXN" "$REPOS" | grep -q '\[override] ';) then 

    # Get list of paths which have changed  
    TXN_PATHS=$($SVNLOOK changed -t "$TXN" "$REPOS") 

    # Filter those which are allowed: /trunk, /branches/*,... 
    TXN_PATHS=$(echo "$TXN_PATHS" | grep -Ev "^....(trunk/|branches/[^/]+/)$") 

    # Iterate over all paths, which are not allowed to have mergeinfo 
    while IFS= read -r TXN_PATH; do 
     ELEM_PATH=$(echo "$TXN_PATH" | cut -c 5-) 

     MERGEINFO=$($SVNLOOK propget "$REPOS" svn:mergeinfo -t "$TXN" "$ELEM_PATH" 2>/dev/null) 
     if [ ! "$MERGEINFO" = "" ]; then 
     echo " Cannot merge into directory that is not trunk or a branch:" >&2; 
     echo " $ELEM_PATH" >&2; 
     echo " Override by using [override]." >&2; 
     exit 1; 
     fi  
    done <<< "$TXN_PATHS" 

    # echo "Merge info check: OK" 
fi