【问题标题】:Hot fix between two remote git repositories两个远程 git 存储库之间的热修复
【发布时间】:2017-10-18 09:19:33
【问题描述】:

我有两个 git 远程仓库,一个用于测试,另一个用于生产。

git 远程 -v 生产 https://ejemlo@bitbucket.org/deploy/pr1.git (fetch) 生产 https://ejemlo@bitbucket.org/deploy/pr1.git(推送) 测试 https://ejemlo@bitbucket.org/deploy/pr1_test.git (fetch) 测试 https://ejemlo@bitbucket.org/deploy/pr1_test.git(推送)

当有人进行更改时,他们会在本地工作并推送到测试远程:

 git push 测试大师

有人进行拉动,测试更改,如果没问题,将其推送到生产环境。

 git push 生产大师

问题是当我有各种更改要在推送到生产之前进行测试时,但我需要应用即时修补程序。 如果不推送之前的其他更改(尚未测试),我无法将修补程序推送到生产环境。



例子:

测试存储库: 测试提交 6 - hotfix(我修复了一些东西) 测试提交 5 测试提交 4 测试提交 3 - 此时等于生产。 测试提交 2 测试提交 1 生产仓库: 生产提交 3 生产提交 2 生产提交 1

我想推送修补程序提交(提交 6)而不推送到生产提交 4 和 5。可以这样做吗?

谢谢。

【问题讨论】:

  • 没有。如果你不想要 4 和 5 引入的变化,你需要在 3 的基础上做 6。

标签: git version-control git-commit git-push git-remote


【解决方案1】:

问题在于您正在使用 repos 来执行分支的用途。出于好奇,您如何处理提交被拒绝(但之后的提交很好)的情况?

任何解决方案(除了转移到适合您需求的分支策略,之后您可能会发现单个 repo 不仅足够而且更容易处理)都会变得混乱。

所有可能的选项都归结为将提交 6 重新设置为提交 3。您不真的希望重新设置返回到您的测试存储库,因为它会给所有开发人员造成混乱.但是,如果那个 rebase 返回测试,那么最终它也必须从生产中删除,以使 repos 恢复同步。

Test Repo
1 --- 2 --- 3 --- 4 --- 5 --- 6 <--(master)

Prod Repo
1 --- 2 --- 3 <--(master)

Local
1 --- 2 --- 3 --- 4 --- 5 --- 6 <--(master)

做一个变基;将此命令中的提交号替换为相应的 SHA ID

git checkout master
git checkout -b temp_master
git rebase --onto 3 5

现在你有

Test Repo
1 --- 2 --- 3 --- 4 --- 5 --- 6 <--(master)

Prod Repo
1 --- 2 --- 3 <--(master)

Local
1 --- 2 --- 3 --- 4 --- 5 --- 6 <--(master)
             \
              6' <--(temp_master)

现在你必须测试6'。这是以前从未存在过的代码的新状态,并且未经测试。如果6 无意中依赖于45 中的某些内容,则6' 已损坏。

所以你测试,它工作。将修补程序投入生产

git push production temp_master:master

屈服

Test Repo
1 --- 2 --- 3 --- 4 --- 5 --- 6 <--(master)

Prod Repo
1 --- 2 --- 3 --- 6' <--(master)

Local
1 --- 2 --- 3 --- 4 --- 5 --- 6 <--(master)
             \
              6' <--(temp_master)

现在我的建议是尽快完成45的验收测试,然后将master强制推送到production并删除temp_master

如果你发现你必须在5 准备好之前推送4,它也必须重新定位到6'

git rebase temp_master 4
git branch -f temp_master

4 再次被替换为提交的 SHA)。

再次,停止并重新测试,因为6' 中的某些内容可能与4 发生不良交互,因此4' 是代码的新的未经测试的状态。一切都很好?那么:

git push production temp_master:master

你得到

Test Repo
1 --- 2 --- 3 --- 4 --- 5 --- 6 <--(master)

Prod Repo
1 --- 2 --- 3 --- 6' -- 4' <--(master)

Local
1 --- 2 --- 3 --- 4 --- 5 --- 6 <--(master)
             \
              6' --- 4' <--(temp_master)

此时,您可能会认为,当您测试了 5 后,您不妨对其进行变基,然后继续在生产中使用重新订购的分支进行运输。不要,除非您愿意在测试(以及每个人的本地仓库)中重新排序分支,这将是一件麻烦事。归根结底,您需要一个共同的历史记录,因为即使您将5 变基以获取

Local
1 --- 2 --- 3 --- 4 --- 5 --- 6 <--(master)
             \
              6' --- 4' --- 5' <--(temp_master)

您可能会发现 65' 看起来相同 - 它们具有相同的累积更改集和相同的结果树 - 但它们是不同的提交,基于一个的工作必须重新基于另一个.

【讨论】:

    【解决方案2】:

    在测试仓库中,运行:

    git format-patch hotfix~..hotfix
    

    这将生成一个补丁文件。在生产仓库中,运行:

    git am the.patch
    

    【讨论】:

    • 我建议不要这样做。首先,将补丁应用到生产环境中,而无需测试代码的结果状态。其次,生产历史现在与所有其他存储库不同,因此您必须至少像我概述的过程的后续步骤一样进行清理。
    • @MarkAdelsberger 同意。我回答的目的是让 OP 准确地实现他想要的,而不是改进他的流程,这是一个更大的话题,坦率地说,无关紧要。
    • 有多种方法可以让 OP “完全符合他的要求”。至少一种这样的方式 - 如我的回答中所述 - 没有我在您的回答中指出的问题。无论如何,当某人即将踩到地雷时告诉他们是永远“离题”
    • 您的回答并没有给 OP 提供他想要的东西,而不是让他显着改变他的过程。我并不是在争论这种改变是好是坏,只是指出这一事实。
    • 而且我认为你在 OP 的情况下假设太多了。仅仅因为他们想在他们的生产分支中挑选一个修补程序,并不一定意味着他们正在踩地雷。您假设 OP 的系统由代码组成,因此某处的更改可能会以一种模糊的方式影响其他地方。 OP 可以简单地维护一个由静态网页组成的静态网站,其中的更改只是没有太大影响的更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 2012-08-09
    • 2017-04-29
    • 2014-09-12
    • 1970-01-01
    • 2012-01-27
    相关资源
    最近更新 更多