在我的项目中,我有一个预推git钩子,可以在每次推送时运行单元测试。
但是当我尝试在另一个分支上推送更改时,单元测试将针对活动分支运行,而不是针对当前推送的分支运行。
例如,如果我尝试从new_feature分支推送更改,而我的工作目录反映了develop分支的结构,则pre-push hook将运行develop分支的单元测试,而不是new_feature。
摆脱这个问题的基本思路是在预推钩中检查当前被推送的分支。但是我不知道如何在钩子中获取有关当前被推送的分支的信息:这些信息不包含在钩子参数中。
答案 0 :(得分:8)
来自githooks
的{{3}}:
Information about what is to be pushed is provided on the hook's standard input
with lines of the form:
<local ref> SP <local sha1> SP <remote ref> SP <remote sha1> LF
For instance, if the command git push origin master:foreign were run the hook would
receive a line like the following:
refs/heads/master 67890 refs/heads/foreign 12345
although the full, 40-character SHA-1s would be supplied.
其中 正是您推送的分支。有了它,您可以在该工作树中结帐并进行测试。
以下是一个示例钩子脚本:
#!/bin/sh
z40=0000000000000000000000000000000000000000
IFS=' '
while read local_ref local_sha remote_ref remote_sha
do
current_sha1=$(git rev-parse HEAD)
current_branch=$(git rev-parse --abbrev-ref HEAD)
if [ "$local_sha" != $z40 ] && [ "$local_sha" != "$current_sha1" ]; then
git checkout $local_sha
# do unit testing...
git checkout $current_branch
fi
done
exit 0
答案 1 :(得分:3)
git 1.8.2, April 2013引入了预推钩(由commit ec55559引入)以及this sample:
此挂钩由“
git push
”调用,可用于防止发生推送 使用两个参数调用钩子,这两个参数提供目标远程的名称和位置,如果未使用命名远程,则两个值都相同。钩子的标准提供了有关推送内容的信息 使用以下形式的行输入:
<local ref> SP <local sha1> SP <remote ref> SP <remote sha1> LF
例如,如果运行命令
+git push origin master:foreign+
,则挂钩将收到如下所示的行:
refs/heads/master 67890 refs/heads/foreign 12345
虽然将提供完整的40个字符的SHA1。
- 如果外国参考文献尚不存在,
<remote SHA1>
将为400
。- 如果要删除引用,则
<local ref>
将以(delete)
提供,<local SHA1>
将为0
。- 如果本地提交是由可以展开的名称以外的其他名称指定的(例如
HEAD~
或SHA1),则会按照最初的提供方式提供。
因此,检查本地引用是否包含正确分支的名称,即“当前被推送的分支”,前提是您在git push
命令中提供相同的名称(即不要单独使用git push
)