我有一个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我应该使用, 只更新那个。
有没有办法做到这一点? 据我所知,没有办法确定回购的哪个部分被提交,从而哪个目录需要更新。
是否为每个项目创build单独的存储库的唯一select? (如果是这样的话,可能应该从一开始就这么做)
我想知道是否有更好的方法来确定哪个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"
下面是我最终使用的基于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
行。 出于某种原因,关联数组/哈希将不会工作,直到我这样做。