我遇到了一个问题,我想同步 2 个未通过网络连接的存储库。我已经使用 git bundle 在两者之间进行同步,但遇到了一个极端情况。
我正在通过以下方式创建 git 包:
git bundle create --since=<timestamp of lastBundle> --all <my_bundle_path>
从<timestamp of lastBundle>
与lastBundle
标签关联的提交时间中选择的位置。这允许我只捆绑增量并在所有分支中获取所有新提交。
极端情况是发生这种特殊情况时
master 2017-12-4 <dev who committed c2 finally gets around to pushing it to origin>
|\
| \
| c3 <lastBundle> 2017-12-3 <commit that was synched>
| |
c2 | 2017-12-2 <commit from dev, timestamped to when s/he committed it to their local repo>
\ |
\ |
c1 2017-12-1 <base commit>
lastBundle
已同步,并且对应于气隙 repo 的最新引用,但有人c2
在时间上比c3
他们自己的本地 repo 副本更早地提交,并且没有立即推送对 origin 的引用。因此,下次我捆绑每个提交lastBundle
并将其放在驱动器上,将其加载到另一台机器上时,它无法验证,因为c2
它不在捆绑包中,只有它合并到主控。
我已经查看了git merge-base
是否可以找到一个共同的祖先,并使用它来代替。虽然这可以完成这项工作,但我认为我需要lastBundle
为每个分支添加一个标签才能使其工作,因为这种情况可能同时发生在 0、1 个或更多分支上。这似乎不是最优的。
理想情况下,我想我希望能够git bundle verify <mybundle>
针对 git 历史记录中的给定位置执行操作,而不是针对整个存储库。这样,我可以在将其放入磁盘之前验证它是否会失败,并且只需更改捆绑时提交的回溯时间。除非我尝试做的事情有其他方法。
有任何想法吗?