73

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

我们有一个中央 git 存储库,我通常在办公室计算机上使用自己的克隆。有时我需要在另一台从未连接到办公网络的计算机上进行一些开发。这些计算机都没有连接到互联网。可以在同步之间在两台计算机上执行开发。

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

你能给我一些建议或指点吗?

4

2 回答 2

117

捆绑!

使用 git bundle 的工作流程将与任何其他工作流程基本相同。这似乎不是非常有用的建议,但它是:使用您通常使用的任何工作流程,并将“推/拉”替换为“在闪存驱动器上将捆绑包带到那里,然后拉动”。

手册页实际上有一个很好的演练,尽管它更像是一个单向的例子。为了完整起见,这里有一个稍微修改过的版本,展示了如何双向移动信息:

# 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

需要注意的关键是您可以将捆绑包添加为遥控器,并与它进行交互,就像与任何其他遥控器一样。要更新该遥控器,只需放入一个新捆绑包,替换之前的捆绑包。

我还采取了稍微不同的方法来选择基础。手册页使用标签,始终与传输到其他主机的最后一个参考保持同步。我只是使用了远程分支,它将引用另一台主机传输的最后一个 refs。这有点低效;你最终会捆绑比你需要的更多,因为它落后了一步。但是闪存驱动器很大,捆绑包很小,并且使用您已经拥有的 refs 而不必采取额外的步骤并小心标签可以节省大量精力。

让 bundle 有点麻烦的一件事是你不能推送它们,你不能“rebase”它们。如果您想要基于新基础的捆绑包,则必须重新创建它。如果你想要新的提交,你必须重新创建它。这个麻烦引起了我的下一个建议......

在拇指驱动器上回购

老实说,除非您的回购非常大,否则这可能同样容易。将裸克隆放在拇指驱动器上,您可以从两台计算机上推入和拉出。将其视为您的网络连接。需要转移到中央回购?插上电源!

于 2010-09-03T19:58:30.343 回答
12

@Jefromi 的回答很棒——比 git 文档好 10 倍,后者详细介绍了难以理解的要求和行动。

它仍然有点复杂,所以这里是最简单的情况下同步一次(在我的情况下:FROM:带有损坏的 wifi 卡的离线笔记本电脑,TO:具有网络访问权限的台式机)。根据@Jefromi 的回答,这似乎工作正常:

AHEAD = 领先于一些提交的机器。BEHIND = 您要将提交复制到的机器

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

两者:复制 myBundleName.bundle(使用电子邮件、USB 等)

后面:(将文件 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

...它会更新主存储库,就好像您的更改是在本地完成的一样,像往常一样,在后面。

于 2012-10-14T16:35:54.777 回答