docs: 记录 Gitea 远端接入方式

- STATUS.md:Gitea 接入标记完成,补充远端/分支/推送通道信息;
  新增决策 19(SSH 走 Tailscale 内网)与 20(首次推送 force-with-lease 的取舍)
- docs/05-git-workflow.md:第三节改写为实际拓扑(公网 22 被过滤、
  走 Tailscale + ~/.ssh/config 域名别名),补自检、日常推送、换机步骤,
  并保留仓库归属注意、补充可见性与协作者说明;
  回滚一节记录被覆盖提交的恢复命令
This commit is contained in:
guzhujushi committed 2026-10-01 17:56:12 +08:00
1 parent 96080b9dcc
commit bcdbdd35a3
2 files changed
+72 -32

No files matched your search

+12 -6
View File
@@ -4,9 +4,9 @@
## 本次任务 ## 本次任务
审查并精简 ChatGPT 的建库建议 → 生成骨架文件 → 配置 conda 与 venv 环境 → 初始化 git 仓库。 审查并精简 ChatGPT 的建库建议 → 生成骨架文件 → 配置 conda 与 venv 环境 → 初始化 git 仓库 → 接入 Gitea 远端。
**结论:全部完成。** 两套环境均已建成并通过验证;本地仓库已初始化并完成首次提交。 **结论:全部完成。** 两套环境均已建成并通过验证;仓库已推送到 `code.guzhujushi.cn`。
## 任务清单 ## 任务清单
@@ -53,6 +53,10 @@
`5319589`(76 文件 / 6812 行),工作区干净 `5319589`(76 文件 / 6812 行),工作区干净
- [x] `git ls-files --eol` 复核:**全部 LF**,`.gitattributes` 生效 - [x] `git ls-files --eol` 复核:**全部 LF**,`.gitattributes` 生效
- [x] 仓库由**本人账户 guzhu** 创建(见决策 17) - [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 后, - [x] ~~两套环境版本不一致~~ → **已解决**:base 升级到 2026.07 后,
numpy/scipy/pandas/matplotlib/sklearn/statsmodels/networkx/sympy 版本完全一致, numpy/scipy/pandas/matplotlib/sklearn/statsmodels/networkx/sympy 版本完全一致,
只差 Python 补丁号(3.13.9 vs 3.13.15)。详见 `docs/04-environment.md` §5。 只差 Python 补丁号(3.13.9 vs 3.13.15)。详见 `docs/04-environment.md` §5。
- [ ] **Gitea 远程尚未配置**:本地仓库已就绪(`main` / `5319589`), - [x] ~~Gitea 远程尚未配置~~ → **已配置并推送完成**,见上面 D 节与决策 19/20。
只差你自己的 Gitea 地址。命令见 `docs/05-git-workflow.md` §3。 note:仓库当前是 **Public**(匿名 `git ls-remote` 可读),要改私有去 Gitea 仓库设置。
- [ ] 所有函数实现尚未开始(按 L0 → L1 顺序,见 `docs/03-roadmap.md`) - [ ] 所有函数实现尚未开始(按 L0 → L1 顺序,见 `docs/03-roadmap.md`)
- [ ] 本机 `exec_command` 在沙箱模式下**完全不可用** - [ ] 本机 `exec_command` 在沙箱模式下**完全不可用**
(`helper_unknown_error: setup refresh had errors`),只有提权 (`helper_unknown_error: setup refresh had errors`),只有提权
@@ -108,11 +112,13 @@
| 16 | 新增 `.gitattributes` 强制 LF | 仓库要给队友在 Windows/WSL/Linux 上 clone,不固定行尾会产生"整文件都变了"的假 diff | | 16 | 新增 `.gitattributes` 强制 LF | 仓库要给队友在 Windows/WSL/Linux 上 clone,不固定行尾会产生"整文件都变了"的假 diff |
| 17 | `.git` 由**本人账户 guzhu** 重建,不做 `safe.directory` 豁免 | 沙箱通道建的 `.git` Owner 是 `CodexSandboxOffline`,git 会报 dubious ownership。加全局豁免是把问题藏起来;直接以本人账户重建,仓库和远程(Gitea)身份一致 | | 17 | `.git` 由**本人账户 guzhu** 重建,不做 `safe.directory` 豁免 | 沙箱通道建的 `.git` Owner 是 `CodexSandboxOffline`,git 会报 dubious ownership。加全局豁免是把问题藏起来;直接以本人账户重建,仓库和远程(Gitea)身份一致 |
| 18 | `core.autocrlf=false`(仓库级) | 配合 `.gitattributes` 的 LF 策略,避免 Windows 上 checkout 又转成 CRLF | | 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` 1. ~~接入 Gitea~~ **已完成**。以后推送前先确认 Tailscale 在线,然后 `git push`
(命令见 `docs/05-git-workflow.md` §3,HTTPS 与 SSH 两版都有)。 (细节与换机步骤见 `docs/05-git-workflow.md` §3)。
2. 按 `docs/03-roadmap.md` 的 **L0(12 个函数)** 顺序填实现,先写测试再写代码。 2. 按 `docs/03-roadmap.md` 的 **L0(12 个函数)** 顺序填实现,先写测试再写代码。
3. 每写完一个函数,在 `examples/` 里加一行最小用法,并更新本文件。 3. 每写完一个函数,在 `examples/` 里加一行最小用法,并更新本文件。
4. L0 跑通后,找一道真题(建议 2025 C)走完整流程,反向沉淀函数。 4. L0 跑通后,找一道真题(建议 2025 C)走完整流程,反向沉淀函数。
+60 -26
View File
@@ -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), ### 为什么走 Tailscale
否则首次 push 会冲突。
### 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 ```powershell
cd D:\MCM&ICM_Toolkit cd D:\MCM&ICM_Toolkit
git add -A
# 换成你自己的 Gitea 地址 git commit -m "feat(stats): 实现 bootstrap_ci"
git remote add origin https://git.你的域名/用户名/mcm-icm-toolkit.git git push
# 如果 Gitea 用的是自签证书,先在浏览器里访问一次并信任,或:
# git config --global http.sslBackend schannel
git branch -M main
git push -u origin main
``` ```
### 3. 用 SSH(推荐,免密) ### 换一台机器 / 加一个协作者
```powershell ```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 Get-Content "$env:USERPROFILE\.ssh\id_ed25519.pub" | Set-Clipboard
# 粘贴到 Gitea → 设置 → SSH/GPG 密钥 # 粘贴到 Gitea → 设置 → SSH/GPG 密钥
# 3) 写上面的 ~/.ssh/config 别名
git remote set-url origin git@git.你的域名:用户名/mcm-icm-toolkit.git # 4) 克隆
git push -u origin main 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` 必须是**你自己的账户**创建的。若用沙箱化的 AI agent 通道代跑 `git init`,
它可能以别的账户身份创建 `.git`,之后你自己跑 git 就会报: 它可能以别的账户身份创建 `.git`,之后你自己跑 git 就会报:
@@ -118,12 +151,10 @@ git push -u origin main
同理,沙箱通道写出的文件 Owner 会是沙箱账户,但权限继承自 同理,沙箱通道写出的文件 Owner 会是沙箱账户,但权限继承自
`Authenticated Users`(Modify),读写不受影响,只有 git 的归属检查会误报。 `Authenticated Users`(Modify),读写不受影响,只有 git 的归属检查会误报。
### 5. 如果不想公开 ### 可见性与协作者
Gitea 建仓库时选 **Private**。队友通过 匿名 `git ls-remote` 实测可读 → 仓库当前是 **Public**。要改私有:
仓库设置 → 协作者 → 添加成员 授权。 仓库设置 → 基本设置 → 可见性。加队友:仓库设置 → 协作者 → 添加成员。
---
## 四、给队友的说明 ## 四、给队友的说明
@@ -146,6 +177,9 @@ cd mcm-icm-toolkit
环境升级出问题时的回退手段: 环境升级出问题时的回退手段:
```powershell ```powershell
# 远端被覆盖过一次(首次推送),那个提交仍在本机对象库里:
# git push origin 1c683cf:refs/heads/restore-initial
# conda 自己保留了 revision 历史 # conda 自己保留了 revision 历史
conda list -n base --revisions conda list -n base --revisions
conda install -n base --revision <N> conda install -n base --revision <N>