2013-11-27 71 views
1

好吧,在这里我的观点,我有一个svn的工作副本在服务器上必须保持最新。所以我设置了一个cronjob来经常更新svn。我的脚本只是在特定的时间间隔内进行svn更新。我尝试在svn服务器上使用post-commit钩子脚本,但没有成功。Subversion概念:svn更新或svn信息

无论如何,我的老板要求我修改脚本来制作一个svn信息,并将当前的rev与工作副本的rev进行比较,然后如果有变化,则触发更新。 他认为在svn服务器上的服务器负载将少于在同一时间间隔进行更新。我的心意是svn update在更新之前肯定会做比较但是版本。

我在做svn info脚本时没有任何问题,但我不认为它会改变任何东西。

我在寻找关于svn更新的信息,以及它的功能,但没有找到有用的东西。

编辑:@Wrikken和@Ben,首先让我澄清我的environement。 我的svn环境仅在局域网中,所以我们使用svn协议(svn://)。我的svn服务器是一个Ubuntu服务器,我的客户端是一个debian服务器。我已经有了hookscript配置和工作在我的svn服务器上与第三个服务器同步,这是我的svn服务器的一个镜像。我的svn服务器与用户svn一起工作。我的钩子脚本和我的脚本是由同一个用户(svn)拥有的。这是我提交后的脚本(svnsync的命令做工精细) #!/ bin/sh的

REPOS="$1" 
REV="$2" 
ME=`whoami` 

echo "post-commit $REPOS $REV user: $ME " >> /var/log/svnsync.log 

# non interactive: 
/usr/bin/svnsync sync --non-interactive svn://path/to/mirror/repository --username "user" --password "######" >> /var/log/svnsync.log 2>&1 
/path/to/script/script.sh >> /var/log/svnimpact.log 2>&1 

现在我在这里的脚本,连和我的第二台服务器上更新的工作副本(它只是一个SVN客户端不一个SVN服务器)

#! /bin/sh 
/usr/bin/sshpass -p "######" /usr/bin/ssh [email protected] 'svn update /path/to/working/copy' 

执行只与运行SVN服务器(SVN同一用户的更新脚本做工精细) 但它从来没有在commit完成执行。 我有点迷路了。

+0

'svn info'然后'svn update'在服务器上较重,然后只是一个'svn update',如果没有什么需要更新的话,那真的没什么用处。我很好奇你使用post-commit钩子遇到了什么问题,在这里完美的工作来触发构建...... – Wrikken

+0

@Wrikken Finaly我们发现我们的问题。 svn用户从来没有在该服务器上连接过ssh。所以,通过sshpass命令,它被赋予了您信任该计算机的问题的密码。所以命令永远不能正常工作。我们将post-commit改为使用ssh键,而所有的东西都开始工作了,它应该是 – bl00d666

回答

0

只是要清楚svn info如果您指定一个URL或特定的修订版本,只会与服务器通信。做你所描述的指定一个特定的修订版本会产生反效果,所以你需要指定一个URL。否则,您只会从上次更新中获取本地存储的信息。

svn info需要去服务器,它需要检索一些属性数据,以便为您提供信息输出中提供的输出。如果你通过HTTP来做这件事,它会做一些OPTIONS和PROPFIND请求。

当您执行svn update时,客户端发出更新报告请求。这样做时,它会发送一份工作副本状态的描述(在您的情况下,您可能会在一个修订版本中拥有一个完整的工作副本,这使得请求非常简单),然后服务器通过描述来响应请求如何将客户端在工作副本中的数据转换为请求的版本(如果没有指定版本,则为HEAD)。为了通过HTTP执行此操作,客户端发出一些OPTIONS和REPORT请求(第二个报告请求支持继承的属性)。根据客户端和服务器的不同,它可能需要额外的请求来填写一些细节。例如。较新的服务器不会在REPORT响应中发送实际的文件变化量,而是指定要请求它们的URL(允许缓存这些变化量)。

现在您的问题是否值得在svn update之前提出svn info请求?我对此表示怀疑。为了响应PROPFIND请求,服务器必须执行的工作与响应REPORT请求需要做的工作非常相似。由于您的信息和更新请求之间可能有提交,所以最终不得不两次完成这项工作。我将它放在与打开文件之前在文件上运行stat相同的类别中。

然而,对于您提出的问题,有更好的解决方案。 Wrikken建议使用post-commit挂钩来触发更新。这当然是一种选择,尽管这意味着托管Subversion的服务器必须有一些方法与您尝试运行更新的服务器进行通信。大多数时候,人们通过允许Subversion服务器ssh访问其他机器来做到这一点。出于安全原因,这可能是不合需要的。

而不是滚动自己的方式来处理该通信或处理允许Subversion服务器访问您想要更新的机器的安全复杂性,您可以使用svnwcsub与svnpubsub服务器。您可以在Subversion 1.8.x tarball的tools/server-side/svnpubsub目录中找到这两个工具。 svnpubsub是一个将提交通知分发给订阅它们的客户端的服务器。 svnpubsub从一个名为commit-hook.py的提交后钩子接收通知。 svnwcsub是svnpubsub的一个客户端,它订阅服务器端,并在更新发生时自动更新工作副本,这会影响他们。

一旦你有一个svnpubsub基础设施,你可以做各种事情。有一些代码可以订阅更新,然后在提交时发送推文或者发送消息给irker(IRC bot)。

+0

_“不要使用post-commit挂钩,使用post-commit hook!”_:P(但是我得到你的观点确实给了SSH访问是有点多,足够的其他机制可用。从来没有用'svnpubsub'工作,因为我从不再需要更多的东西听,通常会提供一些快速的定制服务,但我会检查它;)) – Wrikken

+0

好吧,它不像避免后期提交,避免了编写自己的自定义服务以允许特权分离。 –