我们时不时需要整理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
可以查看当前关联的远程仓库地址。
网友评论