Script สำหรับวนลูปทุกโฟลเดอร์ แล้วทำการ เปลี่ยน GIT URL ให้เป็นแบบที่ฝัง personal access tokens ใหม่ (glpat-...) เข้าไปให้โดยอัตโนมัติครับ และฉลาดพอที่จะ ดึงชื่อโปรเจกต์เดิม (เช่น phunsanit/snippets) , host (github, gitlab) , username (pitt.p) มาใช้ต่อ ทำให้คุณไม่ต้องมากรอกชื่อโปรเจกต์ใหม่ทีละอัน ที่ละ repository
- ไปที่ root ของ Multi-repo เช่น
cd /Users/Shared/Gits/phunsanit - สร้างไฟล์
touch git-update-personal-access-tokens-all.sh - set permission
sudo chmod +x git-update-personal-access-tokens-all.sh - ใส่เนื้อหา
git-update-personal-access-tokens-all.sh
#!/bin/bash
# Clear screen
clear
echo "======================================================="
echo " GIT TOKEN CHECKER & UPDATER"
echo "======================================================="
echo ""
# ---------------------------------------------------------
# 1. Auto-Detect Status
# ---------------------------------------------------------
DEFAULT_HOST=""
DEFAULT_USER=""
HAS_TOKEN=false
# Find the first repo to check status
FIRST_REPO=$ (find . -maxdepth 2 -type d -name ".git" | head -n 1) if [ -n "$FIRST_REPO" ]; then
REPO_DIR=$ (dirname "$FIRST_REPO") # Use 'git -C' to check URL safely
CURRENT_URL=$ (git -C "$REPO_DIR" remote get-url origin) # Check for '@' (If present, credentials are embedded) if [[ "$CURRENT_URL" == *"@"* ]]; then
HAS_TOKEN=true
fi
# Extract Host & User for default values
CLEAN_HOST=$ (echo "$CURRENT_URL" | sed -E 's|https://||' | sed -E 's|http://||' | sed -E 's|git@||' | sed -E 's/.*@//' | sed -E 's|/.*||' | sed -E 's|:.*||') if [ -n "$CLEAN_HOST" ]; then DEFAULT_HOST=$CLEAN_HOST; fi
if [[ "$CURRENT_URL" == *"https://"* && "$CURRENT_URL" == *"@"* ]]; then
TEMP_USER=$ (echo "$CURRENT_URL" | sed -E 's/https:\/\/ ([^:@]*) .*/\1/') if [ -n "$TEMP_USER" ]; then DEFAULT_USER=$TEMP_USER; fi
fi
else
echo "❌ Error: No Git repository found in this folder."
exit 1
fi
# ---------------------------------------------------------
# 2. Status Report & Decision
# ---------------------------------------------------------
if [ "$HAS_TOKEN" = false ]; then
# Case: No Token found
echo "⚠️ Current Status: No Access Token embedded (Clean URL) "
echo " (System might be using Keychain or SSH Key) "
echo ""
read -p "❓ Do you want to switch to 'Embedded Token' mode? (y/n) : " DECISION
else
# Case: Token found
echo "ℹ️ Current Status: Token is already embedded."
echo ""
# NEW: Ask before updating
read -p "❓ Do you want to UPDATE/REPLACE the existing token? (y/n) : " DECISION
fi
# ---------------------------------------------------------
# 3. Process Decision
# ---------------------------------------------------------
# If answer is NOT 'y' or 'Y', exit
if [[ "$DECISION" != "y" && "$DECISION" != "Y" ]]; then
echo ""
echo "🛑 Operation cancelled. No changes made."
exit 0
fi
echo ""
echo "✅ Proceeding to update..."
echo "-------------------------------------------------------"
# ---------------------------------------------------------
# 4. Get Input
# ---------------------------------------------------------
# Host
DISP_HOST=${DEFAULT_HOST:-none}
read -p "🌐 Git Host [default: $DISP_HOST]: " INPUT_HOST
GIT_HOST=${INPUT_HOST:-$DEFAULT_HOST}
if [ -z "$GIT_HOST" ]; then echo "❌ Error: Host cannot be empty!"; exit 1; fi
# Username
DISP_USER=${DEFAULT_USER:-none}
read -p "👤 Username [default: $DISP_USER]: " INPUT_USER
GIT_USER=${INPUT_USER:-$DEFAULT_USER}
if [ -z "$GIT_USER" ]; then echo "❌ Error: Username cannot be empty!"; exit 1; fi
# Token
echo ""
read -s -p "🔑 New Personal Access Token (glpat-...) : " GIT_TOKEN
echo ""
if [ -z "$GIT_TOKEN" ]; then echo "❌ Error: Token cannot be empty!"; exit 1; fi
echo "-------------------------------------------------------"
echo "🔄 Updating URLs..."
# ---------------------------------------------------------
# 5. Execute Update
# ---------------------------------------------------------
for dir in */; do
dirname=${dir%/}
if [ -d "$dir/.git" ]; then (cd "$dir" || exit
CURRENT_URL=$ (git remote get-url origin) if [[ "$CURRENT_URL" == *"$GIT_HOST"* ]]; then
# Critical: Strip host prefix and remove leading spaces
RAW_PATH=$ (echo "$CURRENT_URL" | sed -E "s|.*$GIT_HOST[:/] (.*) |\1|") CLEAN_PATH=$ (echo "$RAW_PATH" | sed -E 's/^[[:space:]]+//') # Construct new URL
NEW_URL="https://${GIT_USER}:${GIT_TOKEN}@${GIT_HOST}/${CLEAN_PATH}"
git remote set-url origin "$NEW_URL"
echo "✅ [$dirname] Updated with Token."
else
echo "⚠️ [$dirname] Skipped (Host mismatch) "
fi) fi
done
echo "-------------------------------------------------------"
echo "🎉 All Done!"
ใช้โดยคำสั่ง
- ไปที่ root ของ Multi-repo เช่น
cd /Users/Shared/Gits/phunsanit - รัน
./git-update-personal-access-tokens-all.sh
อ่านเพิ่มเติม