2

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

一开始我是

cd /home/user/working/copy
svn update

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

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

但它仍然无法正常工作。

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

4

8 回答 8

5
#!/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);
}
于 2009-03-30T16:29:14.323 回答
1

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

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

于 2009-03-30T11:17:39.143 回答
1

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

于 2009-03-30T11:28:57.463 回答
1

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

当然,我每次也根据需要运行 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]

一次,然后将提交后挂钩更新为

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

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

于 2015-03-11T02:56:55.757 回答
0

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

于 2009-03-31T13:11:25.960 回答
0

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

我希望这是有道理的:P

于 2009-04-01T23:50:45.573 回答
0

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

于 2010-04-20T14:16:20.573 回答
-3

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

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

于 2009-03-30T12:36:04.273 回答