好的,我的观点是,我在服务器上有一个svn的工作副本,必须保持最新。所以我设置了一个cronjob来经常更新svn。我的脚本只是以特定的时间间隔进行svn更新。我尝试在svn服务器上使用post-commit钩子脚本,但没有成功。
无论如何,我的老板要求我修改脚本以生成svn信息,并将当前的rev与工作副本的rev进行比较,然后如果有更改,则触发更新。 他认为svn服务器上的服务器负载将小于以相同的时间间隔进行更新。我认为svn update肯定会在更新前比较版本。
我在执行svn info脚本时没有任何问题,但我认为它不会改变任何内容。
我查找有关svn更新及其实际功能的信息,但没有找到有用的信息。
编辑:@Wrikken和@Ben,首先让我澄清一下我的环境。 我的svn environement只在lan上,所以我们使用svn协议(svn://)。我的svn服务器是一个ubuntu服务器,我的客户端是一个debian服务器。我已经有了hookscript配置并在我的svn服务器上工作,以与作为我的svn服务器镜像的第三台服务器同步。我的svn服务器使用用户svn。我的钩子脚本和我的脚本由同一个用户(svn)拥有。这是我的post-commit脚本(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 svn@ipaddress 'svn update /path/to/working/copy'
仅执行更新脚本与运行svn服务器的同一用户(svn)一起正常工作 但它在提交完成后从未执行过。 我现在有点迷失了。
答案 0 :(得分:0)
要明确svn info
,只有在指定URL或特定修订版时才与服务器通信。要执行您所描述的指定特定修订的内容会产生相反的效果,因此您需要指定一个URL。否则,您只会获得上次更新时本地存储的信息。
当svn info
需要进入服务器时,它需要检索一些属性数据,以便为您提供它在info输出中提供的输出。如果您通过HTTP执行此操作,则会执行一些OPTIONS和PROPFIND请求。
当您执行svn update
时,客户端会发出更新报告请求。在这样做时,它会发送工作副本状态的描述(在您的情况下,您可能会在单个修订版中拥有一个完整的工作副本,这使得请求相当简单)然后服务器通过描述来响应请求如何将客户端在工作副本中具有的数据转换为请求的版本(如果未指定版本,则转换为HEAD)。为了通过HTTP执行此操作,客户端发出一些OPTIONS和REPORT请求(第二个报告请求是支持继承的属性)。根据客户端和服务器的不同,可能需要执行其他请求以填写一些详细信息。例如。较新的服务器不会在REPORT响应中发送实际文件增量,而是指定请求它们的URL(允许缓存这些增量)。
现在问题是,在svn info
之前提出svn update
请求是否值得?我对此表示怀疑。服务器为响应PROPFIND请求而必须完成的工作与响应REPORT请求所需的工作非常相似。它最终必须两次完成工作,因为在您的信息和更新请求之间可能存在提交。我把它与在打开文件之前对文件运行stat的人放在同一类别中。
然而,你提出的问题有更好的解决方案。 Wrikken建议使用post-commit钩子来触发更新。这当然是一种选择,但这意味着托管Subversion的服务器必须有一些方法与您尝试运行更新的服务器进行通信。大多数情况下,人们通过允许Subversion服务器ssh访问其他计算机来实现此目的。出于安全原因,这可能是不合需要的。
您可以将svnwcsub与svnpubsub服务器一起使用,而不是按照自己的方式处理该通信或处理允许Subversion服务器访问您想要更新的机器的安全复杂性。您可以在Subversion 1.8.x tarball的tools/server-side/svnpubsub目录中找到这两个工具。 svnpubsub是一个服务器,它将提交通知分发给订阅它们的客户端。 svnpubsub从名为commit-hook.py的提交后挂钩接收通知。 svnwcsub是svnpubsub的客户端,它订阅服务器端并在发生可能影响它们的更新时自动更新工作副本。
一旦你有了svnpubsub基础设施,你就可以做各种各样的事情。那里有一些代码可以订阅更新,然后在提交时发推文或向irker发送消息(IRC bot)。