在post-commit subversion hook中获取项目名称

时间:2011-06-18 09:09:45

标签: bash svn svn-hooks

我有一个这样的subversion存储库:

Repo
    ProjectA
        trunk
        branches
        tags
    ProjectB
        trunk
        branches
        tags

我正在尝试编写一个仅适用于一个项目的post-commit钩子脚本,但我刚刚知道它们位于存储库的根目录下。

我得到的唯一两个参数是Repository路径和Revision number。我有什么方法可以为特定项目执行此脚本吗?

谢谢,

解决方案: 终极解决方案是这样的:

#!/bin/bash
REPOS="$1"
REV="$2"
if svnlook changed -r $REV $REPOS | grep ProjectA; then
    echo "do stuff"
fi

3 个答案:

答案 0 :(得分:3)

是的,使用svnlook获取已提交修订中修改的文件列表,然后使用合适的正则表达式对名称进行grep,以确定post-commit的路径是否包含正确位置的项目名称,如果它确实执行了代码,否则,跳转到脚本的末尾并返回0。

答案 1 :(得分:1)

我来到这里寻找Windows 2012 Server上VisualSVN的这个问题的答案。在收集了更多信息之后,我在VisualSVN上提出了一个Windows批处理文件提交后挂钩的解决方案,该解决方案在开发服务器上加载PHP脚本以使特定项目部署到该服务器。 hook命令是一行:

svnlook changed "%1" | findstr /L "ProjectA/trunk/" && powershell -Command "Invoke-WebRequest http://192.168.0.177/checkout_on_commit/checkout_on_commit.php -OutFile $ENV:SYSTEMROOT\Temp\commit.txt" || rem

需要作为一个" no-op"防止Tortoise报告挂钩因未能提交其他项目。导致项目在Linux服务器上部署的checkout_on_commit.php的内容是:

<?php
`date >> checkout.log`;
`svn sw --non-interactive --no-auth-cache --username project_a_readonly --password trytoguess https://svnserver/svn/GroupA/ProjectA/trunk /app/www/ >> checkout.log`;
?>

答案 2 :(得分:0)

在Subversion中不存在像“Project”这样的定义......定义必须由你完成。这意味着Subversion在存储库中的更改上执行该操作而不是在“项目”基础上...

您可以使用您获得的信息(如存储库和修订号)来提取您需要的信息...您只需使用svnlook提取所需信息即可。通过使用适当的参数调用svnlook。