一、在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仓库
