从 GitLab 远程获取所有仓库的 URL、最后提交人以及最后提交日期

#!/bin/bash

# ===================== 配置项(必须修改)=====================
GITLAB_URL="http://210.14.75.1:20220/" # 你的GitLab地址(如https://gitlab.com)
PRIVATE_TOKEN="WutLt-wTtGLExy-6QDGY"     # 第一步生成的访问令牌
GROUP_ID=""                              # 可选:指定分组ID(留空则获取当前用户所有仓库)
# ============================================================

# 1. 获取仓库列表(分页处理,避免漏取)
page=1
per_page=100
total_pages=1

echo "===== GitLab 所有仓库信息汇总 ====="
echo "GitLab地址: $GITLAB_URL"
echo "====================================$(echo -e '\n')"

while [ $page -le $total_pages ]; do
	# 构建API请求URL(按分组/全量获取)
	if [ -n "$GROUP_ID" ]; then
		repos_api="$GITLAB_URL/api/v4/groups/$GROUP_ID/projects?page=$page&per_page=$per_page&include_subgroups=true"
	else
		repos_api="$GITLAB_URL/api/v4/projects?page=$page&per_page=$per_page&owned=true"
	fi

	# 获取当前页仓库数据
	repos_data=$(curl -s --header "Private-Token: $PRIVATE_TOKEN" "$repos_api")
	# 获取总页数(从响应头提取)
	total_pages=$(curl -s -I --header "Private-Token: $PRIVATE_TOKEN" "$repos_api" | grep -i 'x-total-pages' | awk '{print $2}' | tr -d '\r')

	# 2. 遍历每个仓库,提取URL和最后提交信息
	echo "$repos_data" | jq -r '.[] | {id: .id, description: .description, name: .name, http_url_to_repo: .http_url_to_repo, last_commit: .last_activity_at}' | awk '{if($0=="}"){printf"%s\n",$0}else{printf"%s ",$0}}' | while read -r line; do
		# 解析仓库基本信息
		repo_description=$(echo "$line" | jq -r '.description')
		repo_name=$(echo "$line" | jq -r '.name')
		repo_url=$(echo "$line" | jq -r '.http_url_to_repo')
		repo_id=$(echo "$line" | jq -r '.id')
		#echo "仓库描述: $repo_description"
		#echo "仓库名称: $repo_name"
		#echo "仓库URL: $repo_url"

		# 3. 获取仓库最后提交的详细信息(通过API)
		commit_api="$GITLAB_URL/api/v4/projects/$repo_id/repository/commits?per_page=1"
		commit_data=$(curl -s --header "Private-Token: $PRIVATE_TOKEN" "$commit_api")

		if [ "$commit_data" != "[]" ] && [ "$commit_data" != "" ]; then
			# 解析提交人、提交日期
			commit_author=$(echo "$commit_data" | jq -r '.[0].author_name')
			commit_date=$(echo "$commit_data" | jq -r '.[0].created_at' | cut -c1-19) # 格式化日期
			#echo "最后提交人: $commit_author"
			#echo "最后提交日期: $commit_date"
		else
            :
			#echo "最后提交人: 无提交记录"
			#echo "最后提交日期: 无提交记录"
		fi
		echo -e "${repo_description:-}\t-\t-\t${repo_url:-}\t${commit_author:-}${commit_date}\t-"
		#echo "------------------------------------$(echo -e '\n')"
	done

	page=$((page + 1))
done

echo "===== 信息获取完成 ====="
Categories: 系统运维