使用gitmodules文件自动增加子分支

前言

最近使用git,遇到了下载zip后子仓库未正确拉取的情况.
查了一圈发现只能使用git clone,十分不友好,因此写了个脚本,基于.gitmodules自动把子仓库拉取下来.

代码

使用前要先git init初始化仓库

import os
import subprocess


def read_gitmodules():
    gitmodules_path = ".gitmodules"
    if not os.path.exists(gitmodules_path):
        print(f"文件 {gitmodules_path} 不存在。")
        return []

    with open(gitmodules_path, "r", encoding="utf-8") as file:
        content = file.read()

    return content


def parse_gitmodules(content):
    submodules = []
    lines = content.splitlines()
    submodule = {}
    for line in lines:
        line = line.strip()
        if line.startswith("[") and line.endswith("]"):
            submodule["name"] = line[1:-1]
        elif line.startswith("path = "):
            submodule["path"] = line.split(" = ")[1]
        elif line.startswith("url = "):
            submodule["url"] = line.split(" = ")[1]
        elif line.startswith("branch = "):
            submodule["branch"] = line.split(" = ")[1]
            # 通常branch作为最后一个字段,追加到上一个submodules列表中
            submodules[-1]["branch"] = submodule["branch"]
            submodule = {}

        if submodule and "path" in submodule and "url" in submodule:
            submodules.append(submodule)
            submodule = {}
    return submodules


def add_submodules(submodules):
    for submodule in submodules:
        if submodule:
            print(submodule)
            name = submodule["name"]
            path = submodule["path"]
            url = submodule["url"]
            branch = submodule.get("branch", None)
            if branch:
                print(f"添加子模块: {path} ({url} {branch})")
                try:
                    subprocess.run(
                        [
                            "git",
                            "submodule",
                            "add",
                            "-b",
                            branch,
                            url,
                            path,
                        ]
                    )
                except Exception as e:
                    print(f"添加子模块: {name} 失败: {e}")
            else:
                print(f"添加子模块: {path} ({url})")
                try:
                    subprocess.run(["git", "submodule", "add", url, path])
                except Exception as e:
                    print(f"添加子模块: {name} 失败: {e}")


if __name__ == "__main__":
    content = read_gitmodules()
    submodules = parse_gitmodules(content)
    add_submodules(submodules)

posted @ 2025-04-22 10:15  USTHzhanglu  阅读(30)  评论(0)    收藏  举报