githook基于工作树在推送上执行操作

时间:2014-10-12 11:11:55

标签: git githooks

我想编写一个githook,当远程存储库收到推送时,从存储库工作树中读取信息,并根据它可以找到的数据执行操作。如果在此钩子期间发生任何故障,应该拒绝推送!当然,这只适用于非裸存储库。

我发现update挂钩非常适合调用它的时间。我现在唯一的问题是我无法从update钩子检出最新的参考,因为它尚未集成。

#!/bin/sh
# .git/hooks/update
refname="$1"
if [ "$refname" == "refs/heads/master" ]; then
    newrev="$3"
    git checkout "$newrev"
    # ... read from the tree and perform additional actions
fi

我(奇怪地)收到此错误消息:

remote: error: Your local changes to the following files would be overwritten by checkout:
remote:         somefile

如果我正确理解documentationpost-update将允许我进行结帐,但允许我拒绝推送。有办法吗?


更新:我刚刚尝试使用post-update并从中运行git -C .. checkout master,但我得到了

remote: fatal: Not a git repository: '.'

即使我将完整路径传递给非裸远程存储库,它也表示它不是git存储库。这是为什么? Git是否阻止在钩子内部进行非裸操作?

更新:没关系,我发现了。如果设置了Git,它将始终使用GIT_DIR(即使它是空的)。 原始问题仍然存在

# Procedure that will allow us to use git on a non-bare
# basis. If GIT_DIR is set, git will always use this directory
# instead of any other (cwd or passed via git -C ...)
git()
{
    unset GIT_DIR
    env git $*
}

更新:您似乎已经可以结帐$newrev,但它尚未集成。不幸的是,这将创建一个分离的HEAD,但它会为工作树提供正确的数据。

1 个答案:

答案 0 :(得分:1)

如果你唯一感兴趣的是requirements.txt文件,则不需要查看完整的工作目录。您只需将该文件直接转储到挂钩

即可
git cat-file -p ${newrev}:<path>/requirementstxt