【问题标题】:svn update not working in post commitsvn update 在提交后不起作用
【发布时间】:2009-03-30 10:08:36
【问题描述】:

我正在尝试实现一个提交后挂钩来更新工作副本。 据我所知,post commit hook 正在运行(我在文件中写了一些东西来验证它)但更新命令没有运行。

一开始是这样的

cd /home/user/working/copy
svn update

但这不起作用,然后我读到您必须提供 svn 的完整路径:

cd /home/user/working/copy
/usr/bin/svn update

但还是失败了。

我将权限更改为 777 并在一个空的环境中运行脚本......它可以工作。

【问题讨论】:

    标签: svn hook post-commit


    【解决方案1】:
    #!/bin/bash
    /usr/bin/svn 更新 /home/user/working/copy

    上面的代码应该作为一个提交后的钩子。

    如果需要,添加 --username 和 --password 选项。

    编辑:

    http://subversion.tigris.org/faq.html#website-auto-update

    执行提交的服务器程序(svnserve 或 apache)与将运行提交后挂钩脚本的程序相同。这意味着该程序必须具有适当的权限才能更新工作副本。

    如果需要更新的“工作副本”由同一用户拥有,那么您无需担心用户名和密码。

    Subversion 常见问题解答建议将 Setuid 与以下 C 程序一起使用。

    #include <stddef.h>
    #include <stdlib.h>
    #include <unistd.h>
    int main(void)
    {
    execl("/usr/local/bin/svn", "svn", "update", "/home/joe/public_html/",
        (const char *) NULL);
    return(EXIT_FAILURE);
    }
    

    【讨论】:

    • 我结账时用户名和密码不是已经存储了吗?
    【解决方案2】:

    工作副本位于用户的主目录中。如果 SVN 服务器以不同的用户身份运行,例如“svnserver”,那么提交后挂钩脚本将作为“svnserver”运行。一个用户不能修改或读取另一个用户的文件是有道理的,除非文件的权限设置允许这样做。

    您不应在多个用户之间共享工作副本。如果你真的必须,那么仅仅为每个用户授予读/写权限是不够的。您还需要确保没有用户创建其他用户无法访问的文件。要实现这一点,您需要为设置正确umask 的svn 命令编写包装脚本,或者让所有相关用户能够通过sudo 充当特定用户。

    【讨论】:

    • 更新工作副本应该由正在使用该工作副本的开发人员发起。每当有人提交时,它不应该自动发生。如果您解释了为什么要尝试自动使工作副本保持最新状态,也许会澄清一些事情。
    • 我们团队中的每个开发人员在他的计算机上都有一个工作副本......我们有一个在线服务器来保存 SVN 服务器,我们希望在同一台服务器上拥有一个开发区,女巫会反映轨道的最新版本。项目经理将使用它来检查最新版本。
    • 如果只有一个用户正在触摸工作副本(即 svn 服务器),那么您的设置应该没问题。只需在工作副本上设置权限,以便 svn 服务器可以更新它。
    • 很抱歉让 *** 感到痛苦,但你能告诉我如何找到 subversion 服务器正在使用的用户...它是简单的 svn 吗?
    • 使用命令“ps -aux | less”列出所有进程。如果存储库 URL 以 svn:// 开头,请查找 svnserve。如果它以 http:// 开头,则查找 apache。使用“/”搜索命令。如果我没记错的话,ps 输出中应该有一个“用户名”列。
    【解决方案3】:

    如果你自己不使用工作副本,你可以chown将工作副本给运行钩子脚本的用户

    【讨论】:

      【解决方案4】:

      我也遇到了同样的问题,并尝试了(包括官方常见问题解答中的那个)所有方法都没有运气

      当然,我每次也会根据需要运行 chmod -R 和 chown -R www-data:www-data。

      在大多数情况下,执行了更新命令,没有权限错误,没有任何其他错误消息,但工作副本没有更新。

      最后,以下步骤对我很有效:

      在提交后的钩子运行中

      export LC_CTYPE=en_US.UTF-8
      cd [/working-copy-folder/] # heading tail slash
      /usr/bin/svn checkout [source path]
      

      一次,然后将 post-commit 挂钩更新为

      export LC_CTYPE=en_US.UTF-8
      cd [/working-copy-folder/]
      /usr/bin/svn update
      

      现在它正在工作,我太累了,无法找到根本原因。 一整天都在'svn update'上

      【讨论】:

        【解决方案5】:

        我得到的最终解决方案是我得到的一些答案。 我的服务器让 apache 以无人身份运行,所以我将工作副本设置为无人拥有并在用户名组中,然后将其 chmod 为 775。 这样钩子就会起作用,并且用户名也将有权通过 FTP 更新文件。

        【讨论】:

          【解决方案6】:

          wcoenen 的答案绝对是正确的。解决此问题的最简单方法是将 SVN 用户添加到您的组中。假设您的提交后挂钩由用户 someUser 和组 someUser 拥有。将 SVN 服务器添加到 someUser 组,并将您的提交后挂钩脚本更改为组可执行,将解决您的问题。

          我希望这是有道理的:P

          【讨论】:

            【解决方案7】:

            这个脚本更好,因为它只更新需要的文件... http://vidax.net/blog/en/2010/03/subversion-post-commit-hook/

            【讨论】:

              【解决方案8】:

              我相信 post-commit 实际上是在提交可见之前运行的。这很奇怪,但是假设您提交了修订版 30。提交后仍然会将 29 视为最新修订版。提交后脚本完成后,您将看到 30 作为 head revision。

              我可能是错的。这完全来自记忆。至少可以尝试一下。

              【讨论】:

              • 那将是预提交挂钩。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-10-06
              • 1970-01-01
              • 1970-01-01
              • 2015-10-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多