GitLab 所有仓库备份与迁移(自动克隆+迁移+一键删除)

目录

一、准备工作

1. 环境要求

2. 获取 GitLab API 访问权限

二、克隆全部仓库的方法

使用 Shell 脚本

三、克隆全部仓库的同时同步到新的gitlab服务器

四、一键删除仓库

五、ip地址变更(其他)

修改gitlab配置文件gitlab.yml

修改gitlab.rb

重启gitlab服务

六、声明


一、准备工作

1. 环境要求

  • 已安装 Git(版本 2.10+)
  • 本地磁盘空间充足(根据仓库总大小预估)
  • 已配置 SSH 密钥到 GitLab(推荐方式)

2. 获取 GitLab API 访问权限

  1. 登录 GitLab,点击右上角头像 → Settings
  2. 左侧菜单选择 Access Tokens
  3. 创建 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

执行步骤:

  1. 保存脚本为 clone_all.sh
  2. 安装依赖工具:
    sudo apt install jq  # Ubuntu/Debian
    
  3. 修改脚本中的 GITLAB_URL 和 TOKEN, TARGET_DIR是保存的本地路径
  4. 执行脚本:
    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

六、声明

        本文档旨在提供技术参考,由于技术更新迭代快且编者水平有限,内容可能存在疏漏或表述不当之处。
        若您在阅读过程中发现任何错误、疑问或改进建议,欢迎评论

        我将及时核实并优化内容,感谢您的支持与包容!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小猿成长

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值