- 主要功能
- 先上图
- 关键代码:
- 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是否不一致(是否远程有更新),通过:
- git remote -v update
是更新Remote version信息(不会改变本地)
-
git rev-parse @
查看本地Local 当前branch Head的版本(hash值)
@ 代表current branch,HEAD
-
git rev-parse @{u}
查看远端Remote 目前Head的版本(hash值)
@{u} 代表 upstream branch
如果第2/3步得到的local和remote版本不一致,证明remote/local有更新,如果一致,则local/remote处在最新状态,不需要update:
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安装及使用(安装测试+实例演示)
友情赞助
如果你觉得博主的文章对你那么一点小帮助,恰巧你又有想打赏博主的小冲动,那么事不宜迟,赶紧扫一扫,小额地赞助下,攒个奶粉钱,也是让博主有动力继续努力,写出更好的文章-,感谢~。
- 支付宝
- 微信



