编写一个 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行。出于某种原因,在我这样做之前,关联数组/哈希无法工作。

相关内容