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


70

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

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

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

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


1
如果它们连接到互联网,你可以用DopBox使用它们:看stackoverflow.com/questions/3632723/git-with-dropbox/...
VonC

1
抱歉,它们都不会连接到互联网。将其添加到问题中。
matli 2010年

Answers:


112

捆绑!

带有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

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

我也采用了略有不同的方法来选择基础。手册页使用标签,始终与最新的参考保持最新,这些参考已转移到其他主机。我只使用了远程分支,它将引用其他主机传输的最后一个引用。这有点低效;由于捆绑落后了一步,因此最终捆绑的次数超出了您的需要。但是闪存驱动器很大,捆绑包很小,并且使用已有的ref而不是必须采取额外的步骤并谨慎对待标签,从而节省了很多精力。

使捆绑软件产生麻烦的一件事是,您不能将其推入捆绑包,也不能对其进行“变基”。如果要基于新的捆绑包,则必须重新创建它。如果要在其中进行新的提交,则必须重新创建它。这个麻烦引起了我的下一个建议。

在拇指驱动器上回购

老实说,除非您的回购确实很大,否则这可能同样容易。将裸克隆放在拇指驱动器上,即可从两台计算机上推入和拉出它。像对待网络连接一样对待它。需要转移到中央仓库吗?插上电源!


拇指驱动器的荣誉也来自我。可能会开始使用它。
akauppi 2012年

的正确参数顺序git remote addname并且仅在—之后url
shytikov 2012年

4
顺便说一句,这仅在完成的提交hostB接近hostA/master提交图中时才有效。例如,如果您要处理很久以前创建的分支experimental,则master该命令git bundle create hostB.bundle ^hostA/master --branches --tags将与的所有历史捆绑在一起experimental。这不是这种方法的根本问题,只是需要注意的地方。PS。对于其他想了解的^commit语法,它的意思是“不属于祖先的所有提交commit(见。git-rev-parseSPECIFYING REVISIONS
opqdonut

2
git bundle create hostA.bundle --branches --tags导致出现捆绑,当我尝试从中进行捆绑时会出现错误“ remote HEAD refers to nonexistent ref, unable to checkout”。使用git bundle create hostA.bundle --all似乎对我有用。
Michael Burr 2014年

2
我写了(希望)这种技术的用户友好的bash实现-见github.com/cxw42/git-tools/blob/master/wormhole。欢迎评论-YMMV-不提供保修:)。
cxw

10

@Jefromi的答案很棒-比git docs好的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

...并且它将更新主存储库,就好像您的更改是像往常一样在BEHIND上本地完成的一样。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.