基于 Syncthing 的代码自动同步方案

327 天前
 117503445

动机

我经常在不同台式电脑和笔记本电脑之间切换。为了保持代码文件的一致性,最简单的解决方案是使用一台 PC 作为开发服务器,并在我使用其他设备工作时连接到它。然而,这个方案存在以下缺点:

替代方案是在每台设备上设置开发环境,并在设备之间同步代码。常见的代码同步方案是通过 Git 提交到远程仓库,然后在另一台设备上拉取。然而,这要求程序员手动进行提交,而我经常会忘记提交,导致未提交的代码被留在已关机的台式电脑中。

通过同步网盘可以在代码文件变更时自动在设备间同步。其中,Syncthing 是一款优秀的开源同步盘软件。但 Syncthing 会同步所有文件,而 node_modulestarget 等文件夹是不需要同步的,因为它们可以通过 package.jsonCargo.toml 等文件自动生成。同步这些文件会导致巨大的网络带宽消耗,并显著降低 Syncthing 的性能。

Syncthing 支持使用 .stignore 忽略同步文件。可以考虑将 .gitignore 中忽略的文件也添加到 .stignore 中,这样就可以保证 Syncthing 只同步代码文本文件了。但是,.gitignore.stignore 的语法存在差异,不能直接使用。本项目可以弥补这个鸿沟,实现思路是在每台设备上运行 stignore-generator 进程。stignore-generator 进程在后台监听 .gitignore 文件的变化,并自动将其转换为 .stignore 文件。

使用方法

假设每个设备的项目路径都位于 ~/workspace 下,比如 ~/workspace/project1~/workspace/project2

  1. 使用 Syncthing 同步文件夹 ~/workspace

  2. 运行 stignore-generator 服务,可以使用 Docker 和 Systemd 两种方式。

Docker

准备 docker-compose.yml 文件:

version: "3.9"
services:
  stignore_generator:
    image: 117503445/stignore-generator
    restart: unless-stopped
    volumes:
      - ~/workspace:/workspace

中国用户可以使用以下命令加速 Docker 镜像拉取

docker pull registry.cn-hangzhou.aliyuncs.com/117503445-mirror/stignore-generator && docker tag registry.cn-hangzhou.aliyuncs.com/117503445-mirror/stignore-generator 117503445/stignore-generator

启动 stignore-generator

docker compose up -d

Systemd

下载 stignore-generator 可执行文件

curl -L -O $(curl -s https://api.github.com/repos/117503445/syncthing-code/releases/latest | grep "browser_download_url" | cut -d '"' -f 4) && chmod +x stignore-generator && mv stignore-generator /usr/bin

安装 stignore-generator 服务

cat << EOF > /etc/systemd/system/stignore-generator.service
[Unit]
Description=stignore-generator

[Service]
Type=simple
Restart=always
RestartSec=1
ExecStart=/usr/bin/stignore-generator

[Install]
WantedBy=multi-user.target
EOF

启用 stignore-generator 服务

systemctl enable --now stignore-generator

注意事项

具体的生成方式是

  1. 保证 .stignore 中有 #include .stgitignore。如果 .stignore 不存在,则创建它;如果 .stignore 存在但不包含 #include .stgitignore,则在文件末尾添加它。

  2. .gitignore 中的内容转换为 .stgitignore,并将其保存到 .stignore 所在目录下。

这种生成方式允许用户在 .stignore 中添加自定义的忽略规则,而不会被 stignore-generator 覆盖。典型的,包含机密信息的配置文件也存在于 .gitignore 中,程序员可以使用 ! 语法在自己的设备间同步这些文件。

GitHub Repo

https://github.com/117503445/syncthing-code

如果帮助到了你,欢迎 Star ~

致谢

2541 次点击
所在节点    分享创造
21 条回复
shenzhuoyan
167 天前
@shenzhuoyan 忘了开好内网穿透 -> 忘了开机并保持联网。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1005449

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX