栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python Git: 定时监测SubModule远端更新并自动Pull+Push

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python Git: 定时监测SubModule远端更新并自动Pull+Push

Python Git: 定时监测SubModule远端更新并自动Pull+Push
  • 主要功能
  • 先上图
  • 关键代码:
    • 1. 检查Remote是否更新: isRemoteModified_Submodule()
    • 2. 自动更新: autoUpdate()
    • 3. 定时任务: doPeriodicFunction()
  • 完整代码
  • 博主热门文章推荐:
  • 友情赞助

主要功能

定时检测Repo所有的Submodule Remote是否有更新,如果有更新就pull submodule ,然后commit + push提交到Parent branch,保持Parent branch也是最新状态。

先上图

Case 1: 检测到Remote有更新时:pull+push

更新后,Remote Parent branch 的submodule 既update到最新:

Case 2: Remote没有更新时,无操作:

运行后定时检测,如果发现Remote有更新,则自动pull submodule并push:

关键代码: 1. 检查Remote是否更新: isRemoteModified_Submodule()

只需要通过rev-parse检查下Remote 和local 的版本,如果不一致,说明remote有更新了 (因为这里local branch始终不会有操作)


def isRemoteModified_Submodule(smName):
    cmd = 'git rev-parse @:' + smName
    localRev = executeGitCmd(cmd)

    # In SubModule folder check remote rev
    os.chdir(smName)
    switchToBranch(BRANCH_NAME_DEV)

    cmd = 'git remote -v update'
    ret = executeGitCmd(cmd)

    cmd = 'git rev-parse @{u}'
    remoteRev = executeGitCmd(cmd)

    os.chdir("../")

    print(smName + " Local is: " + localRev)
    print(smName + " Remote is: " + remoteRev)

    if localRev == remoteRev:
        return False
    else:
        return True

其中,
Git检测local和remote是否不一致(是否远程有更新),通过:

  1. git remote -v update
    是更新Remote version信息(不会改变本地)

  1. git rev-parse @
    查看本地Local 当前branch Head的版本(hash值)
    @ 代表current branch,HEAD

  2. git rev-parse @{u}
    查看远端Remote 目前Head的版本(hash值)
    @{u} 代表 upstream branch

如果第2/3步得到的local和remote版本不一致,证明remote/local有更新,如果一致,则local/remote处在最新状态,不需要update:

2. 自动更新: autoUpdate()

Check所有的SubModule,如果发现有需要Update的(Submodule Remote有更新),则调用pullSubModule ,同时commit + Push 到Parent branch。

这样Parent branch的submodule也保持同步了:

def autoUpdate():
    switchToBranch(BRANCH_NAME_TARGET)

    status_hon = checkSubmodule(SUBMODULE_NAME_1)
    status_fw  = checkSubmodule(SUBMODULE_NAME_2)

    if (status_fw == True) or (status_hon == True):
        print(">>> start push to remote...")

        cmd = 'git commit -a -m "Auto Merge smb or honeycomb change by Tools"'
        ret = executeGitCmd(cmd)
        print(ret)

        cmd = 'git push "origin" ' + BRANCH_NAME_TARGET
        ret = executeGitCmd(cmd)
        print(ret)
3. 定时任务: doPeriodicFunction()

通过threading.Timer创建定时器执行check task,如果remote有更新,则自动Udate并push,同时计算执行次数。。

def doPeriodicFunction(count):
    print('>>> Auto checking periodically, run times:')
    count+=1
    print(count)
    autoUpdate()

    global timer
    timer = threading.Timer(RUN_PERIODIC_SECOND, doPeriodicFunction, (count,))
    timer.start()
完整代码
import os
import threading
from threading import Timer

# File: RunGitAutoUpdate_forBlog.py
# Author: HowardXue https://howiexue.blog.csdn.net/

BRANCH_NAME_TARGET = "xxxxxxxx"
BRANCH_NAME_DEV = "xxxxxxxx"

SUBMODULE_NAME_1 = "xxxx"
SUBMODULE_NAME_2 = "xxxx"

# check periodic in seconds
RUN_PERIODIC_SECOND = 60*5

def executeGitCmd(cmd):
    try:
        result = os.popen(cmd)
        rstStr = result.read()
        # print(rstStr)
    except:
        print("Error occured when executeGitCmd")

    return rstStr


def switchToBranch(branchName):
    cmd = 'git symbolic-ref --short HEAD'
    # check if already in this branch
    currentBranch = executeGitCmd(cmd)
    if currentBranch == (branchName+"n"):
        return
    else:
        # switch to branch
        print("switch to branch: " + branchName)
        cmd = 'git checkout ' + branchName
        ret = executeGitCmd(cmd)
        print(ret)




