Subversion
使用 SVN 鉤子對送出的文件應用 astyle
每當有人送出到 SVN 儲存庫時,我想對程式碼應用一些樣式,為此我使用
astyle
svnpre-commit
鉤子對送出的更改使用。我可以像這樣獲取文件名,但是當我應用 astyle 時,程序似乎無法從文件中獲取數據:
for FILE in $($SVNLOOK changed -t "$TXN" "$REPOS" | cut -b 5-); do # echo $REPOS/$FILE 1>&2 # prints the files' paths astyle --style=gnu -n $FILE done # commit the changes from astyle here
知道如何實現這一目標嗎?
我很害怕,但我有一個壞消息要告訴你:你做不到
正如“實施儲存庫掛鉤”一章中的SVN-Book中提到的,在對 Stop-Sign 的評論中(你知道,這意味著)
雖然鉤子腳本幾乎可以做任何事情,但鉤子腳本作者應該在一個方面表現出克制:不要使用鉤子腳本修改送出事務。雖然使用鉤子腳本自動更正送出的文件中存在的錯誤、缺點或違反策略可能很誘人,但這樣做可能會導致問題。Subversion 保留儲存庫數據的某些位的客戶端記憶體,如果您以這種方式更改送出事務,這些記憶體將變得難以察覺的陳舊。這種不一致會導致令人驚訝和意外的行為。而不是修改事務,您應該簡單地在預送出掛鉤中驗證事務,如果它不滿足所需的要求,則拒絕送出。作為獎勵,您的使用者將學習謹慎的價值,
CollabNet 的首席技術官 Jack Repenning 也提到了這一點
…遺憾的是,我必須告訴你,不,你不能那樣做。正在送出的文件的文件內容在鉤子腳本中可供您使用(通過 svnlook 的“changed”和“cat”命令),但您看到的是已經輸入數據庫的數據的副本(雖然不是實際上尚未送出),並且您無法修改它,只能允許或拒絕最終的事務送出。
如果您仍然勇敢嘗試,您可以嘗試從相當古老的主題(2009 年)中理解程式碼,其中作者聲稱“它修改了交易內容”