2012-04-30 88 views
1

我在我的专用网络上的Debian服务器上运行Subversion(Apache2 + mod_dav)服务器。 我也有一个在互联网上公开的服务器上运行的Redmine安装。 这是不能改变的:Subversion服务器必须保持本地/私有,并且Redmine必须保持公开。公共Redmine访问私有/本地Subversion服务器的可能解决方案?

我想使用Redmine的SVN功能(与提交链接问题),但我无法找到Redmine访问SVN存储库(没有NAT/PAT为Subversion服务器)的方法。

我想了一个办法,克隆整个颠覆(或者甚至是选择的)资源库,但它的确是个不错的解决方案? 我想链接到Redmine的存储库需要大约800MB,并且Redmine服务器上有足够的空间。

回答

0

您可以尝试使用http://pagekite.net/将本地服务器直接暴露给公共Web。 (免责声明:我创建了PageKite)

如果您深入了解选项,可以通过密码或源IP限制访问,所以它不一定是巨大的安全风险(不确定您是否担心这一点或不)。如果您决定尝试一下,并且需要一些指引,请随时给我们发送电子邮件!

注:我假设Redmine可以连接到远程存储库,它只是使其可访问的问题。快速的谷歌意味着应该是可能的,但由于我自己没有做到这一点,但我不是100%确定的。

0

我终于建立了一个“提交后”钩子,执行存储库的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目录中。