在环境

时间:2018-04-05 11:56:50

标签: git merge git-merge git-subtree

我正在尝试使用Git设计一种在两个断开连接的环境之间移植代码的方法。在合并发布之前,代码将在两个位置进行编辑。理想情况下,我想从一个位置(A)导出“master”分支,然后将其作为“remote-dev”分支添加到另一个位置(B)的存储库中。之后,可以将“remote-dev”分支中的更改合并到第二个位置(B)的“主”分支中,以进行发布准备。这种传输将周期性地重复,因此希望能够用更新的代码覆盖“remote-dev”并且仍然保留历史并且仍然允许合并到“master”而不必重新合并先前合并的代码。此外,只有“主”分支应该从环境A带来,因为将存在许多其他具有活动开发的分支,不应该被复制。

此处的目标是实现自动化,可重复的流程。我希望能够设置一个批处理文件,每晚在环境A中导出一个分支。有人会将文件复制到环境B并将它们放在一个放置位置。另一个批处理文件将被安排在环境B中运行,环境B拾取文件并将它们合并到环境B中的目标存储库中。

How do you merge two Git repositories?”和“How to import existing Git repository into another?”都有很好的细节。不幸的是,似乎都没有涵盖我正在寻找的可重复性方面。

这两个讨论都提到了“git merge”和“git subtree add”作为可能的解决方案,用于将分支划分为不同的存储库。但是,它们都没有涵盖它的可重复性方面。是否有必要在重新合并之前删除目标分支,或者可以将导入的分支合并到先前导入的顶部?此外,是否应采取任何特殊步骤从环境A仅导出“主”分支,以避免在环境之间移动任何多余的数据?

有没有人尝试过这样的事情并取得成功?

1 个答案:

答案 0 :(得分:3)

您将环境描述为“已断开连接”。我假设你的意思是你不能添加一个回购作为另一个的远程。解决方案是使用git bundle

在repo 1中,您创建一个捆绑文件。您将指定您希望从master历史记录创建的包。

如果需要,还可以通过为捆绑包指定“起始点”来使捆绑包增量。我的意思是,你可以说“如果你要导入这个包,你必须已经有了提交ABC,因为那是包中第一个提交的父提交”。

在接收端,您将捆绑文件添加为遥控器,然后您可以fetch从中添加捆绑文件并合并生成的参考,或者pull,或者其他任何内容。就像一个遥控器。唯一的问题是你没有push到捆绑。而是创建自己的包以发回。

这样就从图片中删除了“断开连接”的方面。

如果要捆绑master然后将其作为remote-dev收到,则可以在从捆绑中获取时使用refspec;或者您可以继续将其作为remote-dev/master获取,然后使用名为rmeote-dev的本地分支进行跟踪;或任何其他变体。

你是否可以重复使用增量包,因为fetch总是知道它可能已经拥有了它所提供的历史记录中的一些对象。

所以现在你只是在两个长期分支之间进行同步,就像你用来定期停止供应商或从上游更新分支的模式。

顺便说一下,上述答案假设除了断开连接的环境之外,您还有理由想要您所描述的分支工作流程。事实是,使用捆绑文件,您可以像使用连接的存储库一样工作,所以如果您假设需要远程开发分支来处理分离,我不会打扰。分布式开发正是git的用途。