使用git bundle同步airgapped repos

时间:2017-12-02 00:04:30

标签: git version-control git-bundle

我遇到了一个问题,我希望同步2个未通过网络连接的存储库。我已经使用git bundle在两者之间进行同步,但遇到了一个角落案例。

我通过以下方式创建git包:

git bundle create --since=<timestamp of lastBundle> --all <my_bundle_path>

其中<timestamp of lastBundle>是从与lastBundle标记关联的提交时间中挑选出来的。这允许我只捆绑delta并在所有分支中获取所有新提交。

角落情况是这种特定情况发生的时候

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已同步,并且对应于气流回购的最新参考,但有人在他们自己的当地副本和c2中提前c3提交了lastBundle没有立即将引用推送到原点。因此,下次我从c2开始捆绑每个提交并将其放在驱动器上,将其加载到另一台机器上时,它无法验证,因为git merge-base不在捆绑中,只有它合并到主

我看了lastBundle,看看我是否能找到一个共同的祖先,而是使用它。虽然可以完成这项工作,但我认为每个分支都需要一个git bundle verify <mybundle>标记才能使其正常工作,因为这种情况可能同时发生在0,1个或更多分支上。这似乎不是最佳的。

理想情况下,我认为我希望能够针对git历史中的给定位置而不是整个存储库执行Dim Bullet As PictureBox Bullet = New PictureBox() Bullet.Tag = "BULLET" Controls.Add(Bullet) 。这样我就可以在将它放到磁盘上之前验证它是否会失败,并且只是在捆绑时改变我提交的时间。除非我还有其他方法可以做到。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

你应该根据时间而不是你实际发送的内容来制作你的包。为此使用远程引用(未测试):

git bundle create foo.bundle --branches
git fetch foo.bundle 'refs/heads/*:refs/remotes/sent/*'
....
git bundle create foo.bundle --branches --not --remotes sent
git fetch...