diff --git a/STATUS.md b/STATUS.md index c28b9b6..64cb633 100644 --- a/STATUS.md +++ b/STATUS.md @@ -4,9 +4,9 @@ ## 本次任务 -审查并精简 ChatGPT 的建库建议 → 生成骨架文件 → 配置 conda 与 venv 环境 → 初始化 git 仓库。 +审查并精简 ChatGPT 的建库建议 → 生成骨架文件 → 配置 conda 与 venv 环境 → 初始化 git 仓库 → 接入 Gitea 远端。 -**结论:全部完成。** 两套环境均已建成并通过验证;本地仓库已初始化并完成首次提交。 +**结论:全部完成。** 两套环境均已建成并通过验证;仓库已推送到 `code.guzhujushi.cn`。 ## 任务清单 @@ -53,6 +53,10 @@ `5319589`(76 文件 / 6812 行),工作区干净 - [x] `git ls-files --eol` 复核:**全部 LF**,`.gitattributes` 生效 - [x] 仓库由**本人账户 guzhu** 创建(见决策 17) +- [x] **远端 Gitea 已接通并推送**:`origin` = `git@code.guzhujushi.cn:guzhujushi/MCM-ICM_Toolkit.git`, + `main` 跟踪 `origin/main`,远端 HEAD = `96080b9`,76 个文件已在服务器上(见决策 19/20) +- [x] 推送通道:公网 22 被防火墙过滤 → 改用 Tailscale(`100.115.86.48:22`), + `~/.ssh/config` 加了一条域名别名,remote 里仍写域名 ### 验证结果 @@ -73,8 +77,8 @@ - [x] ~~两套环境版本不一致~~ → **已解决**:base 升级到 2026.07 后, numpy/scipy/pandas/matplotlib/sklearn/statsmodels/networkx/sympy 版本完全一致, 只差 Python 补丁号(3.13.9 vs 3.13.15)。详见 `docs/04-environment.md` §5。 -- [ ] **Gitea 远程尚未配置**:本地仓库已就绪(`main` / `5319589`), - 只差你自己的 Gitea 地址。命令见 `docs/05-git-workflow.md` §3。 +- [x] ~~Gitea 远程尚未配置~~ → **已配置并推送完成**,见上面 D 节与决策 19/20。 + note:仓库当前是 **Public**(匿名 `git ls-remote` 可读),要改私有去 Gitea 仓库设置。 - [ ] 所有函数实现尚未开始(按 L0 → L1 顺序,见 `docs/03-roadmap.md`) - [ ] 本机 `exec_command` 在沙箱模式下**完全不可用** (`helper_unknown_error: setup refresh had errors`),只有提权 @@ -108,11 +112,13 @@ | 16 | 新增 `.gitattributes` 强制 LF | 仓库要给队友在 Windows/WSL/Linux 上 clone,不固定行尾会产生"整文件都变了"的假 diff | | 17 | `.git` 由**本人账户 guzhu** 重建,不做 `safe.directory` 豁免 | 沙箱通道建的 `.git` Owner 是 `CodexSandboxOffline`,git 会报 dubious ownership。加全局豁免是把问题藏起来;直接以本人账户重建,仓库和远程(Gitea)身份一致 | | 18 | `core.autocrlf=false`(仓库级) | 配合 `.gitattributes` 的 LF 策略,避免 Windows 上 checkout 又转成 CRLF | +| 19 | Gitea 的 SSH **走 Tailscale 内网**,不在公网开 22 | 实测公网 `8.145.36.108:22` 超时(服务器侧过滤,本机出站 22 没被封:github.com:22 可通),而 Tailscale `100.115.86.48:22` 可达且 `git@` 认证直接过 Gitea。remote 里仍写域名,域名→内网 IP 的映射放在 `~/.ssh/config`,换机只改一处 | +| 20 | 首次推送用 `--force-with-lease` **覆盖** Gitea 的 `Initial commit` | 远端那个提交是建仓时自动初始化产生的,与本地无共同祖先,普通 push 必被拒。推送前已把其中的 LICENSE 与手写简介并入本地 `README.md`,原提交仍留在本机对象库(`1c683cf`) | ## 下一步 -1. 在 Gitea 建**空**仓库(不要初始化)→ `git remote add origin ...` → `git push -u origin main` - (命令见 `docs/05-git-workflow.md` §3,HTTPS 与 SSH 两版都有)。 +1. ~~接入 Gitea~~ **已完成**。以后推送前先确认 Tailscale 在线,然后 `git push` + (细节与换机步骤见 `docs/05-git-workflow.md` §3)。 2. 按 `docs/03-roadmap.md` 的 **L0(12 个函数)** 顺序填实现,先写测试再写代码。 3. 每写完一个函数,在 `examples/` 里加一行最小用法,并更新本文件。 4. L0 跑通后,找一道真题(建议 2025 C)走完整流程,反向沉淀函数。 diff --git a/docs/05-git-workflow.md b/docs/05-git-workflow.md index 45b2910..8559624 100644 --- a/docs/05-git-workflow.md +++ b/docs/05-git-workflow.md @@ -67,40 +67,73 @@ git commit -m "feat(stats): 实现 bootstrap_ci" --- -## 三、推到自己的 Gitea +## 三、远程托管(已配置) -### 1. 在 Gitea 上建空仓库 +| 项 | 值 | +|---|---| +| Gitea 网页 | https://code.guzhujushi.cn/guzhujushi/MCM-ICM_Toolkit | +| 服务器公网 IP | `8.145.36.108`(实测只开了 443,**22 被防火墙过滤**) | +| 服务器 Tailscale IP | `100.115.86.48`(22 开放) | +| 本机 Tailscale IP | `100.124.243.30` | +| git 远端 | `git@code.guzhujushi.cn:guzhujushi/MCM-ICM_Toolkit.git` | -不要勾选"初始化仓库"(不要生成 README / .gitignore / LICENSE), -否则首次 push 会冲突。 +### 为什么走 Tailscale -### 2. 加远程并推送 +公网 22 端口连不上(`ssh: connect to host code.guzhujushi.cn port 22: Connection timed out`), +但同一台机器的 Tailscale 地址 22 端口是通的,且 `git@` 认证直接通过 Gitea。 +所以 `~/.ssh/config` 里加了一条别名把域名指到内网地址: + +```sshconfig +Host code.guzhujushi.cn + HostName 100.115.86.48 + User git + IdentityFile ~/.ssh/id_ed25519 +``` + +这样 remote 里写的是域名,换机时只改这一段 config,不用动仓库配置。 + +**推送前先连上 Tailscale**,否则 `git push` 会一直等到超时。 + +### 自检 + +```powershell +ssh -T git@code.guzhujushi.cn +# 期望输出:Hi there, guzhujushi! You've successfully authenticated with the key named ... +``` + +### 日常推送 ```powershell cd D:\MCM&ICM_Toolkit - -# 换成你自己的 Gitea 地址 -git remote add origin https://git.你的域名/用户名/mcm-icm-toolkit.git - -# 如果 Gitea 用的是自签证书,先在浏览器里访问一次并信任,或: -# git config --global http.sslBackend schannel - -git branch -M main -git push -u origin main +git add -A +git commit -m "feat(stats): 实现 bootstrap_ci" +git push ``` -### 3. 用 SSH(推荐,免密) +### 换一台机器 / 加一个协作者 ```powershell -ssh-keygen -t ed25519 -C "guzhu@mcm-toolkit" +# 1) 装 Tailscale 并加入同一个 tailnet +# 2) 生成并上传密钥 +ssh-keygen -t ed25519 -C "your@email" Get-Content "$env:USERPROFILE\.ssh\id_ed25519.pub" | Set-Clipboard -# 粘贴到 Gitea → 设置 → SSH/GPG 密钥 - -git remote set-url origin git@git.你的域名:用户名/mcm-icm-toolkit.git -git push -u origin main +# 粘贴到 Gitea → 设置 → SSH/GPG 密钥 +# 3) 写上面的 ~/.ssh/config 别名 +# 4) 克隆 +git clone git@code.guzhujushi.cn:guzhujushi/MCM-ICM_Toolkit.git ``` -### 4. 仓库归属注意(重要) +不想用 Tailscale 的话,也可以用 HTTPS + Gitea 访问令牌, +代价是每次推送要输凭据(或交给凭据助手缓存): + +```powershell +git remote add origin https://code.guzhujushi.cn/guzhujushi/MCM-ICM_Toolkit.git +``` + +> 注意:`git config --global http.proxy` 目前指向 UniClash(`127.0.0.1:7993`), +> HTTPS 方式会被代理绕一圈;SSH 方式不受该配置影响。 + +### 仓库归属注意(重要) `.git` 必须是**你自己的账户**创建的。若用沙箱化的 AI agent 通道代跑 `git init`, 它可能以别的账户身份创建 `.git`,之后你自己跑 git 就会报: @@ -118,12 +151,10 @@ git push -u origin main 同理,沙箱通道写出的文件 Owner 会是沙箱账户,但权限继承自 `Authenticated Users`(Modify),读写不受影响,只有 git 的归属检查会误报。 -### 5. 如果不想公开 +### 可见性与协作者 -Gitea 建仓库时选 **Private**。队友通过 -仓库设置 → 协作者 → 添加成员 授权。 - ---- +匿名 `git ls-remote` 实测可读 → 仓库当前是 **Public**。要改私有: +仓库设置 → 基本设置 → 可见性。加队友:仓库设置 → 协作者 → 添加成员。 ## 四、给队友的说明 @@ -146,6 +177,9 @@ cd mcm-icm-toolkit 环境升级出问题时的回退手段: ```powershell +# 远端被覆盖过一次(首次推送),那个提交仍在本机对象库里: +# git push origin 1c683cf:refs/heads/restore-initial + # conda 自己保留了 revision 历史 conda list -n base --revisions conda install -n base --revision