git pre-push:运行测试时由远程主机关闭的连接

时间:2015-10-13 18:09:20

标签: git testing githooks

我的git仓库中有一个预推脚本运行测试。如果测试通过,那么继续推进。如果测试失败,则中止推送。

脚本运行一段时间,直到测试开始超过3分钟。 stdout显示"连接到bitbucket由远程主机关闭"在测试输出的中间。然后所有的测试都通过了,推动实际上并没有通过。

这是推送前脚本

        btn3GOon.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            try {
                setMobileDataEnabled(null, false);
            } catch(Exception e){
                e.printStackTrace();
            }
        }                                               
    });
}       
    private void setMobileDataEnabled(Context context, boolean enabled) throws Exception {
        final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        final Class conmanClass = Class.forName(conman.getClass().getName());
        final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
        iConnectivityManagerField.setAccessible(true);
        final Object iConnectivityManager = iConnectivityManagerField.get(conman);
        final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
        final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
        setMobileDataEnabledMethod.setAccessible(true);

        setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled);
    }

3 个答案:

答案 0 :(得分:2)

  

答案应该说明为什么git试图到达Gitlab或Bitbucket或其他任何东西(在我的情况下为Gitlab),即使预推脚本尚未完成

commit ec55559, Jan. 2013, Git v1.8.2-rc0引入了pre-push钩子

它是as/pre-push-hook补丁的一部分:

请参见commit 87c86ddcommit ec55559commit 5a7da2dAaron Schrab (aschrab)(2013年1月13日)。 (由Junio C Hamano -- gitster --commit bb9a696中合并,2013年1月24日)

commit af65f68Clemens Buchacher (drizzd)进行了唯一的其他修改,Jeff King -- peff --忽略了SIGPIPE,这意味着忽略了它 标准输入流。 (由commit 40fdcc5documentation does include中合并,2015年12月1日)

transport.c

  

有关钩子标准的信息,请参见   用以下形式的行输入:

<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>将为40 0
  •   

为了确定远程SHA1的正确值,Here必须与远程存储库(在您的情况下为GitLab)进行交换

答案 1 :(得分:1)

我最终在成功案例中调用了git push --no-verify。所以它有效地推了两次。

#!/bin/sh
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )

# This script runs tests before any push to the MASTER branch and fails
current_branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
echo "Current branch: "$current_branch
if [ $current_branch = "master" ]
then
    echo "Pushing to MASTER branch requires tests to pass..."
    ./run.sh test
    if [ $? = 0 ]
    then
        # workaround to guarantee my push goes through even if the first attempt times out
        git push --no-verify
        exit 0
    else
        echo "***ERROR> Failed to pass tests! Get tests to pass and then try again..."
        exit 1
    fi
else
    echo "Skipping tests since we're not pushing to MASTER..."
fi

答案 2 :(得分:0)

您检查了bitbucket.properties吗?也许你会遇到一些超时,例如:process.timeout.executionplugin.bitbucket-scm-git.backend.timeout.idle。可能需要快速检查是否有一些设置为180秒的超时。 Here您可以找到有关可用属性的更多详细信息。