从repo仓库提取git裸仓库

背景

公司从供应商获取到的sdk,解压出来后,里面是repo管理的源码仓库集合。但是我们要将这些仓库上传到我们自己的服务器进行管理。然而这个repo仓库不是mirror仓库。所以需要将里面的git按照原sdk来提取出来。因此写了这个脚本用来从sdk里面提取所有的裸仓库。

原理

  1. 根据.repo目录里面project.list获取到所有的git仓库路径。
  2. 再到.repo目录里面的manifest.xml里面找到对应的git路径。
  3. 然后用git clone --bare xxx提取出裸仓库到对应的git路径。

待优化

manifest完全可以用xml来解析,而不是按行来匹配。

参考

按https://blog.csdn.net/mmh19891113/article/details/83024816这篇文章操作出现报错。

源码

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import argparse

try:
    import configparser as configparser
except Exception:
    import ConfigParser as configparser
import os
import re
import shutil

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Get gits from repo project')
    parser.add_argument("-s", "--src", help="source absolute repo project dir")
    parser.add_argument("-d", "--dst", help="dest dir for save gits")
    args = parser.parse_args()

    print("source dir=%s", args.src)
    print("dst dir=%s", args.dst)

    project_list = os.path.join(args.src, ".repo", "project.list")
    manifest_xml = os.path.join(args.src, ".repo", "manifest.xml")

    with open(project_list) as p:
        p_lines = p.readlines()

    with open(manifest_xml) as m:
        m_lines = m.readlines()

    os.system("cd %s && repo start master --all" % args.src)

    pass_count = 0
    for p in p_lines:
        path = "path=\"%s\"" % p.strip()
        is_find = False
        for m in m_lines:
            if path in m.strip():
                src_git = os.path.join(args.src, p.strip())
                d = re.search(r"name=\"([^\"]*)\"", m.strip(), re.M | re.I)
                dst_git = os.path.join(args.dst, d.group(1))
                p_dst_git = os.path.dirname(dst_git)
                if not os.path.exists(p_dst_git):
                    os.makedirs(p_dst_git)
                dst_git_name = os.path.basename(dst_git) + ".git"
                os.system("cd %s && git clone --bare %s %s" % (p_dst_git, src_git, dst_git_name))
                # print("cd %s && git clone --bare %s %s" % (p_dst_git, src_git, dst_git_name))
                is_find = True
                pass_count = pass_count + 1
                print("[%d/%d]" % (pass_count, len(p_lines)))
                break
        if not is_find:
            print("cannot find %s" % p.strip())
            exit(-1)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值