上传repo仓库到自己的gitlab

一、在gitlab创建远程仓库

1.1、创建SDK根目录

1.2、创建、上传repo工程

1.2.1、创建repo仓库

1.2.2、上传repo源码

1、进入本地repo仓库,在SDK根目录执行(用SSH或HTTP地址都行)

bash 复制代码
cd .repo/repo
git remote add gitlab http://172.16.76.99:8087/sdk/tina-mr153/repo.git

2、上传所有分支和标签

bash 复制代码
git push gitlab --all -f
git push gitlab --tags -f

1.3、创建、上传manifests工程

1.3.1、创建manifests仓库

1.3.2、上传manifests源码

1、进入本地manifests仓库,在SDK根目录执行(用SSH或HTTP地址都行)

bash 复制代码
cd .repo/manifests
git remote add gitlab http://172.16.76.99:8087/sdk/tina-mr153/manifests.git

2、上传所有分支和标签

bash 复制代码
git push gitlab --all -f
git push gitlab --tags -f

二、使用shell脚本自动上传

使用shell脚本上传代码,需要调用gitlab的一些API,所以先要申请Accent Tokens

2.1、申请Accent Tokens

创建成功后会显示Token,如mJxbuxrCSMAgXUDdktWm,保存起来

2.2、创建自动化脚本

bash 复制代码
#!/bin/bash
set -euo pipefail

# ======================== 核心配置项(请根据实际修改) ========================
GITLAB_URL="http://172.16.76.99:8087"                # 公司GitLab地址(HTTP)
GIT_SSH_URL="http://172.16.76.99:8087"               # 公司GitLab地址(SSH)
GITLAB_TOKEN="mJxbuxrCSMAgXUDdktWm"                  # GitLab个人访问令牌(需api/write_repository权限)
ROOT_GROUP="sdk/tina-mr153"                          # 目标根组(固定为sdk/tinar329)
MANIFEST_FILE=".repo/manifests/tina-mr153_smartx-mr153-tina-v1.0-release.xml"       #本地 repo manifest文件路径
SDK_ROOT=$(pwd)                                      # SDK根目录(脚本在SDK根目录执行)
# =============================================================================

# 颜色输出函数
echo_info() { echo -e "\033[32m[INFO] $1\033[0m"; }
echo_error() { echo -e "\033[31m[ERROR] $1\033[0m"; exit 1; }

# 检查基础依赖
check_dependencies() {
    echo_info "检查依赖工具..."
    command -v git >/dev/null 2>&1 || echo_error "git未安装"
    command -v repo >/dev/null 2>&1 || echo_error "repo未安装"
    command -v curl >/dev/null 2>&1 || echo_error "curl未安装"
    command -v python3 >/dev/null 2>&1 || echo_error "python3未安装"
}

# URL编码函数(通用)
url_encode() {
    local input="$1"
    python3 -c "import urllib.parse; print(urllib.parse.quote('${input}'))"
}

# 逐级创建GitLab组(支持嵌套)
create_gitlab_subgroup() {
    local parent_id="$1"     # 根组ID,如sdk/tinar329
    local repo_path="$2"     # 仓库路径,如lichee/brandy-2.0

    # 拼接完整的组路径:根组/仓库路径(不含最后一级项目名)
    #local full_group_path="${ROOT_GROUP}/${repo_path}"
    #local encoded_root_group=$(url_encode "${ROOT_GROUP}")

    # 获取根组ID
    #local root_group_info=$(curl -s --header "Private-Token: ${GITLAB_TOKEN}" \
    #    "${GITLAB_URL}/api/v4/groups/${encoded_root_group}")
    #echo_info "root_group_info: ${root_group_info}"
    #local parent_id=$(echo "${root_group_info}" | python3 -c "import sys, json; print(json.load(sys.stdin).get('id',0))")
    #echo_info "parent_id: ${parent_id}"
    #[ "${parent_id}" -eq 0 ] && echo_error "根组 ${ROOT_GROUP} 不存在或无权限访问"

    # 拆分仓库路径为层级,逐级创建子组
    IFS='/' read -ra PATH_PARTS <<< "${ROOT_GROUP}/${repo_path}"
    local current_group_path="" #"${ROOT_GROUP}"

    for part in "${PATH_PARTS[@]}"; do
        current_group_path+="${current_group_path:+/}$part"
        #local encoded_current=$(url_encode "${current_group_path}")

        # 检查组是否已存在
        local group_info=$(curl -s --header "Private-Token: ${GITLAB_TOKEN}" \
            "${GITLAB_URL}/api/v4/groups/${current_group_path//\//%2F}")

        if echo "${group_info}" | grep -q '"id":'; then
            parent_id=$(echo "${group_info}" | python3 -c "import sys, json; print(json.load(sys.stdin)['id'])")
            #echo_info "组 ${current_group_path} 已存在,ID: ${parent_id}"
        else
            # 创建子组
            local create_result=$(curl -s -X POST --header "Private-Token: ${GITLAB_TOKEN}" \
                --header "Content-Type: application/json" \
                --data "{\"name\":\"${part}\",\"path\":\"${part}\",\"parent_id\":${parent_id},\"visibility\":\"private\"}" \
                "${GITLAB_URL}/api/v4/groups")

            if echo "${create_result}" | grep -q '"id":'; then
                parent_id=$(echo "${create_result}" | python3 -c "import sys, json; print(json.load(sys.stdin)['id'])")
                #echo_info "成功创建组 ${current_group_path},ID: ${parent_id}"
            else
                echo_error "创建组 ${current_group_path} 失败: ${create_result}"
            fi
        fi
    done

    echo "${parent_id}"  # 返回最后一级子组ID
}

