• Gitlab迁移方案


    方案一 单个项目mirror迁移

    获取所有项目git地址
    import requests
    
    if __name__ == "__main__":
        headers = {"Private-Token": "XkKw4nD1z2eZSSZ6Ax7Q"}
        pages = 74
        pageSize = 20
        for i in range(pages):
            page = i + 1
            url = f"http://git.dev.xx.com/api/v4/projects?per_page={pageSize}&page={str(page)}"
            response = requests.get(url, headers=headers)
            if response.status_code != 200:
                print(response.text)
            else:
                records = response.json()
                for rec in records:
                    print(rec["namespace"]["full_path"], rec["name"], rec["web_url"], rec["ssh_url_to_repo"],
                          rec["http_url_to_repo"])
                if page >= pages:
                    print(f"最后一页[{page}]已结束")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    输出各个项目信息,其中http_url_to_repossh_url_to_repo对应不同类型仓库地址。

    迁移操作
    • 克隆源仓库
    git clone --mirror <源仓库URL>
    
    • 1
    • 添加新远程仓库地址
    git remote add <目标仓库名称> <目标仓库URL>
    
    • 1
    • 推送所有分支和标签
    git push --mirror <目标仓库名称>
    
    • 1

    综上可得:

    import subprocess
    
    import requests
    
    origin_access_token = "XkKw4nD1z2eZSSZ6Ax7Q"
    target_git_base_url = ""
    
    
    def get_origin_git_repo_urls():
        headers = {"Private-Token": f"{origin_access_token}"}
        pages = 74
        page_size = 20
        for i in range(pages):
            page = i + 1
            git_url = f"http://git.dev.xx.com/api/v4/projects?per_page={page_size}&page={str(page)}"
            response = requests.get(git_url, headers=headers)
            if response.status_code != 200:
                print(response.text)
            else:
                records = response.json()
                for rec in records:
                    #print(rec["namespace"]["full_path"], rec["name"], rec["web_url"], rec["ssh_url_to_repo"], rec["http_url_to_repo"])
                    trans_git(rec["namespace"]["full_path"], rec["name"], rec["http_url_to_repo"])
                if page >= pages:
                    print(f"最后一页[{page}]已结束")
    
    
    def proc_group(path):
        # TODO
        pass
    
    
    def proc_repo(group_path, repo_name, repo_url):
        # TODO
        pass
    
    
    # 执行linux命令
    def proc_command(command):
        # 使用subprocess执行Linux命令
        process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        # 等待命令执行完成
        process.wait()
        # 获取命令的返回值
        return_code = process.returncode
        # 判断命令是否执行成功
        if return_code == 0:
            print(f"命令执行成功:{command}")
            return True
        else:
            print(f"命令执行失败:{command}")
            return False
    
    
    # 迁移操作
    def trans_git(origin_group_path, origin_repo_name, origin_git_url):
        # git clone命令
        clone_command = f'git clone --mirror {origin_git_url}'
        if not proc_command(clone_command):
            return
        if not proc_group(origin_group_path):
            return
        repo_url = f"{target_git_base_url}/{origin_group_path}/{origin_repo_name}.git"
        if not proc_repo(origin_group_path, origin_repo_name, repo_url):
            return
        cd_in_command = f'cd {origin_repo_name}'
        if not proc_command(cd_in_command):
            return
        push_command = f'git push --mirror {repo_url}'
        proc_command(push_command)
        cd_out_command = f'cd ..'
        proc_command(cd_out_command)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
  • 相关阅读:
    怎么使用Stable diffusion中的models
    os.environ[CUDA_VISIBLE_DEVICES] 失效无法指定 GPU
    系统架构师2022年案例分析考前冲刺
    数据结构与算法(五)--链表概念以及向链表添加元素
    golang--文件的多个处理场景
    如何将DHTMLX Suite集成到Scheduler Lightbox中?让项目管理更可控!
    二叉搜索树(C++实现)
    golang jwt(hs,es,rs,ed)密钥生成、加签验签案例
    面试准备-软件工程
    [ 复习 ] - TypeScript 基础类型
  • 原文地址:https://blog.csdn.net/A123638/article/details/132872545