Gitlab 提供了完善的 HTTP API 来获取分组、项目信息。
暂不支持翻页: 若分组超过100或者分组下的项目超过100个,则会被忽略。
#!/bin/bash
# Gitlab 服务地址
GITLAB_HOST="Gitlab.org"
# 去 $GITLAB_HOST/profile/personal_access_tokens 创建一个TOKEN
TOKEN="你的TOKEN"
QUERY_PARAM="min_access_level=30&simple=true&per_page=100&page=1"
GROUPS_URL="$GITLAB_HOST/api/v4/groups?all_available=false&top_level_only=false&$QUERY_PARAM"
PROJECTS_URL="$GITLAB_HOST/api/v4/groups/%s/projects?$QUERY_PARAM"
fetch() {
curl --silent --header "PRIVATE-TOKEN: $TOKEN" "$GROUPS_URL" \
| jq .[].name | sed 's/"//g' | sort | uniq \
| xargs printf $PROJECTS_URL'\n' $1 \
| xargs curl --silent --header "PRIVATE-TOKEN: $TOKEN" $1 \
| jq '. | select(type == "array") | .[] | select(has("ssh_url_to_repo")) | .ssh_url_to_repo' \
| sed 's/"//g' | sort | uniq \
| awk -F'[:/]' '{ url=$0; project=sub(".git","",$3); cmd="mkdir -p "$2" && git clone --depth 1 "url" "$2"/"$3; system(cmd)}'
}
fetch