svn提交后钩子:仅当某些文件已更改时更新

svn提交后钩子:仅当某些文件已更改时更新,svn,post-commit-hook,Svn,Post Commit Hook,好的,我在我的服务器上有一个SVN repo设置。我有一个post-commit钩子设置,可以更新到DEV文件夹,这样当我提交更改时,它会自动推送到服务器上的DEV子域 我现在需要的是一个简单的方法,当我准备好的时候,把它推到我的活动子域。活动子域位于同一服务器上,实际上,它将是相同的svn更新/。。。命令与DEV相同,但指向不同的路径 我想我可以在我的repo中有一个特定的文件,也许我可以更改这个文件,然后在我的post-commit文件中设置一些条件,如果特定的文件发生了更改,也可以更新到我

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

我现在需要的是一个简单的方法,当我准备好的时候,把它推到我的活动子域。活动子域位于同一服务器上,实际上,它将是相同的svn更新/。。。命令与DEV相同,但指向不同的路径

我想我可以在我的repo中有一个特定的文件,也许我可以更改这个文件,然后在我的post-commit文件中设置一些条件,如果特定的文件发生了更改,也可以更新到我的live-dir

但我不知道如何编写代码。当前我的提交后文件如下所示:

#!/bin/sh

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

svn update /var/www/dev/public
我需要它基本上做到这一点,但显然语法正确

#!/bin/sh

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

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

有人有什么建议吗

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

看一看

Jenkins是一个连续构建服务器,但即使没有构建,也可以使用它。在您的情况下,您可以使用它来监视活动域的Subversion存储库。当Jenkins在该Subversion URL上检测到提交时,它可以生成一个构建过程。在您的情况下,它将更新live server上的文件

如果您的服务器是运行Jenkins的同一台机器,则可以轻松地将Jenkins工作目录指定为/var/www/live/public目录。默认情况下,Jenkins将在$Jenkins_HOME/jobs//workspace下创建构建目录,但在Jenkins中有一个选项可以指定它。那么,根本就不需要编程。这比使用post-commit钩子更快更容易


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

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

看一看

Jenkins是一个连续构建服务器,但即使没有构建,也可以使用它。在您的情况下,您可以使用它来监视活动域的Subversion存储库。当Jenkins在该Subversion URL上检测到提交时,它可以生成一个构建过程。在您的情况下,它将更新live server上的文件

如果您的服务器是运行Jenkins的同一台机器,则可以轻松地将Jenkins工作目录指定为/var/www/live/public目录。默认情况下,Jenkins将在$Jenkins_HOME/jobs//workspace下创建构建目录,但在Jenkins中有一个选项可以指定它。那么,根本就不需要编程。这比使用post-commit钩子更快更容易


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

不确定这是否是最有效的方法,而且第一种情况在技术上适用于名为pushLive.txt的文件,而不考虑目录,因此您可能希望使用该文件或确保该文件是唯一的

#!/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

不确定这是否是最有效的方法,而且第一种情况在技术上可以在名为pushLive.txt的文件上工作,而不考虑目录,因此您可能希望使用该文件或确保该文件是唯一的

#!/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

嘿,谢谢你的建议!乍一看,这可能是一个很好的长期解决方案,但就目前而言,我认为设置这样的东西会太麻烦。这是一个小型服务器,用户有限,流量很少;针对特定客户机的特定工具。从这个角度来看,我认为一个简单的post-commit钩子现在似乎是理想的意思,我只是SSH进入并转到live-dir,在我准备上线时进行svn更新,只需半秒钟,因为它只有少量文件,几乎没有流量,而且没有预期的增长,除了少数实际使用web界面的客户端之外。所以,是的…只是认为更新repo中的特定文件并附加提交后钩子似乎是最好的方法,只是为了解决提交用户必须等待钩子返回的问题-您可以在后台启动提交后钩子脚本以避免此问题。嘿,感谢
e建议!乍一看,这可能是一个很好的长期解决方案,但就目前而言,我认为设置这样的东西会太麻烦。这是一个小型服务器,用户有限,流量很少;针对特定客户机的特定工具。从这个角度来看,我认为一个简单的post-commit钩子现在似乎是理想的意思,我只是SSH进入并转到live-dir,在我准备上线时进行svn更新,只需半秒钟,因为它只有少量文件,几乎没有流量,而且没有预期的增长,除了少数实际使用web界面的客户端之外。所以,是的…只是认为更新repo中的特定文件并附加提交后钩子似乎是最好的路线,只是为了解决提交用户必须等待钩子返回的问题-您可以在后台启动提交后钩子脚本以避免此问题。这对我不起作用。我得到了错误:警告:提交后挂钩失败,退出代码255,没有输出。我在提交后使用chmod+x并重新启动了apache。我添加了line touch changedfile.txt以查看它是否到达循环。它没有得到createdstupid问题:您是否更改了特定设置/文件的代码行?示例*pushLive.txt应更改为changedfile.txt。svn更新/var/www/dev/test/public应该更改为您的路径,等等。啊,我错过了删除*。明天就要测试了。非常感谢。顺便说一句,changedfile.txt是pushLive.txt旁边的另一个文件,只是为了测试脚本是否进入if语句。尝试将svn update path/to/dir更改为path/to/svn update path/to/dirok我未能使用正确的路径。svn update/var/www/dev/test/public对我来说不是svn。相反,svn update/var/www/dev/test/public/myApps是我的svn文件夹。真是个愚蠢的错误。谢谢你的帮助!这对我不起作用。我得到了错误:警告:提交后挂钩失败,退出代码255,没有输出。我在提交后使用chmod+x并重新启动了apache。我添加了line touch changedfile.txt以查看它是否到达循环。它没有得到createdstupid问题:您是否更改了特定设置/文件的代码行?示例*pushLive.txt应更改为changedfile.txt。svn更新/var/www/dev/test/public应该更改为您的路径,等等。啊,我错过了删除*。明天就要测试了。非常感谢。顺便说一句,changedfile.txt是pushLive.txt旁边的另一个文件,只是为了测试脚本是否进入if语句。尝试将svn update path/to/dir更改为path/to/svn update path/to/dirok我未能使用正确的路径。svn update/var/www/dev/test/public对我来说不是svn。相反,svn update/var/www/dev/test/public/myApps是我的svn文件夹。真是个愚蠢的错误。谢谢你的帮助!