git pre-push钩子,如果是--tags,则不要运行

6
我有一个prepush钩子来测试我的代码,但是当我执行git push --tags时它也会运行。有没有办法避免这种情况发生?
也许有一些方法可以检查是否是普通的推送还是--tags推送吗? 更新 - 这些是我能找到的唯一参数: $1是远程名称 $2是正在进行推送的URL
4个回答

7
我有一个解决方案,但它非常笨拙。一段时间以前,我设置了一个预提交挂钩,以防止我在文件已暂存时意外使用-a。我的解决方案是读取调用原始git命令的命令(可能只在Linux上有效)。
while read -d $'\0' arg ; do
    if [[ "$arg" == '--tags' ]] ; then
        exit 0
    fi
done < /proc/$PPID/cmdline
# and perform your check here

原始

话虽如此,在钩子中尝试调用env; git设置了一些额外的变量(以GIT_为前缀,例如GIT_INDEX_FILE)。


调用 env 没有起作用,但脚本正是我所需要的。谢谢! - gxc

3

在你不想运行任何东西之前,你可以将它放在推送钩子中:

# If pushing tags, don't test anything.
grep "refs/tags/" < /dev/stdin > /dev/null
if [ "$?" -eq "0" ] ; then
    exit 0
fi

如果标准输入的第一行是一个标签,它将退出0并推送。这并不完美,因为如果您同时推送标签和分支,它可能会先看到标签,而不运行钩子的其余部分。但在大多数情况下,它都能正常工作。

grep 命令检查任何行,而不仅仅是第一行,但是,如果您推送标签和分支,则其余脚本仍将被跳过,这部分是正确的。 - glen

2
您正在寻找 --no-verify 标志。因此:
git push --tags --no-verify

这是关于这个标志的git help push告诉你的内容:
       --[no-]verify
           Toggle the pre-push hook (see githooks(5)). The default is --verify, giving the hook a chance to prevent the push.
           With --no-verify, the hook is bypassed completely.

2
您可以使用环境变量来控制它:

#.git/hooks/pre-push
if [[ $SKIP_HOOKS ]]; then
    exit 0
fi
# do things you want...

然后运行以下命令:

SKIP_HOOKS=true git push --tags

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接