跳到正文
全部 31 篇FREN中文
目录
第 2 部分 · 第 5 篇,共 6 篇 难度:进阶 阅读时间:16 分钟 适用平台:Linux

Git、GitHub 与备份

您的代码值得一张安全网。用 Git 给一切做版本管理,用 GitHub 把它存到别处并分享出去,再加一套真正的备份策略,让您永远不丢东西,哪怕机器烧了。

本文目录
  1. 01为什么这事不容商量(尤其是有了 agent)
  2. 02在机器上配置 Git
  3. 03让机器获得访问 GitHub 的权限
  4. 04您的第一个仓库,以及用它的 agent
  5. 05备份:3-2-1 法则
  6. 06三个只有在恢复时才会发现的陷阱
  7. 07常见问题

要点速览

在让 agent 写代码之前,先用 Git 给所有东西做版本管理,再把一份副本推送到 GitHub:每个 commit 都是一个还原点,机器丢了代码也还在。把迷你 PC 连上 GitHub 最简单的办法是 GitHub CLI(gh auth login,选 SSH 协议),并在第一次 commit 之前写好 .gitignore,绝不推送任何密钥。至于不在 Git 里的东西(.env 文件、数据库、配置),用 restic 执行 3-2-1 规则,让备份自动运行,并至少测试一次还原。

请先完成: 什么是 AI 智能体(agent)?

您刚装好一个会飞快写代码的 agent。在它碰任何要紧东西之前,我们先把网铺好:Git,让每一次改动都可回退;以及 GitHub,让您的工作活在这台小盒子之外的地方。因为一台迷你 PC 可能会烧掉、被偷,或者吃下一个多余的 rm。而您的代码,绝不该跟着一起消失。

为什么这事不容商量(尤其是有了 agent)

一个代码 agent 跑得快,而且很自信。多数时候这很棒;偶尔它会弄坏点什么。Git 把这变成一件无关紧要的小事:

  • 每一次提交都是一个还原点。 agent 把一切都搞砸了?git restore 或 git reset,一秒钟您就回到了之前的状态。这是终极的「撤销」。
  • 您能看清究竟改了什么。 git diff 一行一行地告诉您 agent 动了哪里。您在点头前先审一遍,这就是这门手艺的核心(见 保护访问安全)。
  • GitHub 让您的代码远离灾难。 硬盘坏了、被偷了、误操作:您的代码在 GitHub 上,完好无损。您能在任何一台机器上用一条命令把它取回来。
  • 而且您可以分享。 给同事开权限、多人协作、开源出去:全都经由 GitHub。

在机器上配置 Git

三行,一劳永逸。Git 需要知道您是谁(这会签署您的提交):

git config --global user.name "您的姓名"
git config --global user.email "[email protected]"
# 几个明智的默认值
git config --global init.defaultBranch main   # 默认分支叫 "main"
git config --global pull.rebase false          # 可预期的 pull 行为

让机器获得访问 GitHub 的权限

您的机器得向 GitHub 证明它有权推送。两条路;选您顺眼的那条。

已完成 0 步,共 2 步 勾选记录只保存在此浏览器中。

  1. 最简单的:GitHub CLI(gh)

    官方工具 gh 替您处理认证,连令牌也一起搞定。

    # 从 Ubuntu 软件源安装 gh
    sudo apt install -y gh
    # 把机器连到您的账号, 回答问题,它会打开浏览器
    gh auth login
    

    选「GitHub.com」,再选「SSH」作为协议:gh 会自动生成并安装密钥。完成后,您的机器就能克隆、推送、创建仓库了。这是我推荐的入门选项。

    Ubuntu 的软件包往往落后好几个版本(Ubuntu 26.04 里是 2.46,而截至 2026 年 10 月 1 日 GitHub 已发布 2.102)。用来登录和推送足够了;如果缺了某个新命令,请从 GitHub 官方软件源 安装 gh。

  2. 手动选项:一把专属于这台机器的 SSH 密钥

    如果您想完全掌控,就创建一把专属于这台迷你 PC 的 SSH 密钥(一机一钥更稳妥):

    ssh-keygen -t ed25519 -C "mini-pc-github"
    cat ~/.ssh/id_ed25519.pub   # 复制显示出来的内容
    

    把公钥粘到 GitHub → Settings → SSH and GPG keys → New SSH key。然后验证:

    ssh -T [email protected]   # 应该用您的 GitHub 用户名跟您打招呼
    

您的第一个仓库,以及用它的 agent

cd ~/mon-projet
git init
# 那个告诉 git 要忽略什么的文件, 至关重要
cat > .gitignore <<'EOF'
node_modules/
.env
*.log
dist/
EOF
git add -A
git commit -m "Premier jet"
# 创建远端仓库并推送(用 gh,一行就够)
gh repo create mon-projet --private --source=. --push

到位之后,让您的 agent 替您管 git:「定期提交,写清晰的提交信息」「为这个功能创建一个分支」「开一个 pull request」。您甚至可以把它写进您的 记忆文件:「每一步验证通过后提交,使用约定式的提交信息,未经我同意不要推到 main。」

备份:3-2-1 法则

