如何使用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
相关产品推荐
相关产品推荐

