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

Repeatable moving of updatable Git branch of code between environments

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

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

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

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

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

您将环境描述为 "disconnected"。我假设您的意思是您不能将一个仓库添加为另一个仓库的远程仓库。解决方案是使用 git bundle.

在回购 1 中,您创建了一个捆绑文件。您将指定要从 master 的历史记录中创建包。

如果需要,您还可以通过为捆绑包指定 "starting point" 来使捆绑包增量。我的意思是,你可以说 "if you're going to import this bundle, you must already have commit ABC, because that's the parent commit of the first commit in the bundle".

在接收端,你添加 bundle 文件就好像它是一个远程文件,然后你可以从它 fetch 并合并结果 refs,或者从它 pull 或其他任何东西.就像遥控器一样。唯一的问题是您没有 push 捆绑包。相反,您创建自己的捆绑包以发回。

这样就从图片中删除了 "disconnected" 方面。

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

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

所以现在您只是在两个 long-lived 分支之间进行同步,这很像您用来获取定期供应商掉线或从其上游更新分支的模式。


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