美文网首页
GitLab项目克隆

GitLab项目克隆

作者: wiikzz | 来源:发表于2018-03-09 15:13 被阅读1452次

我们时不时需要整理GitLab上的项目,将某些同类型的项目统一到某一个Group下面。Group创建好以后,克隆老项目确出现了问题,新建项目的clone选项始终没法用,没办法,只能新建空项目,然后一个一个分支push上去。

一个项目如果只有个位数的分支,工作量也还行;
一个项目如果分支数达到了2位数,悬了,得累死,而且这很常见,还有那么多项目。

得,脚本搞吧。

#
# -----------------------------------------------
# Created by wiikii on 18/3/9.
# Copyright (C) 2018 wiikii. All rights reserved.
#
# 功能:将GitLab上的一个现有项目复制GitLab上另一个新项目中(包括所有分支与标签)
# 注意:新项目需要在GitLab上提前创建好,最好是空项目。
# 使用:修改S_ORIG_GIT_URL值为要复制的项目Git地址,修改S_DEST_GIT_URL值为需要复制到哪个项目的Git地址。
#      执行命令  python copyProject.py 即可
# -----------------------------------------------
#


import os
import shutil

# 源项目Git地址
S_ORIG_GIT_URL = 'git@xxxxxxxxxxxxxxxxxxxxxx.git'
# 目标项目Git地址
S_DEST_GIT_URL = 'git@xxxxxxxxxxxxxxxxxxxxxx.git'
# 临时操作目录
S_TEMP_DIR = 'WorkDir'


# 获取所有远程分支的名字简写(去掉了前缀 remotes/origin/ )
def all_branch_names():
    output = os.popen('git branch -a')
    allbranches = output.read().split()
    names = []
    for name in allbranches:
        if name.startswith('remotes/origin/'):
            shortName = name[15:]
            if shortName != 'HEAD':
                names.append(shortName)
    return names


# 判断giturl是否是一个合法的GitLab地址
def is_valid_git_url(giturl):
    if giturl is None:
        print('Error: Git address is null, make sure you input the right address!')
        return False
    if not giturl.startswith('git@'):
        print('Error: Git address is invalid, check your git address!')
        return False
    return True


def check_work_dir(dir):
    if os.path.exists(dir):
        i = input('WorkDir has exists, do you want delete it?(y/n):')
        if i == 'y' or i == 'Y':
            shutil.rmtree(dir)
            return True
        else:
            print('please delete the WorkDir to continue!')
            return False

    return True


# 将远程仓库的代码
def clone_git_repo(giturl, destDir):
    if not is_valid_git_url(giturl):
        return False
    if not check_work_dir(destDir):
        return False
    gitcmd = 'git clone ' + giturl + ' ' + destDir
    if os.system(gitcmd) == 0:
        return True
    return False


if not is_valid_git_url(S_ORIG_GIT_URL):
    exit()
if not is_valid_git_url(S_DEST_GIT_URL):
    exit()
if not check_work_dir(S_TEMP_DIR):
    exit()
if not clone_git_repo(S_ORIG_GIT_URL, S_TEMP_DIR):
    print('Error:clone repo error!')
    exit()
os.chdir(S_TEMP_DIR)
os.system('git remote add tempOrigin ' + S_DEST_GIT_URL)
os.system('git fetch')
os.system('git push tempOrigin --tags')
branches = all_branch_names()
for branch in branches:
    os.system('git checkout -b T' + branch + ' origin/' + branch)
    os.system('git push tempOrigin T' + branch + ':' + branch)
os.chdir('..')
shutil.rmtree(S_TEMP_DIR)
print("success")

修改S_ORIG_GIT_URL值为要复制的项目Git地址,修改S_DEST_GIT_URL值为需要复制到哪个项目的Git地址。
执行命令:python copyProject.py 即可,最好使用python3执行。

本地Git项目关联新项目地址:

git remote set-url origin 新项目地址

使用命令

git remote -v

可以查看当前关联的远程仓库地址。

相关文章

网友评论

      本文标题:GitLab项目克隆

      本文链接:https://www.haomeiwen.com/subject/sznpfftx.html