通过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 次, 拉取成功

目录
相关文章
|
3月前
|
Python
自动化微信朋友圈:Python脚本实现自动发布动态
本文介绍如何使用Python脚本自动化发布微信朋友圈动态,节省手动输入的时间。主要依赖`pyautogui`、`time`、`pyperclip`等库,通过模拟鼠标和键盘操作实现自动发布。代码涵盖打开微信、定位朋友圈、准备输入框、模拟打字等功能。虽然该方法能提高效率,但需注意可能违反微信使用条款,存在风险。定期更新脚本以适应微信界面变化也很重要。
266 61
|
14天前
|
数据采集 供应链 API
实战指南:通过1688开放平台API获取商品详情数据(附Python代码及避坑指南)
1688作为国内最大的B2B供应链平台,其API为企业提供合法合规的JSON数据源,直接获取批发价、SKU库存等核心数据。相比爬虫方案,官方API避免了反爬严格、数据缺失和法律风险等问题。企业接入1688商品API需完成资质认证、创建应用、签名机制解析及调用接口四步。应用场景包括智能采购系统、供应商评估模型和跨境选品分析。提供高频问题解决方案及安全合规实践,确保数据安全与合法使用。立即访问1688开放平台,解锁B2B数据宝藏!
|
14天前
|
API 开发工具 Python
【Azure Developer】编写Python SDK代码实现从China Azure中VM Disk中创建磁盘快照Snapshot
本文介绍如何使用Python SDK为中国区微软云(China Azure)中的虚拟机磁盘创建快照。通过Azure Python SDK的Snapshot Class,指定`location`和`creation_data`参数,使用`Copy`选项从现有磁盘创建快照。代码示例展示了如何配置Default Azure Credential,并设置特定于中国区Azure的`base_url`和`credential_scopes`。参考资料包括官方文档和相关API说明。
|
2月前
|
存储 缓存 Java
Python高性能编程:五种核心优化技术的原理与Python代码
Python在高性能应用场景中常因执行速度不及C、C++等编译型语言而受质疑,但通过合理利用标准库的优化特性,如`__slots__`机制、列表推导式、`@lru_cache`装饰器和生成器等,可以显著提升代码效率。本文详细介绍了这些实用的性能优化技术,帮助开发者在不牺牲代码质量的前提下提高程序性能。实验数据表明,这些优化方法能在内存使用和计算效率方面带来显著改进,适用于大规模数据处理、递归计算等场景。
82 5
Python高性能编程:五种核心优化技术的原理与Python代码
|
2月前
|
Devops Shell 网络安全
git使用之如何将一套代码同时推送至github|gitee|gitcode|gitlab等多个仓库-含添加ssh-优雅草央千澈完美解决-提供整体提交代码
git使用之如何将一套代码同时推送至github|gitee|gitcode|gitlab等多个仓库-含添加ssh-优雅草央千澈完美解决-提供整体提交代码
110 16
git使用之如何将一套代码同时推送至github|gitee|gitcode|gitlab等多个仓库-含添加ssh-优雅草央千澈完美解决-提供整体提交代码
|
2月前
|
安全 Linux 网络安全
利用Python脚本自动备份网络设备配置
通过本文的介绍,我们了解了如何利用Python脚本自动备份网络设备配置。该脚本使用 `paramiko`库通过SSH连接到设备,获取并保存配置文件。通过定时任务调度,可以实现定期自动备份,确保网络设备配置的安全和可用。希望这些内容能够帮助你在实际工作中实现网络设备的自动化备份。
75 14
|
3月前
|
Python
课程设计项目之基于Python实现围棋游戏代码
游戏进去默认为九路玩法,当然也可以选择十三路或是十九路玩法 使用pycharam打开项目,pip安装模块并引用,然后运行即可, 代码每行都有详细的注释,可以做课程设计或者毕业设计项目参考
89 33
|
3月前
|
JavaScript API C#
【Azure Developer】Python代码调用Graph API将外部用户添加到组,结果无效,也无错误信息
根据Graph API文档,在单个请求中将多个成员添加到组时,Python代码示例中的`members@odata.bind`被错误写为`members@odata_bind`,导致用户未成功添加。
61 10
|
IDE Shell 网络安全
【Git版本控制】使用TortoiseGit一键托管工程代码及版本控制
【Git版本控制】使用TortoiseGit一键托管工程代码及版本控制
322 0
|
10月前
|
数据可视化 开发工具 git
Git【实践 01】使用Git工具托管本地代码到GitHub简单易懂的图文教程(含Git+第三方工具TortoiseGit+中文语言包百度云盘资源)
Git【实践 01】使用Git工具托管本地代码到GitHub简单易懂的图文教程(含Git+第三方工具TortoiseGit+中文语言包百度云盘资源)
152 0