【问题标题】:How to detect to which branch a tagged commit was merged into如何检测标记提交合并到哪个分支
【发布时间】:2019-08-05 09:59:51
【问题描述】:

作为由 git 标签触发的 ci 进程的一部分,我需要使用该标签名称自动更新代码中的某些内容,然后将结果提交回 git。

问题是,在成功的合并请求之后,分支通常会被删除,因此该提交的标记现在完全分离并且不包含在任何分支中,因此“提交回 git”并不是那么微不足道,因为我没有要提交的分支。

我可以默认提交到 master 中,这通常会起作用,但会有一些边缘情况我无法预测其行为。

一个更合理的解决方案是,以某种方式(如果可能)找出一个标记的提交被合并到哪个分支,以便我将提交回那个分支。

这可能吗?

(另外,如果您发现这种方法有任何问题和/或有更好的建议,请分享您的想法)

【问题讨论】:

    标签: git continuous-integration git-merge git-tag


    【解决方案1】:

    您可以获取标签可达的分支列表

    git for-each-ref --contains my_tag refs/heads
    

    (您可以使用git branch 而不是git for-each-ref,但for-each-ref 通常更适合在脚本中使用。您可能必须添加--format 选项才能使输出看起来符合您的要求。 )

    这可能会返回多个分支,您必须决定如何协调它。一种策略是查看其中一个分支是否可以从另一个分支到达。例如,如果您有

    x -- x -- A <-[my_tag]
                \
             ... M -- x <--(b1)
                       \
                    ... M <--(b2)
    

    我们可以从b2 访问b1,并且两者都可以访问标记的提交。如果“我认为发出了什么合并命令”是重要的事情,您可能直观地更愿意说A 被合并到b1 中。或者,如果在最新开发附近提交效果更好,那么在这种情况下您可能会选择b2。无论哪种方式,您也可能遇到类似的情况

    x -- x -- A <-[my_tag]
                \
                 \        x <--(b1)
                  \      /
               ... M -- x
                         \
                          x <--(b2)
    

    A 合并到“b1”与“合并到b2”(与“合并到其他不再存在的分支”)是完全任意的。所以在这一点上,你可能只需要选择一个。

    所以一般来说,您不能唯一标识标记提交合并到的一个分支。它可能已合并到已删除的分支中,甚至可能已在分离的 HEAD 状态下合并。

    由于您对团队的分支/合并策略和其他实践的了解,您可能能够消除其中一些可能性,但值得注意的是,git 本身并不关心诸如“此提交合并到的分支” - 它只关心“在当前状态下可以到达此提交的分支”之类的事情;所以你必须施加更具体的假设。

    【讨论】:

      猜你喜欢
      • 2018-05-10
      • 2014-01-22
      • 2021-06-26
      • 2017-04-26
      • 1970-01-01
      • 2015-04-15
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多