【工具使用】【Shell脚本】【gitlab】下拉所有的仓库以及每个仓库的所有分支代码
1 前言
关于 Gitlab 我们之前看过【工具使用】【Shell脚本】【gitlab】下拉所有的仓库代码并指定分支推送给客户仓库、【工具使用】【Shell脚本】【gitlab】【最终篇】获取当前用户页面上可以看到的所有仓库代码以及拉推新仓库。前面两篇都是拉的某几个分支,本节我们看看,怎么把所有的仓库的所有分支都拉取下来。
2 完整脚本
这里我就直接贴了哈:
#!/bin/bash # 仓库地址 GIT_HOST="http://xxxx.com" # 仓库Token GIT_ACCESS_TOKEN="你的token" # 获取所有的项目信息 # 分页信息 每次获取100个 page=1 per_page=100 # 总仓库数 total=0 # 一直获取 while : ; do # 获取数据并存储到 data.json 中 echo "获取第 $page 页数据" url="$GIT_HOST/api/v4/projects?page=${page}&per_page=${per_page}&visibility=private&order_by=path&sort=asc" curl -H "PRIVATE-TOKEN:$GIT_ACCESS_TOKEN" -H "Content-Type: application/json" "${url}" > data.json # 提取每个仓库的 ssh地址 ssh_url_to_repo part_projects=$(cat data.json | jq '.[].ssh_url_to_repo') # 处理返回的 JSON 数据 仅获取 id, name, path_with_namespace, ssh_url_to_repo 四个属性 # 暂时不用,发现这样后续不好处理 # part_json=$(echo "${response}" | jq 'map({id, name, path_with_namespace, ssh_url_to_repo})') # 没有数据的话默认会返回 [] 所以我们这里直接判断长度小于等于2 就说明没有了 if [ ${#part_projects} -le 2 ]; then echo "没有更多了,结束" break fi # 遍历处理 for project in $part_projects do # 仓库计数器++ ((total++)) # 去掉双引号 project=`echo $project | sed -e 's/"//g'` echo "$total-ssh地址:$project" # 截取最后文件名 比如 ssh://git@xxx:23/xx/abc.git 得到 abc file_name=$(basename "$project" .git) echo "$total-文件名:$file_name" # 先删除再拉取仓库 rm -rf $project git clone $project # 进入仓库 cd $file_name # 获取当前项目的所有分支 放到数组里 branches=($(git branch -r | awk '{print $1}')) # 遍历分支进行拉取 for branch in "${branches[@]}"; do new_branch_name=$(basename "$branch") echo "$file_name处理分支:$new_branch_name" git checkout $new_branch_name done # 回退上一级目录 cd .. # 删除本地仓库文件 #rm -rf $project # !!!先测试一个,可以的话再注释掉这个 break break done # 页数++ 继续拉取下一页 ((page++)) done # 打印 echo "总共获取到: $total 个仓库"
大家可以尝试一下。
分类:
工具使用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了