首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >svn post-commit挂钩:仅当特定文件发生更改时才更新

svn post-commit挂钩:仅当特定文件发生更改时才更新
EN

Stack Overflow用户
提问于 2012-01-31 02:33:56
回答 2查看 3K关注 0票数 1

好了,我在我的服务器上设置了一个SVN repo。我有一个提交后钩子设置,它更新到"DEV“文件夹,这样当我提交更改时,它会自动推送到我服务器上的"DEV”子域。

我现在需要的是一个简单的方式来推动它到我的“生活”子域时,我准备好了。"Live“子域在同一服务器上,实际上,它将是相同的svn更新/……命令,与DEV相同,但路径不同。

我想我可以在我的repo中有一个特定的文件,也许我可以更改这个文件,然后在提交后的文件中设置一些条件,如果这个特定的文件发生了更改,也可以更新到我的"live“目录。

但我不知道如何写这些代码。目前,我的提交后文件如下所示:

代码语言:javascript
复制
#!/bin/sh

REPOS="$1"
REV="$2"

svn update /var/www/dev/public

我需要它基本上做到这一点(但显然,使用正确的语法)

代码语言:javascript
复制
#!/bin/sh

REPOS="$1"
REV="$2"

svn update /var/www/dev/public
if (pushLive.txt has changed) {
  svn update /var/www/live/public
}

有人有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-31 11:36:53

不确定这是否是最有效的方法,而且从技术上讲,第一种情况将在一个名为"pushLive.txt“的文件上工作,而不管目录是什么,所以你可能想要使用它或确保文件是唯一的……

代码语言:javascript
复制
#!/bin/sh

LOOK=/usr/bin/svnlook
REPOS="$1"
REV="$2"

for changes in `$LOOK changed $REPOS | awk '{print $1 "=" $2;}'`;
do

  idx=`expr index "$changes" =`;
  directory=${changes:$idx};
  action=${changes:0:$idx-1};

  case "$directory" in
    *pushLive.txt )
      case "$action" in
        "U" )
           svn update /var/www/dev/test/public
           ;;
      esac
      ;;
  esac
done

exit 0
票数 2
EN

Stack Overflow用户

发布于 2012-01-31 03:54:36

我不会通过post-commit钩子这样做,因为更新可能需要很长时间。这意味着用户必须等待您的更新完成,然后才能再次控制他们的工作站。

看看Jenkins吧。

Jenkins是一个持续构建服务器,但即使您没有构建,也可以使用它。在您的例子中,您可以使用它来查看活动域的Subversion存储库。当Jenkins在该Subversion URL上检测到提交时,它可以生成一个构建过程。在您的示例中,它将更新实时服务器上的文件。

如果您的服务器是运行Jenkins的同一台计算机,那么可以很容易地将Jenkins工作目录指定为/var/www/live/public目录。(默认情况下,Jenkins将在$JENKINS_HOME/jobs/<jobname>/workspace下创建构建目录,但在Jenkins中有一个选项,您可以在其中指定它)。然后,根本就不需要编程了。这比使用提交后钩子更快、更容易。

顺便说一句,如果您采用这种方法,我建议您创建一个新的更新到一个干净的目录,然后重命名该目录。否则,当Subversion更新您的服务器时,您将同时拥有来自以前和当前Subversion修订版的文件。如果在进行更新时有人在服务器上,这可能会导致问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9068905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档