我想编写一个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
如果我正确理解documentation,post-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,但它会为工作树提供正确的数据。
答案 0 :(得分:1)
如果你唯一感兴趣的是requirements.txt
文件,则不需要查看完整的工作目录。您只需将该文件直接转储到挂钩
git cat-file -p ${newrev}:<path>/requirementstxt