From 66958c14253967b104dee092214dd8a88dcbf848 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claude=20=28=E6=9C=AC=E6=A9=9F=E7=B8=BD=E7=AE=A1=29?= Date: Sat, 18 Jul 2026 20:21:42 +0800 Subject: [PATCH] =?UTF-8?q?chore(gc):=20GitHub=20=E5=85=AC=E9=96=8B=20mirr?= =?UTF-8?q?or=20=E7=AE=A1=E7=B7=9A(publish-github.sh+=E6=8E=92=E9=99=A4?= =?UTF-8?q?=E6=B8=85=E5=96=AE)=E2=80=94=E2=80=94publish=20=E5=89=8D=20GC,?= =?UTF-8?q?=E6=9C=AC=20repo=20=E5=85=A7=E5=AE=B9=E6=8E=83=E6=8F=8F?= =?UTF-8?q?=E4=B9=BE=E6=B7=A8=E5=85=A8=E9=87=8F=E9=8F=A1=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++ scripts/github-publish-exclude.txt | 7 ++++ scripts/publish-github.sh | 67 ++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+) create mode 100644 .gitignore create mode 100644 scripts/github-publish-exclude.txt create mode 100755 scripts/publish-github.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..225331d --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ + +# GitHub 公開 mirror 工作目錄(publish-github.sh 產物) +.github-public/ diff --git a/scripts/github-publish-exclude.txt b/scripts/github-publish-exclude.txt new file mode 100644 index 0000000..4dedae5 --- /dev/null +++ b/scripts/github-publish-exclude.txt @@ -0,0 +1,7 @@ +# GitHub 公開 mirror 排除清單(publish-github.sh 用) +# 本 repo 已是 public demo 知識庫,內容經掃描無機敏——預設全量鏡射。 +# 若日後要排除路徑,一行一個(相對 repo 根),# 開頭為註解。 + +# 本 publish 管線自身(公開端不需要) +scripts/publish-github.sh +scripts/github-publish-exclude.txt diff --git a/scripts/publish-github.sh b/scripts/publish-github.sh new file mode 100755 index 0000000..7085a8f --- /dev/null +++ b/scripts/publish-github.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash +# publish-github.sh — 產生過濾後的公開樹,維護 GitHub public mirror(乾淨歷史) +# +# 模型(D22 拍板):Gitea = 私有真相源(全量,含內部 wiki/SDD) +# GitHub = 公開櫥窗(過濾樹 + 每次發版一個 release commit,不帶內部歷史) +# 流量紅線(D20):push 前需 leo 親跑 github-arm.sh 解保險;低頻手動、單 repo、不掛 Actions。 +# +# 用法: +# scripts/publish-github.sh # 只建/更新本機 mirror(.github-public/),不 push +# scripts/publish-github.sh --push # 另加 push(需 env GITHUB_REMOTE=https://github.com/<帳號>/.git) +# +# 排除清單:scripts/github-publish-exclude.txt(一行一個路徑,相對 repo 根;# 開頭為註解) +set -euo pipefail + +REPO_ROOT="$(git rev-parse --show-toplevel)" +EXCLUDE_FILE="$REPO_ROOT/scripts/github-publish-exclude.txt" +MIRROR_DIR="${MIRROR_DIR:-$REPO_ROOT/.github-public}" +GITHUB_REMOTE="${GITHUB_REMOTE:-}" + +TMP_EXPORT="$(mktemp -d)" +trap 'rm -rf "$TMP_EXPORT"' EXIT + +# 1) 只匯出 HEAD 的 tracked 檔(.env / credentials 等 untracked 永不混入) +git -C "$REPO_ROOT" archive HEAD | tar -x -C "$TMP_EXPORT" + +# 2) LFS 檔用實體內容取代 pointer(公開端不吃 LFS) +if command -v git-lfs >/dev/null 2>&1; then + git -C "$REPO_ROOT" lfs ls-files --name-only 2>/dev/null | while IFS= read -r f; do + if [ -n "$f" ] && [ -f "$REPO_ROOT/$f" ]; then + mkdir -p "$TMP_EXPORT/$(dirname "$f")" + cp "$REPO_ROOT/$f" "$TMP_EXPORT/$f" + fi + done +fi + +# 3) 套排除清單 +while IFS= read -r p; do + case "$p" in ''|\#*) continue ;; esac + rm -rf "${TMP_EXPORT:?}/$p" +done < "$EXCLUDE_FILE" + +# 4) 同步進常駐 mirror(mirror 自己的 .git = 公開端乾淨歷史) +mkdir -p "$MIRROR_DIR" +[ -d "$MIRROR_DIR/.git" ] || git -C "$MIRROR_DIR" init -q -b main +rsync -a --delete --exclude='.git' "$TMP_EXPORT/" "$MIRROR_DIR/" + +cd "$MIRROR_DIR" +git add -A +if git diff --cached --quiet && git rev-parse -q --verify HEAD >/dev/null; then + echo "ℹ️ 無變更,mirror 已是最新" +else + git -c user.name="Arcrun Release" -c user.email="release@arcrun.dev" \ + commit -q -m "release: snapshot $(git -C "$REPO_ROOT" rev-parse --short HEAD) ($(git -C "$REPO_ROOT" log -1 --format=%cd --date=short))" + echo "✅ mirror 已更新:$(git log --oneline -1)" +fi +echo "📁 mirror:${MIRROR_DIR}($(git rev-list --count HEAD) 個公開 commit)" + +if [ "${1:-}" = "--push" ]; then + if [ -z "$GITHUB_REMOTE" ]; then + echo "❌ 缺 GITHUB_REMOTE(例:https://github.com/<帳號>/.git)" >&2 + exit 1 + fi + git remote remove github 2>/dev/null || true + git remote add github "$GITHUB_REMOTE" + git push -u github main + echo "🚀 已 push → $GITHUB_REMOTE" +fi