[技术总结] 多设备代码同步问题,目前有比较好的解决办法么?

2019-05-09 22:00:06 +08:00
 Deardrops

这篇帖子给出了一个“难题”,楼主也没有想出来好的办法,只能把自己搜集的资料和尝试过的工具总结出来,想起个抛砖引玉的作用。

问题描述

电脑的工作文件夹中有很多个 git 仓库,怎么简单高效地在多台电脑间同步这些 git 仓库?

问题剖析

  1. 多仓库批量同步 如果只有几个 git 仓库,直接传到 github 上,每天在电脑 A 和电脑 B 上执行 git pull 和 git push 就行。 但现在有超过 10 个 git 仓库,再手动执行同步操作不大现实。新的工具应该有一键批量 Push 和 Pull 的功能。

  2. 保存工作区的内容 电脑上做了一半的任务,一般是 stash 后下次接着做,但 stash 的内容并不会同步到远程分支上,所以不能用 stash 命令来同步。 也可以将做了一半的任务 push 到远程仓库的 WIP 分支中,另一台电脑 Pull 这个分支接着做。但会增加操作量。 新的工具应该帮助我们方便地同步工作区中未 commit 的代码。

  3. 过滤不必要的文件 一般仓库都带有 .gitignore 文件来过滤仓库中不需要同步的文件(夹),新的工具也应该读取或者直接使用 .gitignore。

现有方案

方案 A:网盘自动同步

网上看到有的解决方案使用 dropbox 和 syncthing 来同步代码,亲自测试了一番,效果并不好:

  1. 必须要手动设定一些 ignore 列表,把诸如 node_modules 或者 dist 这样的文件夹过滤掉。
  2. 会把 .git 文件夹给同步上去,经常提交的仓库,.git 目录下会有成千上万小文件,经常因为 I/O 导致同步很慢甚至失败。

这种同步方式并不优雅。

方案 B:git 内置命令

从 git 本身入手,寻找一种可以兼顾简单和高效的解决办法。

尝试了 git submodule 和 git subtree:

  1. 前者比较贴近这样的应用场景,每个子文件夹作为一个 submodule,子模块独立地更新,主仓库每次需要添加 submodule 最新的 commit 记录,每次手动执行也挺麻烦的,并且要求 submodule 的 commit 记录必须已经提交到远程分支上,不然主仓库没法 Pull 和 checkout。实际上,手动更新子模块并没有为我们节省多少工作量
  2. 后者就比较复杂,可以理解为对子文件夹的所有修改都是在一个主仓库中进行,当子仓库需要提交代码的时候用 git subtree push --prefix 命令把子仓库代码提交出去。这个方法有个很大的问题:子仓库无法切换分支,要切换只能先删除该 subtree 再添加。

方案 C: 多仓库管理工具

以 repo 为代表管理工具,大多是通过 python 或者 bash,实现批量 pull/commit/push 多个仓库的功能。

亲自尝试了一下 myrepos 工具,能用,可以一键 Pull,添加其他的功能配置繁琐,最关键的是文档找不到。google 家的 git-repo 也是这样的问题,摸索了一圈没有什么收货,只能看看内置的 help 文档。

相关问题

搜索了一圈发现,这个问题从 2013 年起提到现在,一直没有较好的解决办法,各位 v 友有什么见解么?

9136 次点击
所在节点    程序员
44 条回复
icylogic
2019-05-11 04:40:16 +08:00
也许有些人对 git worktree 不熟,补充一下它的特性,就是说你一台机器只有一个真正的.git 目录,当你 git worktree add 把一个分支放到一个新路径下的时候,你会发现新路径下的.git 不再是一个包含所有版本信息的.git 目录,而是一个单文本文件,这个文本文件你放上去同步就几乎没有任何 overhead 了,而且你 cat 一下就知道这个文件内容是什么意思了。远程不要动它就可以了。
passerbytiny
2019-05-11 09:01:34 +08:00
你这个是属于个人多台设备的同步,跟 git、svn 等 SCM 没有任何关系。SCM 主要功能是版本控制,其次是多人协同。你用 git 非但解决不了你的问题,反而污染 git 提交历史。

你这种情况“文件夹同步”或“挂载到本地的云存储”也解决不了,就算你能找到方法解决 .git 文件夹的同步,但本地开发环境总会遇到“绝对路径”的,你很难保证多份本地开发环境完全一摸一样。而且,对于持久性的工作来说,CPU、内存等硬件配置的微笑不同都会让人很难受。

你需要的是云上的个人主机,现在这东西还没做出来。当然我比较好奇的是,你都用笔记本编码了,为什么不全部在笔记本上工作。如果是笔记本太烂,就换一个好点的。
windedge
2019-05-11 15:50:56 +08:00
seafile 可以设置 ignore 列表
jsnjfz
2019-05-11 20:22:36 +08:00
自己买个服务器建个私有 gitlab 啊,stash 的内容提交推送吧

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

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

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

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

© 2021 V2EX