From f3fa427702b86c930f9d98ae112d4e002b5ef4f1 Mon Sep 17 00:00:00 2001 From: figmar Date: Thu, 6 Aug 2026 09:14:17 +0800 Subject: [PATCH] Publish gitea-publish via gitea-publish skill --- SKILL.md | 7 ++++++- publish.sh | 18 ++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/SKILL.md b/SKILL.md index d3353ef..16d0630 100644 --- a/SKILL.md +++ b/SKILL.md @@ -36,6 +36,7 @@ bash /publish.sh \ --url "$GITEA_URL" \ --user "$GITEA_USER" \ --token "$GITEA_TOKEN" \ + [--display-url "$GITEA_DISPLAY_URL"] \ # 可选:对外展示的公开域名,默认 https://gitea.apescale.com [--private] # 可选:创建私有仓库 [--branch <分支>] # 可选:指定默认分支,默认 main ``` @@ -47,7 +48,7 @@ bash /publish.sh \ 1. 调用 Gitea API `GET /api/v1/repos/{user}/{repo}` 检查仓库是否存在; 不存在则用 `POST /api/v1/user/repos` 创建(支持 `--private`)。 2. 在 `--path` 内执行 `git init`(若尚未初始化),提交全部文件。 -3. 设置 remote 为 `https://:@//.git` 并推送默认分支。 +3. 设置 remote 为 `://:@//.git` 并推送默认分支。协议(http/https)从 `--url` 参数自动提取。 4. 若远程已有内容,先 `pull --rebase` 再推送,降低冲突风险。 ## 注意事项 @@ -55,3 +56,7 @@ bash /publish.sh \ - 凭据仅用于本次建仓/推送,不要写入仓库或回显到聊天记录。 - 默认分支优先使用 `main`,回退到 `master`。 - 该技能可"自举":开发完成后,用它把自身(即本目录)发布到 Gitea。 +- **协议自适应**:脚本从 `--url` 中提取协议(`http://` 或 `https://`),不再硬编码 `https://`。HTTP-only 的 Gitea 实例也可正常推送。 +- **代理环境**:若运行环境有全局代理(如沙箱),需设置 `no_proxy='*'` 或在命令前添加 `http_proxy='' https_proxy=''`,否则 curl/git 可能走代理导致连接失败。 +- **凭据自动发现**:若用户未显式提供凭据,可检查 macOS 钥匙串(`git credential-osxkeychain get`)和 `~/.ssh/config`(Host 条目)自动发现 Gitea 地址和凭据。 +- **对外地址始终为公开域名**:脚本把"实际推送/API 端点"与"对外展示的 Web 地址"解耦。无论 `--url`(或 `GITEA_URL`)是内网 IP、端口还是其他主机名,最终打印给用户的仓库地址都落在 `--display-url` / `GITEA_DISPLAY_URL` 指定的公开域名下(默认 `https://gitea.apescale.com`),绝不把内网主机名或带凭据的 URL 透出。 diff --git a/publish.sh b/publish.sh index 767ea17..4a9eadb 100755 --- a/publish.sh +++ b/publish.sh @@ -9,6 +9,7 @@ PATH_="" URL="${GITEA_URL:-}" USER="${GITEA_USER:-}" TOKEN="${GITEA_TOKEN:-}" +DISPLAY_URL="" PRIVATE="false" BRANCH="" @@ -17,6 +18,7 @@ while [[ $# -gt 0 ]]; do --repo) REPO="$2"; shift 2;; --path) PATH_="$2"; shift 2;; --url) URL="$2"; shift 2;; + --display-url) DISPLAY_URL="$2"; shift 2;; --user) USER="$2"; shift 2;; --token) TOKEN="$2"; shift 2;; --private) PRIVATE="true"; shift;; @@ -36,6 +38,13 @@ done # 规范化:去掉结尾斜杠 URL="${URL%/}" +# 对外透出的 Web 地址:默认使用公开域名 gitea.apescale.com。 +# 即使 git 推送 / API 调用走的是内网地址或 IP,最终展示给用户的链接 +# 也始终落在公开域名下,避免把内网主机名 / IP 直接暴露出来。 +DISPLAY_URL="${DISPLAY_URL:-${GITEA_DISPLAY_URL:-https://gitea.apescale.com}}" +DISPLAY_URL="${DISPLAY_URL%/}" +WEB_URL="$DISPLAY_URL/$USER/$REPO" + # 对凭据做 URL 百分号编码(口令可能含 # $ @ 等特殊字符) urlencode() { python3 -c 'import sys,urllib.parse;print(urllib.parse.quote(sys.argv[1],safe=""))' "$1"; } U_ENC="$(urlencode "$USER")" @@ -52,9 +61,10 @@ fi [[ -z "$BRANCH" ]] && BRANCH="main" API="$URL/api/v1" -HOST="${URL#*//}" -REMOTE_CLEAN="https://$HOST/$USER/$REPO.git" -REMOTE_AUTH="https://$AUTH_ENC@$HOST/$USER/$REPO.git" +PROTO="${URL%%://*}" # 从 URL 提取协议 (http 或 https) +HOST="${URL#*//}" # 提取主机+端口 +REMOTE_CLEAN="$PROTO://$HOST/$USER/$REPO.git" +REMOTE_AUTH="$PROTO://$AUTH_ENC@$HOST/$USER/$REPO.git" echo "==> 检查仓库 $USER/$REPO 是否存在 ..." HTTP="$(curl -sS -o /dev/null -w '%{http_code}' -u "$AUTH_RAW" "$API/repos/$USER/$REPO")" @@ -106,4 +116,4 @@ fi # 用一次性带口令 URL 推送,不设置含口令的 upstream git push "$REMOTE_AUTH" "$BRANCH" git branch --set-upstream-to="origin/$BRANCH" 2>/dev/null || true -echo "==> 完成。仓库地址: $URL/$USER/$REPO" +echo "==> 完成。仓库地址: $WEB_URL"