【工具使用】【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 个仓库"
复制代码

大家可以尝试一下。

posted @   酷酷-  阅读(88)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示