有什么方法可以并行执行git submodule foreach命令,类似于--jobs 8参数与git submodule update一起工作的方式吗?

例如,我们从事的项目之一涉及将近200个子组件(子模块),并且我们大量使用foreach命令对其进行操作。我想加快他们的速度。

PS:在解决方案涉及脚本的情况下,我在Windows上工作,并且大多数时候使用git-bash。

最佳答案

我为您提出了一个基于解释性语言多平台(如Python)的解决方案。

进程启动器

首先,您需要定义一个类来管理启动命令的过程。

class PFSProcess(object):
    def __init__(self, submodule, path, cmd):
        self.__submodule = submodule
        self.__path = path
        self.__cmd = cmd
        self.__output = None
        self.__p = None

    def run(self):
        self.__output = "\n\n" + self.__submodule + "\n"
        self.__p = subprocess.Popen(self.__cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True,
                             cwd=os.path.join(self.__path, self.__submodule))
        self.__output += self.__p.communicate()[0].decode('utf-8')
        if self.__p.communicate()[1]:
            self.__output += self.__p.communicate()[1].decode('utf-8')
        print(self.__output)

多线程

下一步是生成多线程执行。 Python的核心包含非常强大的库,可与Threads一起使用。您可以使用它导入以下软件包:

import threading

在创建线程之前,您需要创建一个工作器,一个为每个线程调用的函数:

def worker(submodule_list, path, command):
    for submodule in submodule_list:
        PFSProcess(submodule, path, command).run()

如您所见,工作人员将获得一个子模块列表。为了清楚起见,并且由于它不在我们的讨论范围内,因此建议您查看.gitmodules,从中可以生成读取文件的子模块列表。

Tip

然后将子模块列表分成所需的作业块:

num_jobs = 8

i = 0
for submodule in submodules:
    submodule_list[i % num_jobs].append(submodule)
    i += 1

最后,将每个块(作业)分配给每个线程,然后等待所有线程完成:

for i in range(num_jobs):
    t = threading.Thread(target=worker, args=(list_submodule_list[i], self.args.path, self.args.command,))
    self.__threads.append(t)
    t.start()

for i in range(num_jobs):
    self.__threads[i].join()

显然,我已经介绍了基本概念,但是您可以访问GitHub中的parallel_foreach_submodule (PFS)项目的完整实现。

关于git - 并行执行 "git submodule foreach",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49999354/

10-11 07:49