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

如何在GitLab Cloud中全量获取所有组及项目列表?

解决GitLab API获取全量组及项目的问题

看起来你遇到了GitLab API获取全量数据的两个常见问题:分页没处理完整,以及查询范围只覆盖了自己直接拥有的项目。我给你拆解下问题,再一步步提供适合非开发人员的命令/脚本方案:


先说说你当前命令的问题

  1. 分页限制踩坑:GitLab API的per_page参数最大值是100(不是你用的1000),而且你只请求了第1页,自然只能拿到最多100个项目。
  2. 范围太窄:owned=yes只会返回你直接拥有的项目,没法覆盖所有组(包括子组)下的项目。

第一步:获取所有组(含子组)的ID

首先要拿到你有权限访问的所有组及子组的ID,先运行这个基础命令(如果组少于100个够用):

curl --header "PRIVATE-TOKEN: $TOKEN" "https://gitlab.com/api/v4/groups?all_available=true&per_page=100&page=1" | python -m json.tool | grep -E '"id":' | awk '{print $2}' | sed 's/,//g' > gitlab_groups.txt

如果你的组超过100个,用这个自动分页的脚本(直接复制到命令行运行即可):

page=1
while true; do
  response=$(curl --header "PRIVATE-TOKEN: $TOKEN" "https://gitlab.com/api/v4/groups?all_available=true&per_page=100&page=$page")
  # 返回空数组说明没有更多组了,停止循环
  if [ "$response" == "[]" ]; then
    break
  fi
  echo "$response" | python -m json.tool | grep -E '"id":' | awk '{print $2}' | sed 's/,//g' >> gitlab_groups.txt
  page=$((page+1))
done

这个脚本会把所有组ID保存到gitlab_groups.txt文件里。


第二步:遍历所有组,抓取全量项目

有了组ID列表后,用这个脚本遍历每个组,自动分页获取所有项目,格式和你原来的需求保持一致:

# 先清空目标文件,避免重复内容
> gitlab_all_projects.txt
while read group_id; do
  page=1
  while true; do
    response=$(curl --header "PRIVATE-TOKEN: $TOKEN" "https://gitlab.com/api/v4/groups/$group_id/projects?per_page=100&page=$page")
    if [ "$response" == "[]" ]; then
      break
    fi
    # 提取你需要的仓库地址和可见性,格式和你原来的命令一致
    echo "$response" | python -m json.tool | grep -E "http_url_to_repo|visibility" | awk '!(NR%2){print$0p}{p=$0}' | awk '{print $4,$2}' | sed -E 's/"|\,//g' >> gitlab_all_projects.txt
    page=$((page+1))
  done
done < gitlab_groups.txt

运行完后,gitlab_all_projects.txt里就会有所有组下的项目数据了。


第三步:补充抓取个人独立项目(可选)

如果你还有不属于任何组的个人项目,用这个修正过分页的命令补充进去:

page=1
while true; do
  response=$(curl --header "PRIVATE-TOKEN: $TOKEN" "https://gitlab.com/api/v4/projects/?owned=yes&per_page=100&page=$page")
  if [ "$response" == "[]" ]; then
    break
  fi
  echo "$response" | python -m json.tool | grep -E "http_url_to_repo|visibility" | awk '!(NR%2){print$0p}{p=$0}' | awk '{print $4,$2}' | sed -E 's/"|\,//g' >> gitlab_all_projects.txt
  page=$((page+1))
done

最后:转成CSV方便用表格工具打开

把文本文件转成CSV格式,直接复制到Excel或Google Sheets里就能用:

sed 's/ /,/g' gitlab_all_projects.txt > gitlab_projects.csv

几个小提醒

  • API速率限制:GitLab Cloud默认每分钟允许1000次请求,如果你的项目/组特别多,脚本可能会触发429错误。遇到的话可以在每个curl命令后面加sleep 1(延迟1秒),降低请求频率。
  • 权限检查:确保你的$TOKEN有read_api权限(最好是api权限),不然可能拿不到部分私有组/项目。
  • 验证数据:可以先拿一个已知的组ID测试,比如curl --header "PRIVATE-TOKEN: $TOKEN" "https://gitlab.com/api/v4/groups/你的组ID/projects",看看返回内容是否符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:57:01