找到任何特定提交的分支点

时间:2016-09-20 17:36:39

标签: git jenkins-pipeline

作为Jenkins Pipeline构建系统的一部分,我需要找出任何分支的最近祖先的特定提交SHA,无论是主分支还是任何其他分支。在视觉上,箭头指向所需的提交与被分析的提交相比:

Some Git history I found

与(1)中一样,祖先是主(黑线),但它不是前面的提交,它已经是分支的一部分。在(6)中,期望的提交是标记为“Dev”的分支的一部分。

在我的场景中,这只会在由git推送触发时执行,所以我们至少可以假设当前分支尚未合并到任何其他分支(希望如此)。

我没有Git的经验,所以我试图拼凑一些东西,但到目前为止没有任何工作按预期进行。有人对此提出建议吗?

想法失败

  • 执行git rev-list HEAD ^list-all-branches-but-the-current-one,获取最早的提交,然后获取它的直接祖先,但这会失败,因为我的当前分支可能是分支的,所以属于两者的提交都将被删除,并且我会最终得到我的分支分支的SHA,而不是从哪里分支;

  • This other SO answer提供了一个很好的命令来查找分支的祖先与另一个分支:diff --old-line-format= --new-line-format= <(git rev-list --first-parent master) <(git rev-list --first-parent HEAD) | head -1,但问题是我仍然不知道要比较哪个分支,因为它不会永远是主人。

更新1

我一直在玩替代品,我在this SO answer的评论中达到了这个版本的修改版本:

git rev-parse "$(git show-branch | sed "s/].*//" | grep "\*" | tail -n 1 | sed 's/.*\[\(.*\)/\1/')"~1

它使用分支的可视化显示,执行以下步骤:

  1. 展示分支机构;
  2. 删除第一个]之后的所有内容,这是围绕提交引用;
  3. 仅保留包含*的行,用于标记当前分支;
  4. 只占最后一行(最旧的);
  5. 删除[以外的所有内容,只留下提交引用;
  6. 获取在最后一步(分支点)中获得的提交之前的提交。
  7. 我可以确认的缺点:

    1. 如果您签出提交哈希,请不要工作,您需要签出一个分支;
    2. 因此,分支需要存在(你不能在树的任何一点上做到这一点);
    3. (不完全确定)如果你在另一个现在被删除的分支的分支中执行它,它会一直到现在已删除的分支从其父分支分支的位置。
    4. 根据我的测试,它似乎有用,可能对我的情况来说已经足够了。有评价吗?

0 个答案:

没有答案
相关问题