远程开发环境升级:GitHub SSH 推送落地 + SMB 方案验证 + ESP32 串口优化
源代码管理 / 远程仓库(本次核心): - 新增 GitHub 私有仓库 Leo-z8/OrangePi_CM5_Project(镜像 Android 13 SDK 关键路径) - 本地 Git 仓库首次推送成功,远端 commit: c79995a30 - 白名单 .gitignore 追加通配符:device/rockchip/*/*/preinstall/*.apk - 2 个 120MB camera360.apk 从 Git 历史排除(超 GitHub 100MB 限制,需另存备份) - 认证方式切换为 SSH ed25519(ssh.github.com:443),永久免密,不依赖 Clash - PAT 一次性推送后已撤销,凭证文件已清理 文档更新(Tailscale + SSH 远程开发操作指南 → v3.1): - 4.5 新增 macOS SMB 挂载方案,并完整对比 Remote-SSH 在驱动开发场景下的差异 - 8.7 改写 GitHub 推送章节,SSH 为主推荐方案,HTTPS+PAT 降为应急备选 - 8.10 新增首次推送踩坑实录:100MB 单文件限制、git rev-list 去重陷阱、rwnd 瓶颈 - 8.11 新增实测数据:.git 774MB / 96,600 文件 / SSH 4-6 MiB/s 稳定无抖动 - 8.9 备份策略明确列出需另存的大文件清单 ESP32 HOLOMAIN 代码(02_HOLOMAIN_香橙派CM5开发板代码.ino): - processCommand 响应统一走 Serial(USB CDC),不再回写 SerialLinux(UART0) - 修复 Android 高频灯光命令占满 UART0 TX 导致 SORC_xxx/SO_BTx 刷卡数据延迟/丢失的问题 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
713cbd1835
commit
d6a1e28975
@ -400,8 +400,12 @@ void TaskBTN2code(void* pvParameters) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 处理单条完整命令
|
// 处理单条完整命令
|
||||||
// 参数 resp 指向发送方串口,命令响应会回到发送方(Windows 发命令 Windows 收响应,Android 同理)
|
// 响应统一发到 Serial (USB CDC / Windows 调试口),不回发给 SerialLinux (Android)
|
||||||
void processCommand(const String& command, Stream& resp) {
|
// 原因:Android 高频发灯光命令(音乐律动)时,若每条命令都回响应到 UART0 TX,
|
||||||
|
// 会堵塞业务数据 SORC_xxx / SO_BTx 的发送,导致刷卡后 Android 收到延迟甚至丢失
|
||||||
|
// 参数 src 仅用于保留调用兼容性,响应不再写入 src
|
||||||
|
void processCommand(const String& command, Stream& /*src*/) {
|
||||||
|
Stream& resp = Serial; // 所有命令响应只发 Windows 调试口
|
||||||
if (command.startsWith("MO_LED_")) {
|
if (command.startsWith("MO_LED_")) {
|
||||||
String modeStr = command.substring(7);
|
String modeStr = command.substring(7);
|
||||||
int newMode = modeStr.toInt();
|
int newMode = modeStr.toInt();
|
||||||
|
|||||||
@ -925,12 +925,53 @@ Host linux-vm
|
|||||||
|
|
||||||
之后直接 `ssh linux-vm` 即可连接。
|
之后直接 `ssh linux-vm` 即可连接。
|
||||||
|
|
||||||
## 4.4 VS Code Remote-SSH
|
## 4.4 VS Code Remote-SSH(推荐用于驱动开发)
|
||||||
|
|
||||||
1. VS Code 安装 Remote - SSH 扩展
|
1. VS Code 安装 Remote - SSH 扩展
|
||||||
2. Cmd+Shift+P → "Remote-SSH: Connect to Host"
|
2. Cmd+Shift+P → "Remote-SSH: Connect to Host"
|
||||||
3. 选择 linux-vm
|
3. 选择 linux-vm
|
||||||
4. 连接成功后打开文件夹 `/home/zhangwenqi/Radxa_CM5`
|
4. 连接成功后打开文件夹 `/home/zhangwenqi/OrangePi_CM5/Aandroid_OrangePi/merged/Android_13`
|
||||||
|
|
||||||
|
Remote-SSH 模式下 VS Code 的后端(vscode-server、扩展、终端)都跑在虚拟机上,Mac 只负责 UI。
|
||||||
|
编译、git、文件索引全都是虚拟机本地操作,性能和稳定性最佳。
|
||||||
|
|
||||||
|
## 4.5 SMB 挂载(轻量文件浏览/编辑,不适合驱动开发)
|
||||||
|
|
||||||
|
macOS 原生支持 SMB,通过 Tailscale 直接挂载虚拟机 Samba 共享目录:
|
||||||
|
|
||||||
|
**挂载方式**:
|
||||||
|
1. Finder → `⌘+K`(连接到服务器)
|
||||||
|
2. 输入:`smb://100.123.82.91`
|
||||||
|
3. 输入虚拟机用户名/密码
|
||||||
|
4. 选择要挂载的共享目录,挂载点位于 `/Volumes/<share_name>`
|
||||||
|
|
||||||
|
挂载成功后 VS Code 可直接打开挂载目录,像本地文件一样编辑。
|
||||||
|
|
||||||
|
### 适用场景(轻量用途)
|
||||||
|
|
||||||
|
| 用途 | 可行性 |
|
||||||
|
|------|--------|
|
||||||
|
| 临时查看/编辑几个配置文件 | ✅ |
|
||||||
|
| 快速预览源码结构 | ✅ |
|
||||||
|
| Finder 里拖文件到 Mac 备份 | ✅ |
|
||||||
|
| 打开整个 84GB SDK 做索引开发 | ⚠️ 首次索引慢 |
|
||||||
|
| 跑编译 / 烧录 / git 大仓库操作 | ❌ 必须 SSH 到虚拟机 |
|
||||||
|
| 让 Claude Code 自动编译调试 | ❌ Mac shell 无 Linux 工具链 |
|
||||||
|
|
||||||
|
### SMB 方案关键局限
|
||||||
|
|
||||||
|
1. **文件访问 ≠ 执行环境**:SMB 只能让 Mac 看到文件,无法在 Mac 上跑 Android 编译(缺 Rockchip 工具链、Docker、特定 Python/libncurses5 等依赖)
|
||||||
|
2. **符号链接支持有限**:Android SDK 含大量符号链接,SMB 可能表现异常
|
||||||
|
3. **Git 操作不稳定**:文件锁语义差异,`git status` 在 SMB 挂载目录上不可靠
|
||||||
|
4. **文件系统大小写**:macOS 默认大小写不敏感 + Linux 大小写敏感,可能冲突
|
||||||
|
5. **`.DS_Store` 污染**:Mac Finder 会在挂载目录留下元数据文件,进 git 会碍事
|
||||||
|
|
||||||
|
### 结论:两种方案如何选择
|
||||||
|
|
||||||
|
- **驱动开发主力**:Remote-SSH(编辑 + 编译 + 调试 + git 全部在虚拟机)
|
||||||
|
- **辅助场景**:SMB(只看几个文件、拖文件备份)
|
||||||
|
|
||||||
|
两者不冲突,可以同时配好,按需使用。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -1385,7 +1426,428 @@ sudo systemctl restart ssh
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
文档版本: 2.0
|
---
|
||||||
最后更新: 2026-04-15
|
|
||||||
适用系统: Ubuntu 20.04 LTS (x86_64), macOS
|
# 第八部分:Android SDK Git 代码管理
|
||||||
网络环境: 跨网络远程开发(Tailscale + ClashX Pro 共存)
|
|
||||||
|
## 8.1 方案说明
|
||||||
|
|
||||||
|
OrangePi CM5 Android 13 SDK 共 84GB、数十万文件,不可能全量入 Git。
|
||||||
|
采用**白名单 `.gitignore` 方案**:在 SDK 根目录初始化 Git,默认忽略所有文件,只放行会被修改的核心目录。
|
||||||
|
|
||||||
|
- Git 仓库路径:`~/OrangePi_CM5/Aandroid_OrangePi/merged/Android_13/`
|
||||||
|
- 远程仓库:GitHub(`OrangePi_CM5_Project`,Private)
|
||||||
|
- 首次推送(96,602 个文件,.git 约 1.3GB)约需 30-60 分钟
|
||||||
|
|
||||||
|
## 8.2 追踪的核心目录
|
||||||
|
|
||||||
|
| 目录 | 作用 |
|
||||||
|
|------|------|
|
||||||
|
| `device/rockchip/` | 产品配置、开机画面、init.rc、权限 |
|
||||||
|
| `kernel-5.10/arch/arm64/boot/dts/` | 设备树(屏幕/LED/NFC/GPIO 等) |
|
||||||
|
| `kernel-5.10/arch/arm64/configs/` | 内核配置文件 |
|
||||||
|
| `kernel-5.10/drivers/` | 内核驱动源码 |
|
||||||
|
| `kernel-5.10/include/` | 内核头文件 |
|
||||||
|
| `hardware/rockchip/` | Rockchip 硬件 HAL |
|
||||||
|
| `hardware/interfaces/` | Android 硬件接口 |
|
||||||
|
| `hardware/libhardware/` | Android hardware 库 |
|
||||||
|
| `u-boot/arch/arm/` | U-Boot 架构相关代码 |
|
||||||
|
| `u-boot/configs/` | U-Boot 配置 |
|
||||||
|
| `u-boot/board/` | 板级支持 |
|
||||||
|
| `u-boot/drivers/` | U-Boot 驱动 |
|
||||||
|
| `u-boot/include/` | U-Boot 头文件 |
|
||||||
|
| `u-boot/dts/` | U-Boot 设备树 |
|
||||||
|
| `frameworks/base/core/res/` | 系统默认资源(开机动画等) |
|
||||||
|
|
||||||
|
## 8.3 .gitignore 白名单内容
|
||||||
|
|
||||||
|
```gitignore
|
||||||
|
# 策略:根目录忽略所有,只白名单放行会改的目录
|
||||||
|
|
||||||
|
# 1. 默认忽略根目录所有内容
|
||||||
|
/*
|
||||||
|
|
||||||
|
# 2. 白名单:允许这些顶层目录/文件
|
||||||
|
!/.gitignore
|
||||||
|
!/README.md
|
||||||
|
!/device/
|
||||||
|
!/kernel-5.10/
|
||||||
|
!/hardware/
|
||||||
|
!/u-boot/
|
||||||
|
!/frameworks/
|
||||||
|
|
||||||
|
# ===== device 目录:只保留 rockchip =====
|
||||||
|
/device/*
|
||||||
|
!/device/rockchip/
|
||||||
|
/device/rockchip/*
|
||||||
|
!/device/rockchip/common/
|
||||||
|
!/device/rockchip/rk3588/
|
||||||
|
|
||||||
|
# ===== kernel-5.10:只保留驱动、设备树、配置 =====
|
||||||
|
/kernel-5.10/*
|
||||||
|
!/kernel-5.10/arch/
|
||||||
|
!/kernel-5.10/drivers/
|
||||||
|
!/kernel-5.10/kernel/
|
||||||
|
!/kernel-5.10/include/
|
||||||
|
!/kernel-5.10/Documentation/
|
||||||
|
|
||||||
|
# kernel-5.10/arch 只保留 arm64
|
||||||
|
/kernel-5.10/arch/*
|
||||||
|
!/kernel-5.10/arch/arm64/
|
||||||
|
/kernel-5.10/arch/arm64/*
|
||||||
|
!/kernel-5.10/arch/arm64/boot/
|
||||||
|
!/kernel-5.10/arch/arm64/configs/
|
||||||
|
/kernel-5.10/arch/arm64/boot/*
|
||||||
|
!/kernel-5.10/arch/arm64/boot/dts/
|
||||||
|
|
||||||
|
# ===== hardware 只保留 rockchip =====
|
||||||
|
/hardware/*
|
||||||
|
!/hardware/rockchip/
|
||||||
|
!/hardware/interfaces/
|
||||||
|
!/hardware/libhardware/
|
||||||
|
|
||||||
|
# ===== u-boot 只保留配置、设备树、板级代码 =====
|
||||||
|
/u-boot/*
|
||||||
|
!/u-boot/arch/
|
||||||
|
!/u-boot/board/
|
||||||
|
!/u-boot/configs/
|
||||||
|
!/u-boot/include/
|
||||||
|
!/u-boot/drivers/
|
||||||
|
!/u-boot/dts/
|
||||||
|
/u-boot/arch/*
|
||||||
|
!/u-boot/arch/arm/
|
||||||
|
/u-boot/arch/arm/*
|
||||||
|
!/u-boot/arch/arm/dts/
|
||||||
|
!/u-boot/arch/arm/mach-rockchip/
|
||||||
|
!/u-boot/arch/arm/include/
|
||||||
|
|
||||||
|
# ===== frameworks 只保留 base/core/res =====
|
||||||
|
/frameworks/*
|
||||||
|
!/frameworks/base/
|
||||||
|
/frameworks/base/*
|
||||||
|
!/frameworks/base/core/
|
||||||
|
/frameworks/base/core/*
|
||||||
|
!/frameworks/base/core/res/
|
||||||
|
|
||||||
|
# ===== 编译产物和临时文件 =====
|
||||||
|
out/
|
||||||
|
*.o
|
||||||
|
*.ko
|
||||||
|
*.a
|
||||||
|
*.so
|
||||||
|
*.so.dbg
|
||||||
|
*.pyc
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*~
|
||||||
|
__pycache__/
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# ===== 子仓库的 .git 内部目录 =====
|
||||||
|
**/.git/
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8.4 日常工作流
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 在 SDK 中直接改代码(例如 NFC 驱动)
|
||||||
|
cd ~/OrangePi_CM5/Aandroid_OrangePi/merged/Android_13
|
||||||
|
vi kernel-5.10/drivers/nfc/my_nfc.c
|
||||||
|
|
||||||
|
# 查看修改
|
||||||
|
git status
|
||||||
|
git diff
|
||||||
|
|
||||||
|
# 提交
|
||||||
|
git add kernel-5.10/drivers/nfc/
|
||||||
|
git commit -m "添加 PN532 NFC 驱动支持"
|
||||||
|
git push
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8.5 回滚操作
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 查看历史
|
||||||
|
git log --oneline
|
||||||
|
|
||||||
|
# 回滚单个文件到上一版本
|
||||||
|
git checkout HEAD~1 -- kernel-5.10/drivers/nfc/my_nfc.c
|
||||||
|
|
||||||
|
# 回滚整个目录
|
||||||
|
git checkout HEAD~1 -- kernel-5.10/drivers/nfc/
|
||||||
|
|
||||||
|
# 慎用:回滚全部到某个 commit
|
||||||
|
git reset --hard <commit_hash>
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8.6 分支管理(推荐功能分支)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 创建功能分支
|
||||||
|
git checkout -b feature/nfc-pn532
|
||||||
|
|
||||||
|
# 开发、多次 commit 后合并回 main
|
||||||
|
git checkout main
|
||||||
|
git merge feature/nfc-pn532
|
||||||
|
|
||||||
|
# 废弃分支
|
||||||
|
git branch -D feature/nfc-pn532
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8.7 首次推送到 GitHub(SSH 密钥方式,推荐)
|
||||||
|
|
||||||
|
**当前仓库**: `git@github.com:Leo-z8/OrangePi_CM5_Project.git`(Private)
|
||||||
|
**认证方式**: SSH ed25519 密钥,永久免密
|
||||||
|
**网络路径**: 虚拟机 → GitHub `ssh.github.com:443`(直连,不经 Clash 代理)
|
||||||
|
|
||||||
|
### 为什么选 SSH 而非 HTTPS + PAT
|
||||||
|
|
||||||
|
| 对比项 | HTTPS + PAT | SSH 密钥 |
|
||||||
|
|--------|-------------|----------|
|
||||||
|
| 有效期 | 最长 1 年,需定期更新 | 永久有效 |
|
||||||
|
| 网络路径 | 必须走 Clash 代理(HTTPS 国内慢) | 443 端口直连 GitHub |
|
||||||
|
| 稳定性 | TLS 握手依赖代理链,大文件易挂断 | SSH 原生流控,错误信息清晰 |
|
||||||
|
| 推送速度 | 受 Clash 带宽 + rwnd 限制 | 实测稳定 4-6 MiB/s |
|
||||||
|
| 首次推送 758 MiB | 多次中断重试 | 约 2-3 分钟完成 |
|
||||||
|
|
||||||
|
### 步骤 1:虚拟机生成 SSH 密钥
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh-keygen -t ed25519 -C "zhangwenqi-orangepi-vm-github" \
|
||||||
|
-f ~/.ssh/github_ed25519 -N ''
|
||||||
|
```
|
||||||
|
|
||||||
|
生成后两个文件:
|
||||||
|
- `~/.ssh/github_ed25519`(私钥,权限 600)
|
||||||
|
- `~/.ssh/github_ed25519.pub`(公钥)
|
||||||
|
|
||||||
|
### 步骤 2:配置 `~/.ssh/config` 走 443 端口
|
||||||
|
|
||||||
|
```
|
||||||
|
Host github.com
|
||||||
|
HostName ssh.github.com
|
||||||
|
User git
|
||||||
|
Port 443
|
||||||
|
IdentityFile ~/.ssh/github_ed25519
|
||||||
|
IdentitiesOnly yes
|
||||||
|
ServerAliveInterval 30
|
||||||
|
```
|
||||||
|
|
||||||
|
**关键点**:
|
||||||
|
- `HostName ssh.github.com` + `Port 443` 绕过国内对 22 端口的封锁
|
||||||
|
- `IdentitiesOnly yes` 强制只用这个密钥,防止扔其他密钥被 GitHub 拒绝
|
||||||
|
- 此方案不依赖 Clash 代理,虚拟机可直连
|
||||||
|
|
||||||
|
### 步骤 3:添加公钥到 GitHub
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cat ~/.ssh/github_ed25519.pub
|
||||||
|
```
|
||||||
|
|
||||||
|
复制整行内容,到 https://github.com/settings/ssh/new 添加:
|
||||||
|
- Title:`OrangePi-VM-Linux`
|
||||||
|
- Key type:Authentication Key
|
||||||
|
- Key:粘贴公钥
|
||||||
|
|
||||||
|
### 步骤 4:测试连通性
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh -T git@github.com
|
||||||
|
# 预期输出:Hi Leo-z8! You've successfully authenticated
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 5:切换仓库 remote 到 SSH
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/OrangePi_CM5/Aandroid_OrangePi/merged/Android_13
|
||||||
|
|
||||||
|
# 清除旧 HTTPS 配置(如果之前用过 PAT)
|
||||||
|
rm -f ~/.git-credentials
|
||||||
|
git config --local --unset credential.helper 2>/dev/null
|
||||||
|
git config --local --unset http.proxy 2>/dev/null
|
||||||
|
git config --local --unset https.proxy 2>/dev/null
|
||||||
|
|
||||||
|
# 改 remote 为 SSH
|
||||||
|
git remote set-url origin git@github.com:Leo-z8/OrangePi_CM5_Project.git
|
||||||
|
git remote -v
|
||||||
|
|
||||||
|
# 推送(永久免密)
|
||||||
|
git push -u origin main
|
||||||
|
```
|
||||||
|
|
||||||
|
### 备选方案:HTTPS + PAT(不推荐作为长期方案)
|
||||||
|
|
||||||
|
仅在没有 SSH 配置权限或临时应急时使用:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 配置 git 代理(HTTPS 必须走 Clash)
|
||||||
|
git config http.proxy http://192.168.6.57:7890
|
||||||
|
git config https.proxy http://192.168.6.57:7890
|
||||||
|
git config http.postBuffer 524288000 # 增大缓冲,大仓库必需
|
||||||
|
|
||||||
|
git remote set-url origin https://github.com/Leo-z8/OrangePi_CM5_Project.git
|
||||||
|
git config credential.helper store
|
||||||
|
|
||||||
|
# 提示时:用户名 = GitHub 账号,密码 = PAT 令牌
|
||||||
|
git push -u origin main
|
||||||
|
```
|
||||||
|
|
||||||
|
> **PAT 生成**:https://github.com/settings/tokens/new → 勾 `repo` → 生成后立即复制。
|
||||||
|
> 推送完成后建议立即 Revoke(一次性使用),因为 PAT 明文存在 `~/.git-credentials` 有泄露风险。
|
||||||
|
|
||||||
|
## 8.8 推送后日常 push
|
||||||
|
|
||||||
|
SSH 方式配置后完全免密:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/OrangePi_CM5/Aandroid_OrangePi/merged/Android_13
|
||||||
|
|
||||||
|
git add kernel-5.10/drivers/nfc/
|
||||||
|
git commit -m "添加 PN532 NFC 驱动"
|
||||||
|
git push # 免密,永久免代理
|
||||||
|
git pull # 同理
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8.9 备份策略
|
||||||
|
|
||||||
|
| 资产 | 备份位置 |
|
||||||
|
|------|---------|
|
||||||
|
| 驱动/配置修改 | GitHub 仓库(`Leo-z8/OrangePi_CM5_Project`,Private) |
|
||||||
|
| SDK 原始源码分卷(9个 tar.gz) | Windows 电脑(永久保留,不能删) |
|
||||||
|
| Docker 镜像定义 | `~/OrangePi_CM5/docker/Dockerfile` |
|
||||||
|
| 编译产物(update.img) | 按需保留,体积大不进 Git |
|
||||||
|
| 被 `.gitignore` 排除的大文件 | 需单独备份(见 8.10) |
|
||||||
|
|
||||||
|
## 8.10 GitHub 推送踩坑实录(2026-04-22 首次推送)
|
||||||
|
|
||||||
|
### 踩坑 1:GitHub 单文件 100MB 硬性限制
|
||||||
|
|
||||||
|
**现象**:HTTPS 推送数据上传完后 "远端意外挂断了";SSH 推送明确报错:
|
||||||
|
|
||||||
|
```
|
||||||
|
remote: error: File device/rockchip/rk3588/rk3588m_car/preinstall/camera360.apk
|
||||||
|
is 120.48 MB; this exceeds GitHub's file size limit of 100.00 MB
|
||||||
|
remote: error: GH001: Large files detected.
|
||||||
|
! [remote rejected] main -> main (pre-receive hook declined)
|
||||||
|
```
|
||||||
|
|
||||||
|
**根因**:GitHub pre-receive hook 在服务端验收阶段拒绝 >100MB 单文件。HTTPS 协议表现为 TLS 连接异常终止(难诊断),SSH 协议会直接打印错误(易诊断)。
|
||||||
|
|
||||||
|
**教训**:**大文件推送问题要用 SSH 调试**,HTTPS 的"远端挂断"往往掩盖真实原因。
|
||||||
|
|
||||||
|
### 踩坑 2:扫大文件要用 `git ls-tree`,不能用 `git rev-list`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ❌ 错误方式:按 blob 扫描,Git 去重会掩盖多路径
|
||||||
|
git rev-list --objects --all | \
|
||||||
|
git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | \
|
||||||
|
awk '$1=="blob" && $3>=100000000'
|
||||||
|
|
||||||
|
# ✅ 正确方式:按 HEAD 中的路径扫描
|
||||||
|
git ls-tree -r -l HEAD | awk '$4>=100000000 {printf "%.1f MB %s\n", $4/1024/1024, $5}'
|
||||||
|
```
|
||||||
|
|
||||||
|
**根因**:两个产品目录下存在完全相同的 `camera360.apk`(内容 hash 相同),Git 按 blob 去重存储,`rev-list` 只列出一个 blob,但 `ls-tree` 会展开所有路径。
|
||||||
|
|
||||||
|
**教训**:初次 `git rm --cached` 只去掉一个路径,第二次推送时另一个路径的 APK 仍会撞限,必须一次性用通配符覆盖所有。
|
||||||
|
|
||||||
|
### 踩坑 3:`.gitignore` 用具体路径易遗漏,通配符更健壮
|
||||||
|
|
||||||
|
```gitignore
|
||||||
|
# ❌ 窄规则:只管一个路径
|
||||||
|
device/rockchip/rk3588/rk3588m_car/preinstall/camera360.apk
|
||||||
|
|
||||||
|
# ✅ 通配符:所有产品配置下的预装 APK 一次性处理
|
||||||
|
device/rockchip/*/*/preinstall/*.apk
|
||||||
|
```
|
||||||
|
|
||||||
|
**教训**:多产品配置项目中(rk3588m_car / rk3588m_s / …)类似的二进制资源可能分布在多个目录,写 `.gitignore` 规则时默认用通配符。
|
||||||
|
|
||||||
|
### 踩坑 4:HTTPS + Clash 代理的 TCP rwnd 瓶颈
|
||||||
|
|
||||||
|
推送过程 `ss -tni` 显示 **`rwnd_limited: 95.1%`** —— 95% 时间卡在 GitHub 端接收窗口,Clash 代理到 GitHub 的上行链路成瓶颈,平均速度被压到 1-2 MiB/s。
|
||||||
|
|
||||||
|
切到 SSH 443 直连后 **`rwnd_limited: 0.8%`**,速度稳定 4-6 MiB/s。
|
||||||
|
|
||||||
|
**结论**:大仓库首次推送坚决用 SSH,不要 HTTPS。
|
||||||
|
|
||||||
|
### 踩坑 5:凭证泄露风险
|
||||||
|
|
||||||
|
HTTPS + PAT 方案下,凭证明文存在 `~/.git-credentials`:
|
||||||
|
|
||||||
|
```
|
||||||
|
https://用户名:PAT@github.com
|
||||||
|
```
|
||||||
|
|
||||||
|
即使 PAT 只用一次,也要:
|
||||||
|
1. 推送完成后到 https://github.com/settings/tokens 立即 Revoke
|
||||||
|
2. `rm -f ~/.git-credentials`
|
||||||
|
3. `git config --unset credential.helper`
|
||||||
|
|
||||||
|
**SSH 方式无此风险**:私钥只存本地 ~/.ssh/,不会经过对话或日志。
|
||||||
|
|
||||||
|
### 本次推送完整大文件排除流程(已落地)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/OrangePi_CM5/Aandroid_OrangePi/merged/Android_13
|
||||||
|
|
||||||
|
# 1. 扫出所有 >100MB 路径
|
||||||
|
git ls-tree -r -l HEAD | awk '$4>=100000000 {printf "%.1f MB %s\n", $4/1024/1024, $5}'
|
||||||
|
|
||||||
|
# 2. 从索引移除(磁盘文件保留)
|
||||||
|
git rm --cached device/rockchip/rk3588/rk3588m_car/preinstall/camera360.apk
|
||||||
|
git rm --cached device/rockchip/rk3588/rk3588m_s/preinstall/camera360.apk
|
||||||
|
|
||||||
|
# 3. .gitignore 追加通配符规则
|
||||||
|
cat >> .gitignore << 'EOF'
|
||||||
|
|
||||||
|
# 排除所有预装 APK(GitHub 100MB 限制 + 非驱动开发必需)
|
||||||
|
device/rockchip/*/*/preinstall/*.apk
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 4. amend 原 commit
|
||||||
|
git add .gitignore
|
||||||
|
git commit --amend --no-edit
|
||||||
|
|
||||||
|
# 5. 验证 HEAD 里无 >100MB 文件
|
||||||
|
git ls-tree -r -l HEAD | awk '$4>=100000000' # 应无输出
|
||||||
|
|
||||||
|
# 6. 推送
|
||||||
|
git push -u origin main
|
||||||
|
```
|
||||||
|
|
||||||
|
### 需要单独备份的大文件清单
|
||||||
|
|
||||||
|
以下文件已从 Git 历史排除,需另存(网盘/内网文件服务器):
|
||||||
|
|
||||||
|
| 文件 | 大小 | 路径 |
|
||||||
|
|------|------|------|
|
||||||
|
| camera360.apk (rk3588m_car) | 120 MB | `device/rockchip/rk3588/rk3588m_car/preinstall/` |
|
||||||
|
| camera360.apk (rk3588m_s) | 120 MB | `device/rockchip/rk3588/rk3588m_s/preinstall/` |
|
||||||
|
|
||||||
|
这些是产品预装 APK,不是驱动开发所需,完整 SDK 部署时再从备份恢复即可。
|
||||||
|
|
||||||
|
## 8.11 GitHub 推送关键数据(本次首次推送)
|
||||||
|
|
||||||
|
| 指标 | 数值 |
|
||||||
|
|------|------|
|
||||||
|
| 本地仓库大小(`.git`) | 774 MB |
|
||||||
|
| 追踪文件总数 | 96,600 |
|
||||||
|
| 上传 pack 大小 | 约 518 MiB(移除两个 120MB APK 后) |
|
||||||
|
| 网络路径 | 虚拟机 → Tailscale(不经 Clash) → `ssh.github.com:443` |
|
||||||
|
| 实测速度 | 4-6 MiB/s(SSH 443 直连,无 rwnd 瓶颈) |
|
||||||
|
| 首次推送耗时 | 约 2-3 分钟(纯网络时间,排除多次重推) |
|
||||||
|
| 最终 commit | `c79995a30a9db560899bf0845440720edf3e5e3d` |
|
||||||
|
| 远程仓库 | https://github.com/Leo-z8/OrangePi_CM5_Project |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
文档版本: 3.1
|
||||||
|
最后更新: 2026-04-22
|
||||||
|
适用系统: Ubuntu 20.04/22.04 LTS (x86_64), macOS
|
||||||
|
网络环境: 跨网络远程开发(Tailscale + ClashX Pro 共存 + GitHub SSH 443)
|
||||||
|
主要变更(v3.1):
|
||||||
|
- 4.5 新增 SMB 挂载方式(Mac 端轻量文件访问方案)与 Remote-SSH 对比
|
||||||
|
- 8.7 首次推送 GitHub 改为 SSH 密钥为主,PAT 降为备选
|
||||||
|
- 8.10 新增首次推送踩坑实录(单文件 100MB 限制、Git 去重陷阱、rwnd 瓶颈等)
|
||||||
|
- 8.11 新增首次推送实测数据
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user