如何在post-receive钩子中使用GIT访问存储库文件

时间:2011-11-20 12:10:11

标签: git git-post-receive

我在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?

1 个答案:

答案 0 :(得分:7)

您可以使用以下命令从版本$ rev检索文件dump.sql:

git cat-file blob $rev:dump.sql

除了推送主人之外,还会调用post-receive hook ...希望你在某个地方检查你正在处理更新的主参考。作为一种风格问题,我使用传递给钩子的新修订版值,而不是直接从钩子中引用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上的最后一次提交。