欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

快速git pull更新所有项目文件

程序员文章站 2022-03-10 16:09:40
...

需求分析

故事的开始是这样的,有位搬砖工,名字叫小徐,他所在的公司用的是VMware Horizon 7虚拟桌面环境,软件开发根本连不上外部网络,这让他非常苦恼。

突然有一天,公司内部大变革,要开始使用maven私服,要开始使用内部PaaS,这让小徐心里乐开了花。“可是新知识太多,这该如何学习呢?”小徐泛起了嘀咕。

功夫不负有心人,在小徐的日夜努力中,在一个号称全球最大的同性交友网站上,找到了很多学习资料。小徐在自己查询外部互联网资料的笔记本上,熟练的git clone各种各样的仓库,很快,满满一个硬盘都是这些仓库的文件夹。

时间过的很快,转眼7个月过去了。

技术变化的很快,转眼,满满硬盘的学习资料都过时了,怎么一下子将他们更新呢?

以上就是小徐向我提出了需求。

设计软件
python是世界上最好的语言!????

设计思路很简单,判断当前目录的所有文件夹中,是否其中包含后缀是.git的文件夹,如果是,则为仓库,进行更新,不是就跳过。

其中需要依赖gitpython这个包,来进行git pull操作。

import git
from git import *
import threading
import os

def isGitDir(dir):
    repdir = os.path.join(os.path.abspath('.'), dir)
    repgitdir = os.path.join(repdir, '.git')
    if not os.path.exists(repgitdir):
        return False
    return True
def updateSub(subdir):
    repdir = os.path.join(os.path.abspath('.'), subdir)
    try:
        repo = git.Repo(repdir)
        if repo.is_dirty():
            dirSubDir.append(subdir)
            return
        remote = repo.remote()
        print("start pulling from remote for: %s\r\n" %subdir)
        remote.pull()
        print("Done pulling for %s\r\n" %subdir)
    except NoSuchPathError as e:
        pass
    except InvalidGitRepositoryError as e:
        pass
    finally:
        pass

currDir = os.path.abspath('.')
subDirs = [x for x in os.listdir('.') if isGitDir(x)]
print("ready to update git repo:")
for dir in subDirs:
    print(dir+ '\r\n')
dirSubDir = []
poole = []
for subdir in subDirs:
    t = threading.Thread(target=updateSub,args=(subdir,))
    t.start()
    poole.append(t)
for t in poole:
    t.join(30)

print('\r\n')
if len(dirSubDir)!= 0:
    print('these repos have uncommitted changes:')
    for dirtyDir in dirSubDir:
        print('dir %s has uncommited change, please check' % dirtyDir)

测试投产
打开电脑,在cmd中运行pip install gitpython或者conda install gitpython,来安装必要的包。

将上述文件保存到仓库的目录,并且命名为update.py,右键使用VS Code运行,即可发现目录中所有仓库都成功git pull 了,大成功!