背景
公司从供应商获取到的sdk,解压出来后,里面是repo管理的源码仓库集合。但是我们要将这些仓库上传到我们自己的服务器进行管理。然而这个repo仓库不是mirror仓库。所以需要将里面的git按照原sdk来提取出来。因此写了这个脚本用来从sdk里面提取所有的裸仓库。
原理
- 根据.repo目录里面project.list获取到所有的git仓库路径。
- 再到.repo目录里面的manifest.xml里面找到对应的git路径。
- 然后用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)