一、背景
日常工作中,代码管理会用到gitLab,而因种种原因,可能会涉及从gitLab将代码迁移的情景发生。针对这种情况,特整理如下代码迁移方案,该方案只针对代码从一个服务器gitLab迁移到其它gitLab的代码迁移方案。该方案利用python语言,python-gitlab库实现。该方案通过两步实现,第一步:获取源账号下所属的项目信息。第二步:将确认获取的信息导入到目标账号对应的组下。
二、插件安装
pip install python-gitlab pandas
API文档:
Deployments - python-gitlab v3.15.0
三、 登录源gitLab账号获取token
全部勾选,创建对应的token即可。同样目标账户也这样操作,并且,本地设置SSHKey,如下图所示
ssh-keygen -t rsa -C "你的邮箱"
上面,源账号和目标账号均要设置。设置完成之后,即可进入下一步,导出操作
四、开始导出操作
代码如下,其中源文件账号有两个,根据自己需求调整:
import gitlab
import pandas as pd
import json
def get_projects_info(gl):
"""
获取账号下所有项目列表信息
"""
projects = gl.projects.list(visibility="private", all=True)
project_info = []
for project in projects:
project_info.append({
'ID': project.id,
'Name': project.name,
'path_with_namespace':project.path_with_namespace,
'Description': project.description,
'Web URL': project.web_url,
'SSH URL': project.ssh_url_to_repo,
'HTTP URL': project.http_url_to_repo,
'Visibility': project.visibility,
'Default Branch': project.default_branch,
})
return project_info
# 合并jsonlist 对象
def merge_lists(json_list1, json_list2):
# 转换为字符串
json_str_list1 = [json.dumps(obj, sort_keys=True) for obj in json_list1]
json_str_list2 = [json.dumps(obj, sort_keys=True) for obj in json_list2]
# 使用集合去重
unique_json_str_set = set(json_str_list1).union(json_str_list2)
# 将字符串转换回 JSON 对象
unique_json_list = [json.loads(obj) for obj in unique_json_str_set]
return unique_json_list
# 导出到excel
def export_to_excel(project_info, excel_file):
"""
将项目信息导出到 Excel
"""
df = pd.DataFrame(project_info)
df.to_excel(excel_file, index=False)
# 在目标 GitLab 仓库的指定组下创建新项目
def create_project_in_target_gl(gl, target_group_id, project_name, project_description):
"""
在目标 GitLab 仓库的指定组下创建新项目
"""
target_group = gl.groups.get(target_group_id)
new_project = target_group.projects.create({
'name': project_name,
'description': project_description
})
return new_project
if __name__ == "__main__":
# 替换以下变量为实际值
source_gitlab_url = "source_gitlab_url"
target_gitlab_url = "target_gitlab_url "
private_token_cl = "上面获取的源文件token,第一个账号"
excel_file_path_cl = "E:/data/file/gitlab_info2.xlsx"
private_token_st = "上面获取的源文件token,第二个账号"
excel_file_path_st = "E:/data/file/gitlab_info3.xlsx"
#目标账号下token
target_private_token ="上面获取的目标文件token"
excel_file_path_merge = "E:/file/logs/gitlab_info_merge.xlsx"
target_group_name = "research" # 目标组的名称,确保该组已存在
target_branch = "main" # 目标分支的名称
# 创建 GitLab 实例
gl_cl = gitlab.Gitlab(source_gitlab_url, private_token=private_token_cl, api_version=4)
gl_st = gitlab.Gitlab(source_gitlab_url, private_token=private_token_st, api_version=4)
# 获取账号下所有项目信息
projects_info_cl = get_projects_info(gl_cl)
projects_info_st = get_projects_info(gl_st)
projects_info_merge = merge_lists(projects_info_cl, projects_info_st)
# 导出到 Excel 文件
export_to_excel(projects_info_cl, excel_file_path_cl)
export_to_excel(projects_info_st, excel_file_path_st)
export_to_excel(projects_info_merge, excel_file_path_merge)
print(f"Project information exported to {excel_file_path_merge}")
执行之后效果如下:
文件说明:
1.gitlab_info.xlsx:所有项目
2.gitlab_info2:账号一下的项目
3.gitlab_info3.xlsx:账号二下的项目
4.gitlab_info_merge.xlsx:要合并的项目
五、总结
该项目主要实现第一步,获取所有想到从源文件导入到目标文件的文件信息获取,如有任何疑问,请留言。而具体导入,则需要执行下一步,请继续关注,下一章:python脚本gitLab多个账号下,所属源项目导入到目标项目