#!/bin/sh # 一次性迁移辅助 (Plane VPS-94 Phase 2): 在 gitea 容器内执行。 # 已于 2026-09-18 执行完成 (16 仓), 留档备查; 复用时按 VPS-94 流程重生成一次性 token。 # 用法: # GITEA_MIGRATE_USER= GITEA_MIGRATE_TOKEN= \ # docker exec -e GITEA_MIGRATE_USER -e GITEA_MIGRATE_TOKEN gitea \ # /scripts/mirror-migrate.sh [public_repo ...] # 每仓: API 建仓 (默认 private, 参数中列出的为 public) -> push --mirror。 # default_branch 按源仓 symbolic-ref HEAD 设置, 避免非 main 源仓在 Gitea 显示为空。 # 结束后按 VPS-94 Phase 3 逐仓核对 git ls-remote ref 全集。 set -eu MUSER="${GITEA_MIGRATE_USER:?need GITEA_MIGRATE_USER}" TOKEN="${GITEA_MIGRATE_TOKEN:?need GITEA_MIGRATE_TOKEN}" SRC="/migration-src" API="http://localhost:3000/api/v1" PUBLIC_REPOS=" $* " migrate_one() { dir="$1" git -C "$dir" rev-parse --git-dir >/dev/null 2>&1 || { echo "[SKIP] $dir (not a git repo)"; return 0; } name=$(basename "$dir"); name=${name%.git} def_branch=$(git -C "$dir" symbolic-ref --short HEAD) case "$PUBLIC_REPOS" in *" $name "*) private=false ;; *) private=true ;; esac echo "[MIGRATE] $name (default=$def_branch private=$private)" code=$(curl -s -o /dev/null -w '%{http_code}' -X POST "$API/user/repos" \ -H "Authorization: token $TOKEN" -H "Content-Type: application/json" \ -d "{\"name\":\"$name\",\"private\":$private,\"default_branch\":\"$def_branch\",\"auto_init\":false}") case "$code" in 201) : ;; 409) echo " [WARN] $name 已存在, 直接补推" ;; *) echo " [FAIL] create HTTP $code"; return 1 ;; esac git -C "$dir" push --mirror "http://$MUSER:$TOKEN@localhost:3000/$MUSER/$name.git" echo " [OK] $name pushed" } for dir in "$SRC"/*.git "$SRC"/cdia; do [ -d "$dir" ] || continue migrate_one "$dir" done echo "[DONE] 全部处理完毕; 迁移后记得撤销一次性 token"