先给项目上 Git,再给串流补个剪贴板
今天这堆事,是从昨晚那次 git init 开始的。
前几天一直让不同的 AI 接力改 Blog 和 status。没有 Git,下一位接手时不知道上一位动了哪里,只能把几十 KB 的 app.js、style.css 和 README 重新通读一遍。token 烧掉一堆,最后还不一定找得出哪几行刚改过。
这就很像接班的人找不到交接本,只能把整个办公室翻一遍。
先让 Git 记住上一手
所以先把 Blog 和 status 分别建成了本地 Git 仓库。我没在 ~/AI 顶层再套一个大仓库。两个项目本来就没关系,旁边还放着 .secrets,没必要把它们绑在一起。
第一次提交之前先写 .gitignore。这一步不能省:本地仓库以后也可能加远端,今天误提交进去的密钥,到时候会连着整段历史一起推上去。
- Blog 忽略部署快照和系统杂物,HTML、CSS、JS、文章原稿和部署脚本正常跟踪。
- status 直接忽略整个
data/,里面既有 SwitchBot、远程 GPU 的凭据,也有每两秒变化的历史数据和内网配置。 - voice 没有另建仓库。里面的 VibeStick 本来就自带 Git 和远端,
llama.cpp又是可重新下载的大体积第三方文件,再套一层只会把事情弄乱。
真要照抄,先在项目根目录写一份最小 .gitignore。.secrets/ 和 *.env 是密钥,data/ 是高频变化的运行数据,都不该进历史:
.secrets/
*.env
data/
*.log
然后再初始化和做第一次提交。git init -b main会直接把初始分支设成 main;git check-ignore -v 可以在暂存前验证某个文件到底命中了哪条规则:
git init -b main
git check-ignore -v .secrets/example.env
git status --short
git add .
git diff --cached --check
git commit -m "Initial snapshot"如果文件早就被 Git 跟踪了,后来再写 .gitignore 不会让它自动消失。Git 官方也明确说了,ignore 只针对未跟踪文件。所以第一次 git add . 之前一定先看 git status --short。
两个仓库目前都是纯本地的 main,没有推到任何远端。以后每次改完、验证通过就自动提交,不再留一堆“这到底是谁动的”现场。
Git 当然不会让文件变小,省下的是下一位接手时重新摸清状态的时间。git diff 看改动,git log 看原因,几百个字能说清的事情,不用再读几万个字。
Git 当天就开始干活
仓库建好之后,status 马上又改了两轮。
第一轮是 Claude 额度。原来的 status 只读取 ~/.claude/.credentials.json,自己不会续期。只有我打开 Claude Code 或 VS Code 插件时,客户端才顺手刷新 token。于是我不用 Claude,额度面板反而会过期冻住;我一用,它又活了。
最后加了一个独立的 Node 续期脚本和 systemd 用户定时器,每 30 分钟检查一次,快过期才刷新。status 继续只读额度,不需要拿到写登录态的权限。
中间还踩了个很像笑话的坑:Python 和 curl 请求 OAuth 端点都收到 429,一开始以为真被限流,安静等了一夜也没用。第二天翻本机官方客户端代码确认端点,再换 Node 的网络栈,第一发就成功。那个 429 更像 WAF 看 TLS 指纹不顺眼,并不是真的“请求太多”。
第二轮是 Codex 自己改规则。上游把 5 小时额度窗取消了,只剩周额度,原来并排的两张额度卡突然一边三行、一边一行。数据没坏,界面只是被厂商改空了。于是 Codex 卡补上 Credits 余额、限额重置券和“5 小时限额已取消”的说明。哪天上游把双窗口加回来,说明也会自动消失。
这两轮各自留了一个 commit。厂商爱怎么改就怎么改,至少我知道自己为什么跟着动。
副屏上的 Linux 少了一块剪贴板
下午又去收拾另一个每天都能碰到的小麻烦。
这台 Linux 平时主要靠 Sunshine + Moonlight 串到副屏上用。画面、声音、键盘和鼠标都有了,唯独剪贴板没有。主屏上复制一段命令,到了副屏里的 Linux 还得重新打;Linux 里看到一个链接,想贴回另一台机器也不行。
短句还能忍,长命令和中文就只剩下折磨。串流看起来像本地桌面,复制粘贴时又突然提醒我:不是,你还隔着一台机器。
SyncClipboard:Linux 自己当服务端
最后装了 SyncClipboard 3.1.8。没有另外搭一套服务,直接让 Linux 客户端打开内置服务器,自己连自己的 5033 端口,另一端也连到这台 Linux。
配置上做了几件事:
- 服务端设置独立账号和随机密码,凭据只留在本机配置里。
- 先用 HTTP 跑通,再给局域网签一套自己的根证书和服务器证书,改成 HTTPS。
- 证书覆盖局域网地址、localhost 和主机名;另一端导入根证书后正常校验,没有打开“忽略证书错误”。
- 文本、图片和文件同步都打开,单个文件上限 20 MB。
- KDE 登录后自动启动,窗口默认隐藏,平时不用再管它。
我这次直接用了客户端内置服务器,因为 Linux 机器本来就会常驻登录。如果是给多台机器共用,我更建议把服务端拆成 Docker Compose,别让「服务是不是活着」取决于某个桌面客户端有没有打开。SyncClipboard 官方仓库已经提供了镜像,一份最小 compose.yml 可以这样写:
services:
syncclipboard:
image: jericx/syncclipboard-server:latest
container_name: syncclipboard-server
ports:
- "5033:5033"
environment:
SYNCCLIPBOARD_USERNAME: ${SYNCCLIPBOARD_USERNAME}
SYNCCLIPBOARD_PASSWORD: ${SYNCCLIPBOARD_PASSWORD}
volumes:
- ./data:/app/data
restart: unless-stopped账号密码放在同目录的 .env,再把 .env 加进 .gitignore。示例值不要原样照抄:
SYNCCLIPBOARD_USERNAME=change-me
SYNCCLIPBOARD_PASSWORD=replace-with-a-long-random-password
启动前先让 Compose 展开一次配置,这一步能提前抓到缩进、变量和端口错误:
docker compose config
docker compose up -d
docker compose ps
docker compose logs --tail=50 syncclipboard客户端先用 http://服务器局域网地址:5033 跑通,确认账号密码和文本同步没问题,再用自签证书或反向代理补 HTTPS。这个端口只对局域网放行,不要顺手映射到公网。
这套东西只在家里局域网解决一件事,不准备再给它套公网、域名和反向代理。能少养一个公开服务,就少一个以后忘了更新的东西。
Wayland 还是要交学费
第一次跑起来时,两边确实能同步,但中文偶尔会变成一排问号。
日志里能看见 SyncClipboard 同时在尝试 Avalonia、X11 和命令行剪贴板后端。可我现在是 KDE Plasma Wayland,会话里没有 xclip,真正该走的是 wl-clipboard。几条路径混在一起最可疑:英文看不出问题,中文先暴露了。
装好 wl-clipboard 后,又在 SyncClipboard 的配置里禁用 Avalonia 和 xclip 来源,强制它走 Wayland 原生的 wl-copy / wl-paste。重启后日志明确显示 wl-clipboard initialized。
这部分不能丢进 Docker。服务端只管传输,真正读写 Wayland 剪贴板的是桌面客户端。先单独验证 wl-copy / wl-paste,再回头看 SyncClipboard 日志:
sudo apt install wl-clipboard
printf '中文剪贴板测试' | wl-copy
wl-paste最后来回测了几轮:Windows 复制中文到 Linux,Linux 再复制中文、网址和一整段网页文字回去,都能原样到达。图片和文件也能走同一套同步。那个最基础的 Ctrl+C / Ctrl+V,终于不用再看机器脸色。
两件不相干的小事
硬把 Git 和 SyncClipboard 放在一起总结,其实有点牵强。一个管项目历史,一个管两台机器之间的复制粘贴,技术上没什么关系。
它们只是碰巧解决了同一种烦躁:明明刚做过一遍,换个人或换台机器,又得从头来。
现在 Sunshine + Moonlight 不只把 Linux 的画面送到副屏,剪贴板也终于跟了过来。桌面还是远程的,用起来总算不用处处提醒我它很远。
今天没造新轮子。只是让下一位接手的人少翻一次办公室,也让我少重打一条命令。机器没白开。
COMMENTS 留言
READING MEMORY CARD…