目录
一、准备工作
1. 环境要求
- 已安装 Git(版本 2.10+)
- 本地磁盘空间充足(根据仓库总大小预估)
- 已配置 SSH 密钥到 GitLab(推荐方式)
2. 获取 GitLab API 访问权限
- 登录 GitLab,点击右上角头像 → Settings
- 左侧菜单选择 Access Tokens
- 创建 Token:
- 名称:如
backup - 权限:至少勾选
api - 记录生成的 Token(仅显示一次)
- 名称:如

二、克隆全部仓库的方法
使用 Shell 脚本
#!/bin/bash
GITLAB_URL="http://192.168.0.224:1110"
TOKEN="glpat-N9HX9-XUpbErhxnB9311"
TARGET_DIR="/media/nihao/gitcore/gitlab_repos"
mkdir -p $TARGET_DIR && cd $TARGET_DIR
curl -s --header "PRIVATE-TOKEN: $TOKEN" "$GITLAB_URL/api/v4/projects?per_page=1000" |
jq -r '.[].ssh_url_to_repo' |
while read repo; do
git clone --mirror "$repo"
done
执行步骤:
- 保存脚本为
clone_all.sh - 安装依赖工具:
sudo apt install jq # Ubuntu/Debian - 修改脚本中的
GITLAB_URL和TOKEN, TARGET_DIR是保存的本地路径 - 执行脚本:
chmod +x clone_all.sh ./clone_all.sh

