【问题标题】:How to access to repository file with GIT in post-receive hook如何在接收后挂钩中使用 GIT 访问存储库文件
【发布时间】:2011-11-20 12:10:10
【问题描述】:

我在 GIT 中遇到过这种情况:

我想在推送中更改特定文件时对其“做某事”。 例如,如果 .sql 文件发生更改,则必须将其转储到数据库中。

我在 GIT 中使用 'post-receive' 挂钩,声明如下:

DUMP=$(git diff-tree --name-only -r -z master dump.sql);

if [ -n "$DUMP" ]; then
  // using the new dump.sql
fi

如何访问刚刚从钩子中推送的新dump.sql?

【问题讨论】:

    标签: git git-post-receive


    【解决方案1】:

    您可以使用以下方法从修订版 $rev 中检索文件 dump.sql:

    git cat-file blob $rev:dump.sql
    

    除了推送 master 之外,还调用 post-receive 挂钩...希望您在某处检查您正在处理更新的 master ref。作为风格问题,我会使用传递给钩子的新修订值,而不是直接从钩子中引用 master。

    通常我会这样写一个 post-receive 钩子:

    while read oldrev newrev refname; do
        if [ "$refname" = "refs/heads/master" ]; then
            # definitely updating master; $oldrev and $newrev encompass the changes
            if git diff-tree --name-only -r -z $oldrev $newrev dump.sql; then
                # dump.sql changed...
            fi
        fi
    done
    

    重要的是,这还可以处理一次推送,一次将多个提交发送到 master --- 您在问题中显示的命令只查看了 master 上的最后一次提交。

    【讨论】:

    • 非常感谢!有没有办法确保更新的“分支”是主分支而不是任何其他分支?
    • @Randomize post-receive 钩子在标准输入上传递了一些信息...我将通过编辑答案来说明,它会更具可读性
    • 哇!再次感谢!最后一个问题:谷歌搜索我发现关于编写钩子的文档太笼统了。你知道有什么好的网站或书籍可以正确解释如何编写钩子、定义环境变量等吗?
    • 我不知道除了 githooks 手册页之外的任何文档,它是标准参考文档的一部分。老实说,我主要是通过查看示例来了解它们的——post-receive 和 pre-receive 是最受欢迎的,因为它们被用作其他系统所具有的服务器端触发器的等价物。所以像 post-receive-email 和各种访问控制 pre-receive 脚本这样的例子很有用。
    • 应该有:if git diff-tree --name-only -r -z $oldrev $newrev -- dump.sql; then 否则你可能会得到“致命的:不明确的参数...”错误。
    猜你喜欢
    • 2012-05-17
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 2011-03-28
    • 2011-04-15
    相关资源
    最近更新 更多