【工具使用】【Shell指令碼】【gitlab】下拉所有的倉庫以及每個倉庫的所有分支程式碼

酷酷-發表於2024-11-24

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 個倉庫"

大家可以嘗試一下。

相關文章