我正在尝试使用git在两个断开连接的环境之间移植代码。在合并到一起发布之前,代码将在两个位置进行编辑。理想情况下,我希望从一个位置(a)导出“master”分支,然后将其作为“remote dev”分支添加到另一个位置(b)的存储库中。之后,“远程开发”分支中的更改可以合并到第二个位置(b)的“主”分支中,以进行发布准备。此传输将定期重复,以便能够用更新的代码覆盖“remote dev”,并保留历史记录,仍然允许合并到“master”,而不必重新合并以前合并的代码。而且,只有“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中仅导出“master”分支,以避免在环境之间移动任何多余的数据?
有人成功地尝试过这样的事情吗?
最佳答案
您将环境描述为“断开连接”。我假设您的意思是,您不能将一个回购添加为另一个的远程回购。解决方法是使用git bundle
。
在repo 1中,创建一个包文件。您将指定要从master
的历史记录创建包。
如果需要,您还可以通过为bundle指定“起点”使bundle递增。我的意思是,您可以说“如果要导入这个包,您必须已经有commit abc,因为这是包中第一个commit的父commit”。
在接收端,将bundle文件添加为远程文件,然后可以从中fetch
并合并结果ref,或从中pull
或其他内容。就像遥控器一样。唯一的问题是你不能把它打包。相反,您可以创建自己的包发送回去。
这样就消除了图片中“断开连接”的部分。
如果您希望将push
打包,然后将其作为master
接收,则可以在从捆绑包提取时使用refspec;或者可以继续将其作为remote-dev
提取,然后使用名为remote-dev/master
的本地分支或任何其他变体跟踪它。
无论您是否使bundle递增,它都是可重复的,因为rmeote-dev
总是知道它可能已经在其获取的历史中拥有一些对象。
所以现在您只需在两个长寿命分支之间进行同步,这非常类似于从上游定期删除供应商或更新fork的模式。
另外,上面的答案假设除了断开连接的环境之外,您有理由需要所描述的分支工作流。事实是,使用bundle文件,您可以像处理连接的存储库一样工作,所以如果您假设需要一个远程dev分支来处理分离,我就不麻烦了。分布式开发正是git的目的。