在环境之间可重复移动可更新的代码 Git 分支



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

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

在"如何合并两个 Git 存储库?"和"如何将现有的 Git 存储库导入另一个?"中都有很好的细节。 不幸的是,似乎两者都没有涵盖我正在寻找的可重复性方面。

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

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

您将环境描述为"断开连接"。 我假设您的意思是您无法将一个存储库添加为另一个存储库的远程存储库。 解决方案是使用git bundle.

在存储库 1 中,创建一个捆绑包文件。 您将指定要从master历史记录创建捆绑包。

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

在接收端,您添加捆绑文件,就好像它是远程文件一样,然后您可以从中fetch并合并生成的 ref,或从中pull,或者其他什么。 就像遥控器一样。 唯一的问题是你不push捆绑包。 相反,您可以创建自己的捆绑包以发回。

因此,这从图片中删除了"断开连接"的方面。

如果你想捆绑master然后让它作为remote-dev接收,你可以在从捆绑包中获取时使用refspec;或者你可以继续remote-dev/master获取它,然后用一个名为rmeote-dev的本地分支进行跟踪;或任何其他变体。

无论您是否使捆绑包成为增量的,它都是可重复的,因为fetch始终知道它可能已经在其获取的历史记录中具有一些对象。

因此,现在您只是在两个长期存在的分支之间同步,就像您用于定期删除供应商或从上游更新分叉的模式一样。


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

最新更新