2010-03-31 67 views
0

我有一個後提交的SVN鉤子運行命令行很好,當我運行SVN的post-commit腳本命令行中運行,而不是commiting文件時(S)使用svn

env - ./foo.sh /path/to/svn/repos/ 12345 

但當從svn調用腳本時,它看起來不起作用。

我基本上做的是檢查提交的文件,如果某個文件被修改,我會將它導出到網絡共享。從命令行運行良好。

的後提交腳本如下:

#!/bin/sh 

REPOS="$1" 
REV="$2" 

CHANGED=`/usr/bin/svnlook changed -r "$REV" "$REPOS"` 
SOURCE="svn+ssh://localhost/path/to/svn/repos/somefile.zip" 
DEST="/mnt/build/somefile-r$REV.zip" 

if [[ "$CHANGED" =~ "trunk/somedir/somefile.zip" ]] 
then 
     `/usr/bin/svn export --non-interactive --trust-server-cert $SOURCE $DEST` 
fi 

exit 0 

有沒有辦法來輸出的任何錯誤消息,當腳本運行的文件,或者專門的SVN導出線(在這裏我覺得可能是一個問題)?

+0

對於好奇心,我發現當從svn調用時,腳本作爲簽入文件的用戶運行)。從使用svn + ssh://方案切換到file://而不是修復它 – funkadelic 2010-04-02 18:33:15

回答

1

鉤子腳本的標準輸出被丟棄,但標準錯誤會返回到客戶端,至少在最近的Subversion版本中。我認爲它已經有一段時間了,但svn 1.4的書說輸出被丟棄了,所以你可能想檢查你運行的是最新版本的服務器 - 看到標準錯誤流是獲得常見類型錯誤的早期預警的好方法。

要從命令輸出發送到文件,並在文件中包含的標準錯誤輸出也保持它在同一個地方,做

command >/path/to/logfile 2>&1 

使用>>而不是>追加到文件:

command >>/path/to/logfile 2>&1 

由於標準錯誤輸出被髮送回SVN客戶端,你也可以通過從標準輸出回這樣的信息,無論是單個命令,

command 1>&2 

或整個腳本,通過把

exec 1>&2 

在腳本的頂部。

一眼就看出你的腳本有一個問題:假設svn輸出行上的反引號不是標記的人工製品,你應該刪除它們。 (他們將執行你寫的export命令,然後取它的輸出,並執行輸出作爲另一個命令 - 你打算幾乎可以肯定不是什麼)

if [[ "$CHANGED" =~ "trunk/somedir/somefile.zip" ]] 
then 
     /usr/bin/svn export --non-interactive --trust-server-cert $SOURCE $DEST 1>&2 
fi 

(我不知道bash中的雙方括號測試語法,對我來說這是一個很好的新發現!)

+0

謝謝!我最終在腳本的頂部添加了「exec >> /tmp/foo.log」。 – funkadelic 2010-04-01 18:37:11

相關問題