Git:如何检查预推钩中当前推动的分支?

时间:2013-11-18 10:21:41

标签: git githooks

在我的项目中,我有一个预推git钩子,可以在每次推送时运行单元测试。

但是当我尝试在另一个分支上推送更改时,单元测试将针对活动分支运行,而不是针对当前推送的分支运行。

例如,如果我尝试从new_feature分支推送更改,而我的工作目录反映了develop分支的结构,则pre-push hook将运行develop分支的单元测试,而不是new_feature。

摆脱这个问题的基本思路是在预推钩中检查当前被推送的分支。但是我不知道如何在钩子中获取有关当前被推送的分支的信息:这些信息不包含在钩子参数中。

2 个答案:

答案 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>将为40 0
  •   
  • 如果要删除引用,则<local ref>将以(delete)提供,<local SHA1>将为0
  •   
  • 如果本地提交是由可以展开的名称以外的其他名称指定的(例如HEAD~或SHA1),则会按照最初的提供方式提供。
  •   

因此,检查本地引用是否包含正确分支的名称,即“当前被推送的分支”,前提是您在git push命令中提供相同的名称(即不要单独使用git push