我終於建立了一個「提交後」鉤子,執行存儲庫的rsync。
的/ var/SVN/myproject的/掛鉤/後提交:
REPOS="$1"
REV="$2"
#"$REPOS"/hooks/mailer.py commit "$REPOS" $REV "$REPOS"/mailer.conf
if [ $# -ge 1 ]; then
/var/svn/.hooks/rsync-to-redmine "$REPOS" "$REV"
else
echo "ERROR: No repository given"
fi
的/ var/SVN/myproject的/掛鉤/後提交:
#!/bin/bash
# Configuration
rsyncExecutable="/usr/bin/rsync"
localRepositoryBasePath="/var/svn/"
remoteUser="svnsync"
remoteHost="redmine.mycompany.com"
remoteRepositoryBasePath="/var/svn/"
privateKeyFilePath="/var/svn/.hooks/rsync-to-redmine-certFile"
# /Configuration
repositoryName=`basename "$1"`
if [ -z $repositoryName ]; then # No repository name given
echo "ERROR: No repository name given"
else
if [ -d "$localRepositoryBasePath$repositoryName/" ]; then # Given repository name seems to exists
repositoryDirectoryRealpath=`realpath "$localRepositoryBasePath$repositoryName"`/ # Compute realpath to validate directory (to protect against $1 setted to ".")
if [ "$repositoryDirectoryRealpath" != "$localRepositoryBasePath" ]; then # Directory is not the base path (otherwise we would rsync the entire $localRepositoryBasePath directory
#TODO: Check that $repositoryDirectoryRealpath is under $localRepositoryBasePath
$rsyncExecutable -rltgoDvz -e "ssh -i $privateKeyFilePath" "$repositoryDirectoryRealpath" "[email protected]$remoteHost:$remoteRepositoryBasePath$repositoryName"
else
echo "ERROR: Trying to rsync the whole '$localRepositoryBasePath' base directory"
fi
else
echo "ERROR: Directory '$localRepositoryBasePath$repositoryName' doesn't exists"
fi
fi
當有人在SVN存儲庫上提交,rsync程序會將$ remoteHost上的修改推送到$ remoteRepositoryBasePath目錄中。