You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用glab或curl克隆GitLab组织下所有仓库?

克隆GitLab组织(含分组/子分组)下所有仓库的解决方案

方案一:使用glab + Shell脚本(推荐)

glab本身没有直接递归克隆全部分组仓库的命令,但可以结合脚本批量获取并克隆所有仓库,保持原有的分组目录结构:

步骤1:确保glab已配置完成

如果还未登录GitLab实例,执行以下命令完成认证:

glab auth login

步骤2:批量克隆脚本

创建一个Shell脚本(比如clone_all_repos.sh),内容如下:

#!/bin/bash
ORG_NAME="orgA"

# 获取组织下所有仓库的完整路径和SSH克隆地址(递归包含子分组)
glab repo list -g "$ORG_NAME" --all --recursive --paginate --format json | jq -r '.[] | [.full_path, .ssh_url] | @tsv' | while IFS=$'\t' read -r repo_path repo_url; do
  # 创建与GitLab一致的目录结构
  mkdir -p "$repo_path"
  # 仅当目录为空时执行克隆,避免覆盖已有内容
  if [ -z "$(ls -A "$repo_path")" ]; then
    git clone "$repo_url" "$repo_path"
  else
    echo "目录 $repo_path 非空,跳过克隆"
  fi
done

说明

  • --recursive:递归获取子分组中的仓库(需确保glab版本≥1.23.0)
  • --all:包含所有状态的仓库(如归档、私有仓库)
  • jq:用于解析glab输出的JSON数据,需提前安装(如apt install jq或brew install jq)
  • 如果偏好HTTPS克隆,将.ssh_url替换为.http_url即可

方案二:使用curl调用GitLab API + Shell脚本

如果不想依赖glab,可直接通过GitLab REST API实现:

步骤1:准备GitLab访问令牌

在GitLab的「Settings → Access Tokens」页面创建个人访问令牌,勾选api权限,保存好生成的令牌。

步骤2:批量克隆脚本

创建脚本clone_all_repos_api.sh,内容如下:

#!/bin/bash
GITLAB_URL="https://gitlab.com" # 私有实例替换为你的GitLab地址
TOKEN="你的个人访问令牌"
ORG_NAME="orgA"

# 获取目标组织的ID
GROUP_ID=$(curl -s --header "PRIVATE-TOKEN: $TOKEN" "$GITLAB_URL/api/v4/groups?search=$ORG_NAME" | jq -r '.[0].id')

page=1
while true; do
  # 获取当前页的仓库数据(包含子分组仓库)
  repos=$(curl -s --header "PRIVATE-TOKEN: $TOKEN" "$GITLAB_URL/api/v4/groups/$GROUP_ID/projects?per_page=100&page=$page&include_subgroups=true&with_shared=false")
  repo_count=$(echo "$repos" | jq '. | length')
  
  # 无更多仓库时退出循环
  if [ "$repo_count" -eq 0 ]; then
    break
  fi

  # 遍历仓库并克隆
  echo "$repos" | jq -r '.[] | [.path_with_namespace, .ssh_url_to_repo] | @tsv' | while IFS=$'\t' read -r repo_path repo_url; do
    mkdir -p "$repo_path"
    if [ -z "$(ls -A "$repo_path")" ]; then
      git clone "$repo_url" "$repo_path"
    else
      echo "跳过已存在的仓库目录: $repo_path"
    fi
  done

  page=$((page + 1))
done

说明

  • include_subgroups=true:API自动返回该组织及所有子分组下的仓库,无需递归遍历分组
  • 如果使用HTTPS克隆,可将.ssh_url_to_repo替换为.http_url_to_repo,或直接使用带令牌的URL:https://oauth2:$TOKEN@gitlab.com/$repo_path.git(避免手动输入密码)
  • 同样需要安装jq用于JSON解析

内容的提问来源于stack exchange,提问作者Amit Levy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:22:46