# 创建GitLab根组(如不存在)
function create_gitlab_group() {
    local group_path=$1
    local parent_id=0

    # 拆分组路径,逐级创建
    IFS='/' read -ra GROUP_PARTS <<< "$group_path"
    local current_path=""

    for part in "${GROUP_PARTS[@]}"; do
        current_path+="${current_path:+/}$part"

        # 检查组是否存在
        GROUP_EXIST=$(curl -s --header "Private-Token: ${GITLAB_TOKEN}" \
            "${GITLAB_URL}/api/v4/groups/${current_path//\//%2F}")

        if echo "${GROUP_EXIST}" | grep -q '"id":'; then
            parent_id=$(echo "${GROUP_EXIST}" | python3 -c "import sys, json; print(json.load(sys.stdin)['id'])")
            #echo_info "GitLab组 ${current_path} 已存在,ID: ${parent_id}"
        else
            # 创建组
            CREATE_RESULT=$(curl -s --request POST --header "Private-Token: ${GITLAB_TOKEN}" \
                --header "Content-Type: application/json" \
                --data "{\"name\":\"${part}\",\"path\":\"${part}\",\"parent_id\":${parent_id}}" \
                "${GITLAB_URL}/api/v4/groups")

            if echo "${CREATE_RESULT}" | grep -q '"id":'; then
                parent_id=$(echo "${CREATE_RESULT}" | python3 -c "import sys, json; print(json.load(sys.stdin)['id'])")
                #echo_info "成功创建GitLab组 ${current_path},ID: ${parent_id}"
            else
                echo_error "创建GitLab组 ${current_path} 失败: ${CREATE_RESULT}"
            fi
        fi
    done
    echo "${parent_id}"
}

# 解析R329-Tina.xml,提取仓库name和path
parse_manifest() {
    [ ! -f "${MANIFEST_FILE}" ] && echo_error "Manifest文件不存在: ${MANIFEST_FILE}"

    python3 - <<END
import xml.etree.ElementTree as ET
import sys

tree = ET.parse("${MANIFEST_FILE}")
root = tree.getroot()

# 提取所有project的name和path
for project in root.findall('project'):
    name = project.get('name')
    path = project.get('path', name)
    if name:
        # 拆分name为组路径和项目名(最后一级是项目名)
        name_parts = name.split('/')
        if len(name_parts) > 1:
            group_path = '/'.join(name_parts[:-1])
            project_name = name_parts[-1]
        else:
            group_path = ''
            project_name = name
        print(f"{name}|{path}|{group_path}|{project_name}")
END
}

# 推送单个仓库到指定GitLab组
push_repo() {
    local repo_name=$1      # 完整name:lichee/brandy-2.0/spl-pub
    local repo_path=$2      # 本地路径
    local group_path=$3     # 组路径:lichee/brandy-2.0
    local project_name=$4   # 项目名:spl-pub
    local group_id=$5

    local local_repo_dir="${SDK_ROOT}/${repo_path}"
    [ ! -d "${local_repo_dir}/.git" ] && echo_error "本地仓库不存在: ${local_repo_dir}"

    # 1. 创建嵌套子组(如sdk/tinar329/lichee/brandy-2.0)
    echo_info "处理仓库: ${repo_name},本地路径: ${local_repo_dir}"
    local subgroup_id=$(create_gitlab_subgroup "${group_id}" "${group_path}")
    echo_info "subgroup_id ${subgroup_id}"

    # 2. 拼接完整项目路径
    local full_project_path="${ROOT_GROUP}/${group_path}/${project_name}"
    local encoded_project_path=$(url_encode "${full_project_path}")

    # 3. 检查项目是否已存在
    local project_info=$(curl -s --header "Private-Token: ${GITLAB_TOKEN}" \
        "${GITLAB_URL}/api/v4/projects/${encoded_project_path//\//%2F}")

    echo_info "project_info: ${project_info}"
    if echo "${project_info}" | grep -q '"id":'; then
        echo_info "项目 ${full_project_path} 已存在"
    else
        # 创建项目
        local create_project=$(curl -s --request POST --header "Private-Token: ${GITLAB_TOKEN}" \
            --header "Content-Type: application/json" \
            --data "{\"name\":\"${project_name}\",\"path\":\"${project_name}\",\"namespace_id\":${subgroup_id},\"visibility\":\"private\"}" \
            "${GITLAB_URL}/api/v4/projects")

        echo_info "create_project: ${create_project}"
        if echo "${create_project}" | grep -q '"id":'; then
            echo_info "成功创建项目: ${full_project_path}"
        else
            echo_error "创建项目失败: ${project_name},${subgroup_id},${create_project}"
        fi
    fi

    # 4. 推送代码到GitLab
    cd "${local_repo_dir}"
    local gitlab_remote_url="${GIT_SSH_URL}/${full_project_path}.git"
    git remote remove gitlab 2>/dev/null || true
    git remote add gitlab "${gitlab_remote_url}"

    echo_info "推送 ${repo_name} 的所有分支..."
    git push gitlab --all -f
    echo_info "推送 ${repo_name} 的所有标签..."
    git push gitlab --tags -f

    cd "${SDK_ROOT}"
    echo_info "✅ 完成仓库 ${repo_name} 的推送\n"
}