GitHub 保住了您的代码。但您的迷你 PC 里还装着许多不在 git 里的东西:您的 .env 文件、您的数据库、生成的数据、系统配置。对这些,我们套用备份的黄金法则:

已完成 0 步,共 4 步 勾选记录只保存在此浏览器中。

  1. 决定备份什么

    • 代码 → 已经在 GitHub 上,无需多做。
    • 密钥(.env、各种 key)→ 加密备份,绝不明文。
    • 真正要紧的数据(数据库、生成的文件、自己写的配置)。
    • 不要备份 Ollama 模型和 node_modules:它们能重新下载,没必要备份。
  2. 选一个工具和一个目的地

    restic 是理想的工具:加密、去重、增量备份。您可以把它发往一个 NAS、另一块硬盘,或者云存储。

    sudo apt install -y restic
    # 初始化一个备份仓库(例如:发往挂载的 NAS)
    restic -r /mnt/nas/backups init
    # 第一次备份
    restic -r /mnt/nas/backups backup ~/projets ~/configs
    

    如果想瞄准云存储(客户端侧加密),rclone 是一个很好的替代方案。

  3. 自动化,手动备份迟早会被忘掉

    安排一个每日的 systemd 定时器或 cron 任务。您的 agent 两分钟就能写好:让它「创建一个 systemd 服务,每天凌晨 3 点跑我的 restic 备份」。

  4. 测试您的恢复

    一个您从未恢复过的备份不是备份,那是一种指望。至少做一次这个练习:restic -r /mnt/nas/backups restore latest --target /tmp/test-restore,然后确认您的文件确实都在。

三个只有在恢复时才会发现的陷阱

用卷标定位磁盘,永远不要用路径

外置硬盘不一定每次都挂在同一个地方。如果目录已经存在,桌面环境会加一个数字,挂到 /media/您/1TB1,把 /media/您/1TB 留在原地,变成系统盘上的一个空目录。

天真的 [ -d "$DEST" ] 判断照样通过。于是您的备份安安静静地写进了系统盘,还以为自己写在外置盘上。

# 用卷标解析,并且要求它必须是一个真正的挂载点
DEST="$(findmnt -rn -S LABEL=1TB -o TARGET 2>/dev/null | head -1)"
[ -n "$DEST" ] && mountpoint -q "$DEST" \
  || { echo "外置 SSD 未挂载,备份中止"; exit 1; }

写死的清单会漏掉新来的

一个手工罗列数据库的脚本,永远不会备份您上个月新建的那个项目。而且它不会吭声。请扫描真正在跑的东西:

for c in $(docker ps --format '{{.Names}}'); do
  # 探测工具是否存在,而不是去匹配镜像名:
  # 这样连 pgvector、timescaledb 之类的衍生版也能一并抓到
  docker exec "$c" sh -c 'command -v pg_dumpall' >/dev/null 2>&1 || continue
  docker exec "$c" pg_dumpall -U postgres | gzip > "$DEST/$c.sql.gz"
done

破坏性重建必须是原子的

一个先删库再重建的脚本,万一中途挂掉,您手上就什么都不剩了。请在旁边建好,然后改名:在同一个文件系统内,改名是原子操作。

sqlite3 base.sqlite.tmp < schema.sql
# … 填充 …
mv base.sqlite.tmp base.sqlite      # 要么瞬间切换,要么什么都不发生

切换之前还要核对:完整性、索引数量、行数下限。否则一次只完成了一半的重建,看上去也像成功。

常见问题

Git 和 GitHub 有什么区别?

Git 是在您机器上运行的版本控制工具,在本地记录文件的历史。GitHub 是一个在线服务,您把这份历史的副本推送到上面。Git 是航海日志,GitHub 是远程保险箱,两者缺一不可。

编码智能体把东西全搞坏了,怎么回退?

只要工作用 Git 做了版本管理,每次提交就是一个还原点:git restore 或 git reset 一秒钟就能把文件恢复到之前的状态。而且在批准之前,git diff 会逐行显示智能体改动了什么。

API 密钥被推送到 GitHub 上了怎么办?

即使在私有仓库里,也要视为已泄露:立即吊销并重新生成。为了避免这种情况,请在第一次 git add 之前写好 .gitignore 文件,至少包含 .env 和 node_modules。

Ollama 模型和 node_modules 文件夹需要备份吗?

不需要,它们可以重新下载。应该备份的是别处没有的东西:.env 文件和密钥(务必加密)、数据库、生成的文件以及您自己的配置。代码本身已经在 GitHub 上了。

为什么备份可能失败却没人察觉?

因为有些陷阱会悄无声息地失败:外接硬盘以另一个名字挂载,备份就写到了系统盘上;写死的数据库清单会漏掉新项目;中途中断的重建会被当成成功。请按卷标定位硬盘,扫描实际在运行的服务,并先在旁边构建好再重命名。

本文涉及的术语: GitCommit(提交)开源(对比开放权重)

发现错误?

命令失效了,价格变了?

这些工具每个月都在变。请告诉我这篇文章哪里不对,我会改正并更新日期。

只保留页面、您的留言和选填的联系方式,别无其他。

第 13 / 31 篇 · 第 2 部分 还没有读过任何一篇 打开文章目录