如何强制 git submodule update --init 跳过错误

如何强制 git submodule update --init 跳过错误

我的文件夹中有我正在处理的活动项目,所有这些项目都以 git 子模块的形式进行版本控制。当我设置新的工作环境时,我会使用--recursive( 克隆我的文件夹,或者正常克隆它然后执行git submodule update --init --recursive。就像链接腐烂一样,有时会出现 git 远程存储库腐烂(或者服务器可能已关闭)。在这些情况下,我只想初始化/更新可用的存储库。但是,git 会在遇到第一个问题时停止更新:

Cloning into 'dir/name'...
Connection closed by remote.host
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
Clone of '[email protected]:path/to.git' into submodule path 'dir/name' failed

这个过程就停止了。

我怎样才能强制 git 忽略此类错误并继续下一个子模块?

答案1

我不知道有什么标志可以让 git 忽略此类错误,所以我编写了一个 Python 脚本,可以实现(大致)相同的功能。您可以将其放在主项目的目录中。

#!/usr/bin/python

import os


PROJECT_ROOT = os.path.dirname(os.path.realpath(__file__))


def main():
    # The following command may fail
    os.system('cd {} && git submodule update --init --recursive'.format(PROJECT_ROOT))

    # In case the above command failed, also go through all submodules and update them individually
    for root, dirs, files in os.walk(PROJECT_ROOT):
        for filename in files:
            if filename == '.gitmodules':
                with open(os.path.join(root, filename), 'r') as gitmodules_file:
                    for line in gitmodules_file:
                        line = line.replace(' ', '')
                        if 'path=' in line:
                            submodule = line.replace('path=', '')
                            os.system('cd {} && git submodule init {}'.format(root, submodule))
                            os.system('cd {} && git submodule update {}'.format(root, submodule))


if __name__ == '__main__':
    main()

答案2

这一页我找到了一种从 中排除子模块的方法submodule update。假设模块是dir/name。那么除此模块之外的所有子模块的递归 update-init 命令将如下所示

git -c submodule.dir/name.update=none submodule update --init --recursive

这不会自动跳过不可预见的错误,但如果您知道某个特定的子模块不会更新,它就可以正常工作。

相关内容