如何使用git-bundle保持开发同步?

我需要保持我的开发树在不同的计算机上同步,它们之间没有networking连接。

我们有一个中央的git仓库,我通常在我的办公室电脑上工作。 有时我需要在另一台电脑上进行一些开发,而这台电脑从来没有连接到办公室networking。 没有一台电脑连接到互联网。 可以在两台计算机之间进行同步开发。

我已经阅读了git-bundle的帮助页面,这似乎是最好的工具,但我不确定如何设置一个好的工作stream程。

你能给我一些build议或指针吗?

捆绑!

git bundle的工作stream程将与其他工作stream程基本相同。 这似乎不是非常有帮助的build议,但这里是:使用任何您通常使用的工作stream程,并用“在这里闪存驱动器捆绑一个捆绑,然后拉”取代“推/拉”。

手册页实际上有一个相当不错的演练,虽然这是一个单向的例子。 为了完整起见,这里有一个稍微修改的版本,展示了如何以两种方式移动信息:

# on hostA, the initial home of the repo hostA$ git bundle create hostA.bundle --branches --tags # transfer the bundle to hostB, and continue: hostB$ git clone /path/to/hostA.bundle my-repo # you now have a clone, complete with remote branches and tags # just to make it a little more obvious, rename the remote: hostB$ git remote rename origin hostA # make some commits on hostB; time to transfer back to hostA # use the known master branch of hostA as a basis hostB$ git bundle create hostB.bundle ^hostA/master --branches --tags # copy the bundle back over to hostA and continue: hostA$ git remote add hostB /path/to/hostB.bundle # fetch all the refs from the remote (creating remote branches like hostB/master) hostA$ git fetch hostB # pull from hostB's master, for example hostA$ git pull # make some commits on hostA; time to transfer to hostB # again, use the known master branch as a basis hostA$ git bundle create hostA.bundle ^hostB/master --branches --tags # copy the bundle to hostB, **replacing** the original bundle # update all the refs hostB$ git fetch hostA # and so on and so on 

需要注意的是,您可以将一个捆绑包作为远程设备添加,并与其他任何远程设备进行交互。 要更新该远程设备,只需放入一个新的软件包,replace之前的软件包即可。

我也采取了稍微不同的方法来select基础。 手册页使用标签,始终保持与最后一次转交给其他主机的参考文献。 我只使用了远程分支,它将引用另一个主机传输的最后一个参考。 这有点低效, 你将最终捆绑超过你需要,因为它落后了一步。 但是闪存驱动器很大,捆绑包很小,并且使用已经拥有的引用,而不必采取额外措施,小心标签可以节省大量的工作量。

捆绑有点麻烦的一件事是,你不能推动他们,你不能“rebase”他们。 如果你想要基于新的基础捆绑,你必须重新创build它。 如果你想要新的提交,你必须重新创build它。 这个麻烦引起我的下一个build议…

在拇指驱动器上回收

老实说,除非你的回购确实很大,否则这可能一样容易。 将一个裸露的克隆放在拇指驱动器上,然后可以从两台计算机上进行推拉。 把它看作你的networking连接。 需要转移到中央回购? 插上电源!

@Jefromi的答案很棒 – 比git文档要好10倍,这个文档详细地介绍了难以理解的需求和行为。

它仍然有点复杂,所以这里是最简单的情况同步一次(在我的情况下:从:一个离线笔记本电脑坏了无线网卡,TO:一个桌面与networking访问)。 基于@ Jefromi的回答,这似乎工作正常:

AHEAD =提前执行一些提交的机器。 BEHIND =你想要将提交复制到的机器

 1. AHEAD: git-bundle create myBundleName.bundle --branches --tags 

两者:复制myBundleName.bundle(使用电子邮件,USB,不pipe)

BEHIND :(将文件myBundName.bundle放置在项目文件夹以外的任何位置)

 2. BEHIND: cd [the project folder] 3. BEHIND: git pull [path to the bundle file]/myBundleName.bundle master 

只要你在最后包含分支名称(默认情况下,如果你不使用分支,“master”),这似乎工作正常,并不会取代任何在BEHIND的内部引用 – 所以你仍然可以与原始主数据同步。

即如果BEHIND有互联网接入,则仍然可以安全地进行:

 (OPTIONAL) 4. BEHIND: git push 

…它将更新主存储库,就像您在BEHIND上正常执行的本地修改一样。

Interesting Posts