如何确定给定分支上是否存在给定的git哈希?

Pin*_*nko 38 git

背景:我使用一个自动构建系统,它将git哈希作为输入,以及该哈希存在的分支的名称,并构建它.但是,构建系统仅使用哈希来检查代码并构建它 - 它只是将给定的分支名称存储在构建DB元数据中.

我担心开发人员在启动构建时意外地提供了错误的分支名称,当人们查看构建历史记录时会引起混淆.

那么,在将哈希和分支名称传递给构建系统之前,如何确认给定哈希实际上来自给定分支?

Dus*_*tin 121

您可以git branch直接询问哪些分支包含有问题的提交:

% git branch -a --contains 4f08c85ad
* master
  remotes/origin/bug_872
  remotes/origin/bug_898
  remotes/origin/master
Run Code Online (Sandbox Code Playgroud)

  • 删除`-a`选项仅从本地分支列出 (7认同)
  • 可以使用特定的分支而不是`-a`例如`$ git branch develop --contains 4f08c85ad` (3认同)

Chr*_*sen 8

嗯,这个分支名称的使用似乎很可疑.正如Dustin的回答一样,可能有多个分支包含提交.为什么这些分支名称中的任何一个比另一个更好?


如果您只关心一个特定分支,则可以计算分支和提交之间的"合并基础".

在下面的图中,提交构建是C,声明的分支的提示是T,并且合并基础在其M上方标记.

您可以像这样进行此检查:

#!/bin/sh

# Usage: is-ancestor-of <branch> <commit>

if test $# -ne 2; then
    echo "$0"': invalid arguments'
    exit 128
fi
claimed_branch="$1"
commit="$2"

merge_base="$(git merge-base "$commit" "$claimed_branch")" &&
  test -n "$merge_base" &&
  test "$merge_base" = "$(git rev-parse --verify "$commit")" &&
  exit 0

echo "$commit is not an ancestor of $claimed_branch" 1>&2
exit 1
Run Code Online (Sandbox Code Playgroud)

上面的脚本实际上并不要求或检查'branch'参数是否为分支(它可以是任何commit-ish).要检查某些内容实际上是一个分支,您可以使用以下内容:

#!/bin/sh

# Usage: is-branch <branch>

if test $# -ne 1; then
    echo "$0"': invalid arguments'
    exit 128
fi
branch="$1"

# check various branch hierarchies, adjust as needed
git show-ref --verify refs/heads/"$branch" ||
git show-ref --verify refs/remotes/"$branch" || {
    echo "not a branch name: $branch" 1>&2
    exit 1
}
Run Code Online (Sandbox Code Playgroud)

所以你可以一起使用它们来验证某个东西是一个分支,并且某个提交在该分支中:

is-branch "$claimed_branch" && is-ancestor-of "$claimed_branch" "$commit_to_build"
Run Code Online (Sandbox Code Playgroud)

  • 当git有一个内置的更好的解决方案时,你为什么要这样做呢?为什么这个荒谬的错综复杂的答案在明显不是最好的时候才被接受?我浪费时间筛选这个而不是向下滚动到应该在顶部的答案.哇... (6认同)