如何使用 Bash 腳本備份 GitLab 上的所有專案

最近,我的一位同事提出了一個需求,需要將某個帳號下的所有儲存庫都以 HTTP 模式克隆下來。因此,我編寫了一個簡單的腳本來完成這個任務,並在這裡做了一些筆記。

假設腳本的文件名為 gitlab-repo-dl.sh,需要準備的參數包括 GITLAB_URLGITLAB_TOKEN

執行方法如下:

GITLAB_URL=https://gitlab.com/ GITLAB_TOKEN=cnLzue2_VVUVVVSSSwww ./gitlab-repo-dl.sh

以下是腳本的內容:

#!/usr/bin/env bash

if [ -z "$GITLAB_URL" ]; then
    echo "Missing environment variable: GITLAB_URL (e.g. https://gitlab.com)"
    exit 1
fi

if [ -z "$GITLAB_TOKEN" ]; then
    echo "Missing environment variable: GITLAB_TOKEN"
    echo "See ${GITLAB_URL}profile/account."
    exit 1
fi

echo "Cloning all git projects..."

PAGE_NUMBER=1
while true; do
    REPO_SSH_URLS=$(curl -s "$GITLAB_URL/api/v4/projects?private_token=$GITLAB_TOKEN&per_page=100&page=$PAGE_NUMBER" | jq '.[] | .http_url_to_repo' | sed 's/"//g')

    if [ -z "$REPO_SSH_URLS" ]; then
        break
    fi

    for REPO_SSH_URL in $REPO_SSH_URLS; do
        REPO_PATH="$(echo "$REPO_SSH_URL" | awk -F'/' '{print $NF}' | awk -F'.' '{print $1}')"

        if [ ! -d "$REPO_PATH" ]; then
            echo "git clone $REPO_PATH"
            git clone "$REPO_SSH_URL" "$REPO_PATH"
        else
            echo "git pull $REPO_PATH"
            (cd "$REPO_PATH" && git pull)
        fi
    done

    ((PAGE_NUMBER++))
done