def isRemoteModified_Submodule(smName):
    cmd = 'git rev-parse @:' + smName
    localRev = executeGitCmd(cmd)

    # In SubModule folder check remote rev
    os.chdir(smName)
    switchToBranch(BRANCH_NAME_DEV)

    cmd = 'git remote -v update'
    ret = executeGitCmd(cmd)

    cmd = 'git rev-parse @{u}'
    remoteRev = executeGitCmd(cmd)

    os.chdir("../")

    print(smName + " Local is: " + localRev)
    print(smName + " Remote is: " + remoteRev)

    if localRev == remoteRev:
        return False
    else:
        return True

def pullSubModule(smName):
    os.chdir(smName)
    switchToBranch(BRANCH_NAME_DEV)

    cmd = 'git pull --progress -v --no-rebase "origin" '+ BRANCH_NAME_DEV
    ret = executeGitCmd(cmd)
    print(ret)
    os.chdir("../")



def doPeriodicFunction(count):
    print('>>> Auto checking periodically, run times:')
    count+=1
    print(count)
    autoUpdate()

    global timer
    timer = threading.Timer(RUN_PERIODIC_SECOND, doPeriodicFunction, (count,))
    timer.start()

def checkSubmodule(smName):
    result = isRemoteModified_Submodule(smName)
    if result == True:
        print(">>> remote submodule: " + smName + " changed !, start pull...")
        pullSubModule(smName)
    else:
        print(">>> remote submodule: "+smName+" Not changed...")
    return result

def autoUpdate():
    switchToBranch(BRANCH_NAME_TARGET)

    status_hon = checkSubmodule(SUBMODULE_NAME_1)
    status_fw  = checkSubmodule(SUBMODULE_NAME_2)

    if (status_fw == True) or (status_hon == True):
        print(">>> start push to remote...")

        cmd = 'git commit -a -m "Auto Merge smb or honeycomb change by Tools"'
        ret = executeGitCmd(cmd)
        print(ret)

        cmd = 'git push "origin" ' + BRANCH_NAME_TARGET
        ret = executeGitCmd(cmd)
        print(ret)



def main():
    print('>>> Auto Git Merge Tool start... n')
    doPeriodicFunction(0)



if __name__ == '__main__':
    main()



博主热门文章推荐:

一篇读懂系列:

  • 一篇读懂无线充电技术(附方案选型及原理分析)
  • 一篇读懂:Android/iOS手机如何通过音频接口(耳机孔)与外设通信
  • 一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)

LoRa Mesh系列:

  • LoRa学习:LoRa关键参数(扩频因子,编码率,带宽)的设定及解释
  • LoRa学习:信道占用检测原理(CAD)
  • LoRa/FSK 无线频谱波形分析(频谱分析仪测试LoRa/FSK带宽、功率、频率误差等)

网络安全系列:

  • ATECC508A芯片开发笔记(一):初识加密芯片
  • SHA/HMAC/AES-CBC/CTR 算法执行效率及RAM消耗 测试结果
  • 常见加密/签名/哈希算法性能比较 (多平台 AES/DES, DH, ECDSA, RSA等)
  • AES加解密效率测试(纯软件AES128/256)–以嵌入式Cortex-M0与M3 平台为例

嵌入式开发系列:

  • 嵌入式学习中较好的练手项目和课题整理(附代码资料、学习视频和嵌入式学习规划)
  • IAR调试使用技巧汇总:数据断点、CallStack、设置堆栈、查看栈使用和栈深度、Memory、Set Next Statement等
  • Linux内核编译配置(Menuconfig)、制作文件系统 详细步骤
  • Android底层调用C代码(JNI实现)
  • 树莓派到手第一步:上电启动、安装中文字体、虚拟键盘、开启SSH等
  • Android/Linux设备有线&无线 双网共存(同时上内、外网)

AI / 机器学习系列:

  • AI: 机器学习必须懂的几个术语:Lable、Feature、Model…
  • AI:卷积神经网络CNN 解决过拟合的方法 (Overcome Overfitting)
  • AI: 什么是机器学习的数据清洗(Data Cleaning)
  • AI: 机器学习的模型是如何训练的?(在试错中学习)
  • 数据可视化:TensorboardX安装及使用(安装测试+实例演示)

友情赞助

如果你觉得博主的文章对你那么一点小帮助,恰巧你又有想打赏博主的小冲动,那么事不宜迟,赶紧扫一扫,小额地赞助下,攒个奶粉钱,也是让博主有动力继续努力,写出更好的文章-,感谢~。

  1. 支付宝
        

  1. 微信
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/302759.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号