【问题标题】:Repeatable moving of updatable Git branch of code between environments在环境之间重复移动可更新的 Git 代码分支
【发布时间】:2018-09-15 05:50:08
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你说的这个“remote-dev”分支与git的远程跟踪分支有什么不同?我可能遗漏了一些东西,但在我看来,您正在描述标准的 git 操作程序。您不仅限于单个远程,所有存储库(您称它们为“环境”)都是对等的,即使它们通常最方便地被视为层次结构。
  • 这些环境是完全独立的网络,无法直接相互交互。从一个到另一个的任何文件都必须使用便携式媒体手动复制。
  • 使用git bundle进行sneakernet传输,其描述的第一句话是“有些工作流要求在一台机器上的一个或多个开发分支复制到另一台机器上,但两台机器不能直接已连接,因此无法使用交互式 Git 协议(git、ssh、http)。”
  • 附注虽然我的问题属于它所在的位置,但我上面的其余回答最好作为对 Mark Adelsberger 的目标答案的评论来阅读。我认为您只是想使用 git,因为它本来就是要使用的,而且对运动鞋网的需求非常罕见,以至于您之前没有遇到任何指向 git bundle 的指针。

标签: git merge git-merge git-subtree


【解决方案1】:

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

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

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

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

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

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

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

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


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

【讨论】:

  • "git bundle" 绝对是赢家。在接收端将它与“git fetch”组合起来。发送:“git bundle create file.bundle master” 接收:“git fetch file.bundle master:remotedev”。仍在编写用于自动化流程的脚本,但我已经能够测试我在哪里进行了多次导出和导入以及数据更改以及存储库更新之间双方的编辑。
猜你喜欢
  • 2019-06-08
  • 2016-11-01
  • 2011-04-22
  • 1970-01-01
  • 2013-02-28
  • 2016-11-09
  • 1970-01-01
  • 2013-11-05
  • 2013-11-02
相关资源
最近更新 更多