2007年12月10日 星期一

修正 SVN Commit Error

最近剛建置一部版本控管系統,正逐次將所有的專案一一納入管制中,環境狀況如下:
Fedora: 7
Apache:2.2.6
Subversion:1.4.4
Trac:0.10.4
Mod_Svn_Dav:1.4.4

由於先前的版本控管情形分由各單位自行負責,結果就是有人使用 Subversion(Windows Based)、有人偏好 Visual SourceSafe 、使用 CVS 大有人在、改良版的 CVSNT 也有,也有自行利用檔案總管管理者,我想這實在不是一個好方法,似乎浪費多餘的人力跟機器在做版本控管這事上頭。現在來做這件事,剛開始就阻力叢叢,並非自己當初想的那樣,為公司節省人、物力,並創造更多的產值。

而當經過努力後,已經有些專案已經進入版本統一控管主機後,也陸續遇到一些問題,其中列出底下的問題修正步驟:

當使用者完成功能撰擬後,將 Source Code Commit 時,雖然能夠將更新送交至檔案庫,系統也能執行 post-commit ,並發 MAIL 通知專案小組人員,不過卻發生以下的錯誤訊息:

Error:Commit failed(details follow):
Error:MERGE request failed on '/svn/dir1/dir2/file'
Error:MERGE of '/svn/dir1/dir2/file' : 200 OK(https://svn.simple.com.tw)

此時,必須再次執行手動更新(svn update)才能使工作目錄與檔案庫的資訊同步,這造成使用者很大的困擾。

幾經追查,才發現原來是欲結合 Commit 同時關閉 Trac 的 Ticket Issue,在測試環境中這個變數 TRAC_ENV 採用專案的絕對路徑,對於接下來的專案並未依各自的專案路徑而改變相對應的路徑,而導致這個錯誤訊息的產生。那就修正一下,可以自行依照專案路徑來設定變數吧!

REPOS="${1}"
REV="${2}"
TRACCLO='/usr/share/doc/trac-0.10.4/contrib/trac-post-commit-hook'
LOG=`/usr/bin/svnlook log -r ${REV} ${REPOS}`
AUTHOR=`/usr/bin/svnlook author -r ${REV} ${REPOS}`
TRAC_ENV="/home/trac/`basename ${REPOS}`"
/usr/bin/python ${TRACCLO} -p "${TRAC_ENV}" -r "${REV}" -u "${AUTHOR}" -m "${LOG}"

2 則留言:

Baryon 提到...

我在windows上也遇到同样的问题,经过长时间的实验, 发现如果将apache作为service启动就会出现这种现象, 作为console启动没有问题。
也许是因为某种权限或者用户路径的原因导致trac的post-commit没有完成。

我不知道你具体是怎么避免这个问题的, 只看blog,还不是很清楚。

Vic 提到...

我遇到的狀況是使用者的 post-commit 有完成,但因為我在 post-commit 中同時希望也關閉 Trac 的待辦事項(Issus),因未注意 post-commit 呼叫 trac-post-commit-hook 時必須提供必需的參數,導致出現使用者 commit 時出現錯誤訊息,但其實 server commit 的動作已完成,只是 commit 後 client 的 update 未完成。

我沒有 windows 的 SVN 環境,不清楚在 windows 中手動執行 post-commit 時會不會有錯誤訊息,如果有的話,應該有助於您除錯。

我在 Fedora 中,就是直接執行 post-commit 才發現這個問題所在,只要提供兩個必要參數即可。
[1] REPOS-PATH (the path to this repository)
[2] REV (the number of the revision just committed)