編寫一個 SVN 鉤子來更新已提交程式碼的副本

編寫一個 SVN 鉤子來更新已提交程式碼的副本

我有一個 SVN 儲存庫,其中儲存了很多子項目。現在,在我的計算機中,post-commit我只是循環遍歷機器上所有可能的資料夾並svn update在每個資料夾上運行:

REPOS="$1"
REV="$2"
DIRS=("/path/to/local/copy/firstproject" "/path/to/local/copy/anotherproject" ... "/path/to/local/copy/spam")
LOGNAME=`/usr/bin/whoami`

for DIR in ${DIRS[@]}
do
    cd $DIR
    sudo /usr/bin/svn update --accept=postpone 2>&1 | logger
    logger "$LOGNAME Updated $DIR to revision $REV (from $REPOS) "
done

問題是,當我只是提交其中一個項目的子資料夾時,這是緩慢且多餘的。我想知道是否有更好的方法來確定我應該使用哪個 DIRS 以及僅有的更新那個。

有什麼方法可以做到這一點嗎?據我所知,無法確定儲存庫的哪一部分已提交,從而確定需要更新哪個目錄。

為每個專案建立單獨的儲存庫是唯一的選擇嗎? (也許從一開始就應該這樣做,如果是的話...)

答案1

我想知道是否有更好的方法來確定我應該使用哪個 DIRS 並且只更新那個。

svnlook dirs-changed就是您要找的:

# svnlook dirs-changed -r 40270 /path/to/the/repo
project1/foo/bar

試試這樣的事情:

#!/usr/local/bash4/bin/bash

typeset -A IP
typeset -A DOCROOT

PROJECTS="project1 project2"

IP=([project1]="ip1" [project2]="ip2")
DOCROOT=([project1]="/var/www/html/project1/" [project2]="/var/www/html/project2/")

REPO="$1"
REV="$2"

USER='deployer'

PROJECT=`svnlook dirs-changed -r "$REV" "$REPO" | awk -F "/" '{ print $1 }'`

ssh -t "$USER@${IP[$PROJECT]}" "cd ${DOCROOT[$PROJECT]} && svn up"

答案2

這是我最終使用的腳本,基於 Quanta 的幫助:

REPO="$1"
REV="$2"
declare -A PROJECTS
PROJECTS=(\
    [project1]="/path/to/projects/project1 /path/to/projects/project1-devel" \
    [project2]="/path/to/projects/project2 /path/to/projects/project2-devel" \
    [project3]="/path/to/projects/project3 /path/to/projects/project3-devel" \
)

PROJECT=`svnlook dirs-changed -r "$REV" "$REPO" | awk -F "/" '{ print $1 }'`
DIRS=${PROJECTS[$PROJECT]}

for DIR in $DIRS
do
    cd $DIR
    sudo /usr/bin/svn update --accept=postpone 2>&1 | logger
    logger "$LOGNAME Updated $DIR to revision $REV (from $REPOS) "
done

請注意,我必須添加的一件大事是該declare -A PROJECTS行。由於某種原因,在我執行此操作之前,關聯數組/哈希將無法工作。

相關內容