# 主流程
main() {
    echo_info "========== 开始迁移R329-Tina SDK到GitLab =========="

    # 1. 检查依赖
    check_dependencies

    # 2. 创建GitLab组
    echo_info "创建GitLab组: ${ROOT_GROUP}"
    GROUP_ID=$(create_gitlab_group "${ROOT_GROUP}")
    echo_info "GROUP_ID: ${GROUP_ID}"

    # 3. 解析manifest文件
    echo_info "解析manifest文件: ${MANIFEST_FILE}"
    local repo_list=$(parse_manifest)

    # 4. 遍历所有仓库推送
    while IFS='|' read -r repo_name repo_path group_path project_name; do
        [ -z "${repo_name}" ] && continue
        push_repo "${repo_name}" "${repo_path}" "${group_path}" "${project_name}" "${GROUP_ID}"
    done <<< "${repo_list}"

    echo_info "========== 所有仓库迁移完成! =========="
}

# 执行主流程
main "$@"

运行结果:

bash 复制代码
./upload_repo_to_gitlab.sh
...
...
...
[INFO] 推送 t-coffer/tee_kit 的所有分支...
[INFO] 推送 t-coffer/tee_kit 的所有标签...
[INFO] ✅ 完成仓库 t-coffer/tee_kit 的推送

[INFO] ========== 所有仓库迁移完成! ==========

三、下载gitlab的repo仓库

3.1、创建本地仓库目录

bash 复制代码
mkdir MR153 && cd MR153
mkdir .repo && cd .repo

3.2、下载repo仓库

bash 复制代码
​git clone http://172.16.76.99:8087/sdk/tina-mr153/repo.git
cd ../ && .repo/repo/repo init -u http://172.16.76.99:8087/sdk/tina-mr153/manifests.git -m smartx-mr153-tina-v1.0-release.xml
​.repo/repo/repo sync

1、可以把​.repo/repo/repo拷贝或者软链接到/usr/bin/repo,后续可以直接执行repo sync、repo forall -c、repo start这些命令

2、同步代码可以多线程执行,如repo sync -j4

运行结果:

Shell脚本实现自动化上传repo仓库

相关推荐
IT大白鼠1 小时前
CVE-2026-7531 Azure Linux MariaDB PQC 内存破坏漏洞详解
linux·mariadb·azure·cve-2026-7531
无忧.芙桃1 小时前
线程同步与线程互斥(上)
linux·运维·操作系统·运维开发
HAPPY酷1 小时前
【ROS2】16G 内存笔记本跑 ROS2 仿真?VMware 虚拟机“保姆级”配置指南 (R9 7940HX + RTX 4060)
java·linux·ide·windows·pycharm
donoot11 小时前
Linux系统下图书馆级电子书全自动标准化分类整理完整实施方案
大数据·linux·运维·电子书管理
Felix-lxd12 小时前
Ubuntu 22.04 配置 Nginx
linux·nginx·ubuntu
Tim_Van13 小时前
在 CentOS 7 中安装 Chromium 的完整步骤
linux·运维·chrome·centos
2023自学中13 小时前
C++ 内存追踪器
linux·c++
啵啵鱼爱吃小猫咪14 小时前
Ubuntu 20.04 + ROS Noetic 源码安装 libfranka 0.8.0 和 franka_ros 0.8.0 完整教程
linux·运维·ubuntu
ljs64827395115 小时前
Linux运维实操:vi编辑器永久配置静态IP(CentOS系列)
linux·运维·编辑器