最近,我的一位同事提出了一個需求,需要將某個帳號下的所有儲存庫都以 HTTP 模式克隆下來。因此,我編寫了一個簡單的腳本來完成這個任務,並在這裡做了一些筆記。
假設腳本的文件名為 gitlab-repo-dl.sh,需要準備的參數包括 GITLAB_URL 和 GITLAB_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