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 個倉庫"
大家可以嘗試一下。