这篇帖子给出了一个“难题”,楼主也没有想出来好的办法,只能把自己搜集的资料和尝试过的工具总结出来,想起个抛砖引玉的作用。
问题描述
电脑的工作文件夹中有很多个 git 仓库,怎么简单高效地在多台电脑间同步这些 git 仓库?
问题剖析
-
多仓库批量同步 如果只有几个 git 仓库,直接传到 github 上,每天在电脑 A 和电脑 B 上执行 git pull 和 git push 就行。 但现在有超过 10 个 git 仓库,再手动执行同步操作不大现实。新的工具应该有一键批量 Push 和 Pull 的功能。
-
保存工作区的内容 电脑上做了一半的任务,一般是 stash 后下次接着做,但 stash 的内容并不会同步到远程分支上,所以不能用 stash 命令来同步。 也可以将做了一半的任务 push 到远程仓库的 WIP 分支中,另一台电脑 Pull 这个分支接着做。但会增加操作量。 新的工具应该帮助我们方便地同步工作区中未 commit 的代码。
-
过滤不必要的文件 一般仓库都带有 .gitignore 文件来过滤仓库中不需要同步的文件(夹),新的工具也应该读取或者直接使用 .gitignore。
现有方案
方案 A:网盘自动同步
网上看到有的解决方案使用 dropbox 和 syncthing 来同步代码,亲自测试了一番,效果并不好:
- 必须要手动设定一些 ignore 列表,把诸如 node_modules 或者 dist 这样的文件夹过滤掉。
- 会把 .git 文件夹给同步上去,经常提交的仓库,.git 目录下会有成千上万小文件,经常因为 I/O 导致同步很慢甚至失败。
这种同步方式并不优雅。
方案 B:git 内置命令
从 git 本身入手,寻找一种可以兼顾简单和高效的解决办法。
尝试了 git submodule 和 git subtree:
- 前者比较贴近这样的应用场景,每个子文件夹作为一个 submodule,子模块独立地更新,主仓库每次需要添加 submodule 最新的 commit 记录,每次手动执行也挺麻烦的,并且要求 submodule 的 commit 记录必须已经提交到远程分支上,不然主仓库没法 Pull 和 checkout。实际上,手动更新子模块并没有为我们节省多少工作量
- 后者就比较复杂,可以理解为对子文件夹的所有修改都是在一个主仓库中进行,当子仓库需要提交代码的时候用 git subtree push --prefix 命令把子仓库代码提交出去。这个方法有个很大的问题:子仓库无法切换分支,要切换只能先删除该 subtree 再添加。
方案 C: 多仓库管理工具
以 repo 为代表管理工具,大多是通过 python 或者 bash,实现批量 pull/commit/push 多个仓库的功能。
亲自尝试了一下 myrepos 工具,能用,可以一键 Pull,添加其他的功能配置繁琐,最关键的是文档找不到。google 家的 git-repo 也是这样的问题,摸索了一圈没有什么收货,只能看看内置的 help 文档。
相关问题
搜索了一圈发现,这个问题从 2013 年起提到现在,一直没有较好的解决办法,各位 v 友有什么见解么?
- 2013 年 大家怎么在开发过程中在不同机器上同步代码?
- 2015 年 公司和家里代码同步,大家有什么好的方式?
- 2017 年 统一开发环境,同步开发代码和数据,大家是怎么做到的?
- 2018 年 大家有什么简单的办法同步两台电脑间的代码呢
- 2018 年 回家如何同步代码
- 2019 年 问下大家伙,用 VS CODE 撸码,插件里面的 FTP 上传慢得很,有没有更好的方法实现代码同步
- To be continue...