三、克隆全部仓库的同时同步到新的gitlab服务器
基于前面的脚本,我们追加新的gitlab服务的信息,然后在备份好每一个仓库的同时同步到新的gitlab服务上。
在同步的时候先判断新的gitlab上是否存在该仓库,如果不存在自动创建。
调整的脚本如下:
#!/bin/bash
# 源GitLab配置
SOURCE_GITLAB_URL="http://192.168.0.24:1151"
SOURCE_TOKEN="glpat-zZj66ELQ7BQX1OzrWnrL"
# 目标GitLab配置 - 请替换为你的第二个GitLab服务器信息
TARGET_GITLAB_URL="http://192.168.0.142" # 替换为第二个GitLab地址
TARGET_TOKEN="glpat-chKY45Cfi12eUyyqZy6286MQp1OjEH.01.0w0sf99ht" # 替换为第二个GitLab的访问令牌
TARGET_NAMESPACE="root" # 替换为目标命名空间(可选)
# 本地存储目录
LOCAL_DIR="/mnt/data2t/250930/gitlab_repos"
# 创建本地目录并进入
mkdir -p $LOCAL_DIR && cd $LOCAL_DIR
# 获取所有项目并进行处理
curl -s --header "PRIVATE-TOKEN: $SOURCE_TOKEN" "$SOURCE_GITLAB_URL/api/v4/projects?per_page=1000" |
jq -r '.[] | .ssh_url_to_repo + " " + .path_with_namespace' |
while read repo path; do
# 提取仓库名称
repo_name=$(basename "$repo" .git)
echo "开始处理仓库: $repo_name"
# 如果仓库已存在则更新,否则克隆
if [ -d "$repo_name.git" ]; then
echo "仓库已存在,更新镜像: $repo_name"
cd "$repo_name.git"
git remote update
cd ..
else
echo "克隆仓库: $repo"
git clone --mirror "$repo"
fi
# 推送至目标GitLab服务器
echo "推送仓库至目标GitLab: $repo_name"
cd "$repo_name.git"
# 构建目标仓库的名称
target_repo_name="${repo_name}"
# 构建目标仓库的完整路径
target_full_path="${TARGET_NAMESPACE}/${target_repo_name}"
# 检查目标GitLab服务器上是否存在该仓库
target_project_url="${TARGET_GITLAB_URL}/api/v4/projects?search=${target_full_path}"
project_exists=$(curl -s --header "PRIVATE-TOKEN: $TARGET_TOKEN" "$target_project_url" | jq -r '.[] | select(.path_with_namespace == "'${target_full_path}'")')
if [ -z "$project_exists" ]; then
# 如果仓库不存在,创建仓库
create_project_url="${TARGET_GITLAB_URL}/api/v4/projects"
create_project_data="{\"name\":\"${repo_name}\",\"namespace\":\"${TARGET_NAMESPACE}\",\"visibility\":\"private\"}"
echo "目标GitLab上不存在仓库,正在创建: $target_full_path"
create_response=$(curl -s -X POST --header "PRIVATE-TOKEN: $TARGET_TOKEN" --header "Content-Type: application/json" -d "$create_project_data" "$create_project_url")
if echo "$create_response" | jq -r '.id' > /dev/null 2>&1; then
echo "仓库创建成功"
else
echo "仓库创建失败,响应: $create_response"
continue
fi
else
echo "目标GitLab上仓库已存在"
fi
# 设置目标仓库地址 (使用HTTPS方式,通过令牌认证)
target_repo="${TARGET_GITLAB_URL//http:\/\//http://oauth2:$TARGET_TOKEN@}/${TARGET_NAMESPACE}/${repo_name}.git"
# 添加目标远程仓库(如果不存在)
if ! git remote | grep -q "target"; then
git remote add target "$target_repo"
else
git remote set-url target "$target_repo"
fi
# 推送所有内容和分支
git push --mirror target
# 返回上级目录
cd ..
echo "仓库处理完成: $repo_name"
echo "----------------------------------------"
done
echo "所有仓库同步完成!"
日志:
开始处理仓库: u-boot
克隆仓库: git@192.168.0.24:root/fbs_nvr/u-boot.git
克隆到纯仓库 'u-boot.git'...
remote: Enumerating objects: 545116, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 545116 (delta 0), reused 0 (delta 0), pack-reused 545108
接收对象中: 100% (545116/545116), 118.60 MiB | 35.49 MiB/s, 完成.
处理 delta 中: 100% (444426/444426), 完成.
推送仓库至目标GitLab: u-boot
目标GitLab上不存在仓库,正在创建: root/u-boot
仓库创建成功
枚举对象中: 545116, 完成.
对象计数中: 100% (545116/545116), 完成.
使用 8 个线程进行压缩
压缩对象中: 100% (93097/93097), 完成.
写入对象中: 100% (545116/545116), 118.60 MiB | 21.42 MiB/s, 完成.
总共 545116(差异 444426),复用 545116(差异 444426),包复用 0
remote: Resolving deltas: 100% (444426/444426), done.
remote: Checking connectivity: 545116, done.
remote:
remote: To create a merge request for arunce_test, visit:
remote: http://gitlab.example.com/root/u-boot/-/merge_requests/new?merge_request%5Bsource_branch%5D=arunce_test
remote:
To http://192.168.0.142/root/u-boot.git
* [new branch] arunce -> arunce
* [new branch] arunce_test -> arunce_test
仓库处理完成: u-boot
脚本仅供参考
四、一键删除仓库
#!/bin/bash
# 配置信息
#GITLAB_URL="https://your-gitlab-url.com"
#PRIVATE_TOKEN="your-private-token"
GITLAB_URL="http://192.168.0.12" # 修改你的gitlab地址
PRIVATE_TOKEN="glpat-chKY45CHfii12eUyyqZy6286Mp1OjEH.01.0w0s99ht" # 修改为你的gitlab token
# 获取所有项目ID
project_ids=$(curl -s --header "Private-Token: $PRIVATE_TOKEN" "$GITLAB_URL/api/v4/projects?per_page=100&page=1" | jq -r '.[] | .id')
# 循环删除每个项目
for id in $project_ids; do
echo "Deleting project with ID: $id"
curl --request DELETE --header "Private-Token: $PRIVATE_TOKEN" "$GITLAB_URL/api/v4/projects/$id"
sleep 1 # 避免请求过于频繁
done
五、ip地址变更(其他)
gitlab服务器更换新的ip地址后,拉取代码的地址ip没有自动改变,会导致无法拉取代码。解决方法四修改下配置文件中的ip地址即可。
-
修改gitlab配置文件gitlab.yml
vi /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
-
修改gitlab.rb
vi /etc/gitlab/gitlab.rb
-
重启gitlab服务
sudo gitlab-ctl restart
六、声明
本文档旨在提供技术参考,由于技术更新迭代快且编者水平有限,内容可能存在疏漏或表述不当之处。
若您在阅读过程中发现任何错误、疑问或改进建议,欢迎评论
我将及时核实并优化内容,感谢您的支持与包容!
3448

被折叠的 条评论
为什么被折叠?



