通过Python脚本git pull 自动重试拉取代码

简介: 通过Python脚本git pull 自动重试拉取代码

【需求】
由于网络等原因,拉取GitHub 仓库代码失败, 自动重试拉取

【脚本】


# -*- coding: utf-8 -*-
#!/usr/bin/python3

"""
pip3 install pexpect
"""

import pexpect
import os
import sys

time = 1
username = 'infuq'
password = 'qwert#123'


def retry():
    global time
    print('invoke retry %s time' % time)
    time = time + 1

    # 进入到仓库目录
    os.chdir('/home/infuq/Repository/infuq-others')

    # 执行拉取
    spawner = pexpect.spawn('git pull', encoding='utf-8')
    spawner.logfile = sys.stdout

    try:
        i = spawner.expect(['Already up to date', 'Username']) # ,timeout = 10

        # 不需要输入用户名和密码的场景
        if i == 0:
            spawner.close()
            return

        # 需要输入用户名和密码的场景
        elif i == 1:
            # 输入用户名
            spawner.sendline(username)
            i = spawner.expect(['Password']) # ,timeout = 10
            if i == 0:
                # 输入密码
                spawner.sendline(password)
                i = spawner.expect(pexpect.EOF)
                if i == 0:
                    spawner.close()

                    status = spawner.status
                    exit_status = spawner.exitstatus
                    signal_status = spawner.signalstatus
                    # 正常退出场景
                    if exit_status == 0:                        
                        return
                    else:
                        # 异常退出场景, 重试
                        retry()
                else:
                    # 异常退出场景, 重试
                    retry()
            else:
                # 未出现输入密码的提示, 重试
                retry()
        else:
            # 未出现输入用户名的提示, 重试
            retry()
    except Exception:
        # 出现异常, 重试
        retry()

if __name__ == '__main__':
    retry()

【执行脚本】

[infuq tmp]# python3 retry_pull.py
invoke retry 1 time
fatal: unable to access 'https://github.com/infuq/infuq-others.git/': gnutls_handshake() failed: The TLS connection was non-properly terminated.
invoke retry 2 time
fatal: unable to access 'https://github.com/infuq/infuq-others.git/': Empty reply from server
invoke retry 3 time
invoke retry 4 time
invoke retry 5 time
invoke retry 6 time
invoke retry 7 time
invoke retry 8 time
invoke retry 9 time
invoke retry 10 time
invoke retry 11 time
invoke retry 12 time
invoke retry 13 time
invoke retry 14 time
fatal: unable to access 'https://github.com/infuq/infuq-others.git/': gnutls_handshake() failed: The TLS connection was non-properly terminated.
invoke retry 15 time
fatal: unable to access 'https://github.com/infuq/infuq-others.git/': gnutls_handshake() failed: The TLS connection was non-properly terminated.
invoke retry 16 time
invoke retry 17 time
invoke retry 18 time
invoke retry 19 time
invoke retry 20 time
invoke retry 21 time
invoke retry 22 time
invoke retry 23 time
invoke retry 24 time
invoke retry 25 time
invoke retry 26 time
fatal: unable to access 'https://github.com/infuq/infuq-others.git/': Empty reply from server
invoke retry 27 time
invoke retry 28 time
fatal: unable to access 'https://github.com/infuq/infuq-others.git/': Empty reply from server
invoke retry 29 time
invoke retry 30 time
invoke retry 31 time
invoke retry 32 time
invoke retry 33 time
invoke retry 34 time
invoke retry 35 time
invoke retry 36 time
invoke retry 37 time
invoke retry 38 time
invoke retry 39 time
invoke retry 40 time
invoke retry 41 time
invoke retry 42 time
Username for 'https://github.com': infuq
infuq
Password for 'https://infuq@github.com': qwert#123

remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)
Unpacking objects: 100% (3/3), done.
From https://github.com/infuq/infuq-others
   4058745..fd0bc40  master     -> origin/master
Updating 4058745..fd0bc40
Fast-forward
 README.md | 1 -
 1 file changed, 1 deletion(-)

自动重试了 42 次, 拉取成功

目录
相关文章
|
开发工具 git
使用Git根据日期进行代码版本切换的方法
通过以上步骤,可以有效地根据日期进行Git代码版本的切换。这种方法在需要回溯历史版本进行bug修复或功能复查时特别有用。Git的灵活性和强大功能使其成为现代软件开发不可或缺的工具之一。
1143 103
|
测试技术 Python
Python装饰器:为你的代码施展“魔法”
Python装饰器:为你的代码施展“魔法”
465 100
|
Python
Python的简洁之道:5个让代码更优雅的技巧
Python的简洁之道:5个让代码更优雅的技巧
505 104
|
开发者 Python
Python列表推导式:一行代码的艺术与力量
Python列表推导式:一行代码的艺术与力量
726 95
|
开发者 Python
Python神技:用列表推导式让你的代码更优雅
Python神技:用列表推导式让你的代码更优雅
815 99
|
缓存 Python
Python装饰器:为你的代码施展“魔法
Python装饰器:为你的代码施展“魔法
687 88
|
监控 机器人 编译器
如何将python代码打包成exe文件---PyInstaller打包之神
PyInstaller可将Python程序打包为独立可执行文件,无需用户安装Python环境。它自动分析代码依赖,整合解释器、库及资源,支持一键生成exe,方便分发。使用pip安装后,通过简单命令即可完成打包,适合各类项目部署。
2219 68
|
人工智能 数据挖掘 数据处理
揭秘Python编程之美:从基础到进阶的代码实践之旅
【9月更文挑战第14天】本文将带领读者深入探索Python编程语言的魅力所在。通过简明扼要的示例,我们将揭示Python如何简化复杂问题,提升编程效率。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往高效编码世界的大门。让我们开始这段充满智慧和乐趣的Python编程之旅吧!
|
机器学习/深度学习 Python
时间序列特征提取:从理论到Python代码实践
时间序列是一种特殊的存在。这意味着你对表格数据或图像进行的许多转换/操作/处理技术对于时间序列来说可能根本不起作用。
895 1
时间序列特征提取:从理论到Python代码实践
|
机器学习/深度学习 数据采集 人工智能
探索机器学习:从理论到Python代码实践
【10月更文挑战第36天】本文将深入浅出地介绍机器学习的基本概念、主要算法及其在Python中的实现。我们将通过实际案例,展示如何使用scikit-learn库进行数据预处理、模型选择和参数调优。无论你是初学者还是有一定基础的开发者,都能从中获得启发和实践指导。
383 2

推荐镜像

更多