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

标签 git merge git-merge git-subtree

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

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

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

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

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

最佳答案

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

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

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

在接收端,您添加捆绑文件,就好像它是一个远程文件一样,然后您可以从中获取并 merge 生成的引用,或者从pull它,或其他什么。就像 Remote 一样。唯一的问题是您不 push 到 bundle 。相反,您创建自己的 bundle 以发回。

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

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

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

因此,现在您只是在两个长期存在的分支之间进行同步,这与您用来获取定期供应商掉线或从其上游更新 fork 的模式非常相似。


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

关于git - 在环境之间重复移动可更新的 Git 代码分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49671804/

相关文章:

python - 如何根据包含的字符串合并两个数据帧?

algorithm - 合并 k 个列表的最佳方式是什么?

git - 如何在 git 中预览 merge ?

git - 使用 SourceTree 将先前的 git 提交分解为更小的提交

git - 暂时恢复到之前的提交,进行更改,保留更改并返回到最新的提交?

git - 将本地分支从另一个本身经常重新定位的分支中重新定位是不是很糟糕?

git - "not something we can merge"是怎么产生的?

git - Bitbucket Cloud 中的级联 merge

git - 致命的 : A branch named 'gh-pages' already exists

git - 强制 git mergetool 修改以前完成的 merge