【问题标题】:Subversion concept : svn update or svn info颠覆概念:svn update 或 svn info
【发布时间】:2013-11-27 21:10:37
【问题描述】:

好的,我的意思是,我在服务器上有一个 svn 的工作副本,必须保持最新。所以我设置了一个 cronjob 来经常更新 svn。我的脚本只是在特定的时间间隔进行 svn 更新。我尝试在 svn 服务器上使用 post-commit 挂钩脚本,但没有成功。

不管怎样,我的老板让我修改脚本来制作一个svn信息,并将当前版本与工作副本的版本进行比较,如果有变化,则触发更新。 他认为 svn 服务器上的服务器负载会比在同一时间间隔进行更新要少。我的观点是 svn update 确实可以比较,但是更新前的版本。

我在执行 svn info 脚本时没有任何问题,但我认为它不会改变任何事情。

我寻找有关 svn update 的信息以及它的实际作用,但没有找到有用的信息。

编辑:@Wrikken 和@Ben,首先让我澄清一下我的环境。 我的 svn 环境仅在局域网上,所以我们使用 svn 协议(svn://)。我的 svn 服务器是 ubuntu 服务器,我的客户端是 debian 服务器。我已经在我的 svn 服务器上配置并运行了 hookscript,以便与作为我的 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 svn@ipaddress 'svn update /path/to/working/copy'

只执行更新脚本可以与运行 svn 服务器 (svn) 的同一用户正常工作 但是当提交完成时它从未被执行过。 我现在有点迷路了。

【问题讨论】:

  • svn info & 然后svn update 在服务器上比svn update 更重,如果没有什么要更新的话,它并没有多大作用。我很好奇您在使用 post-commit 钩子时遇到了什么问题,在这里可以完美触发构建......
  • @Wrikken 最后我们找到了问题。 svn 用户以前从未在该服务器上进行 ssh 连接。因此,使用 sshpass 命令,它被赋予了问题的密码,您是否信任计算机。所以该命令永远不会正常工作。我们将提交后更改为使用 ssh 密钥,一切都开始工作了

标签: svn


【解决方案1】:

需要明确的是,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 建议使用提交后挂钩来触发更新。这当然是一种选择,尽管这意味着托管 Subversion 的服务器必须有某种方式与您尝试运行更新的服务器通信。大多数时候,人们通过允许 Subversion 服务器 ssh 访问其他机器来做到这一点。出于安全原因,这可能是不可取的。

与其滚动你自己的方式来处理这种通信或处理允许 Subversion 服务器访问你想要运行更新的机器的安全问题,你可以使用 svnwcsub 和 svnpubsub 服务器。您可以在 Subversion 1.8.x 压缩包的 tools/server-side/svnpubsub 目录中找到这两个工具。 svnpubsub 是一个将提交通知分发给订阅它们的客户端的服务器。 svnpubsub 从名为 commit-hook.py 的提交后挂钩接收通知。 svnwcsub 是 svnpubsub 的一个客户端,它订阅服务器端,并在发生会影响它们的更新时按照配置自动更新工作副本。

一旦你有了一个 svnpubsub 基础设施,你就可以做各种各样的事情。那里有一些代码可以订阅更新,然后在提交时发推文或向 irker(IRC 机器人)发送消息。

【讨论】:

  • “不要使用 post-commit 钩子,使用 ... post-commit 钩子!” :P(但我明白你的意思,确实,给 SSH访问有点多,其他机制已经足够了。从来没有使用过svnpubsub,因为我从来不需要超过一件事的监听,通常会启动一些快速的自定义服务,但我会检查一下;))
  • 这与其说是避免提交后,不如说是避免费心编写自己的自定义服务来实现权限分离。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
相关资源
最近更新 更多