20

如何验证当前分支中是否存在具有给定 sha 的提交?

解析输出的方法有很多,但我需要返回布尔值的最佳方法(用于 bash 脚本)。

例如

sha=$1
if [ -z `git magic --validate $sha` ]; then
  echo "Invalid commit sha: $sha"
  exit 1
fi
4

6 回答 6

23
git rev-parse --quiet --verify <commit>

实际上并没有验证提交(我猜 SHA1 是什么意思)存在。它验证数据库中是否存在与提供的 SHA1 对应的对象。也就是说,如果有一个与 SHA1 匹配的 blob 或树对象,它会报告它存在,即使它不是一个提交。

git rev-parse --quiet --verify <sha1>^{commit}

这将验证该对象是否存在以及它是一个可用作提交(提交或注释标记)的对象。

于 2014-02-19T11:18:08.953 回答
4

你可以看看输出

git rev-list HEAD..$sha

如果由于存储库中根本不存在 sha1 而导致此命令失败,则退出代码将非零。如果输出为空,则提交在当前分支中,如果为非空,则不是。所以你的脚本看起来像

if revlist=`git rev-list HEAD..$sha 2>/dev/null` && [ -z "$revlist" ]; then
    :
fi

如果您已经知道$sha确实命名了一个提交(作为 SHA1 哈希或以任何其他方式),这将简化为

if [ -z "`git rev-list HEAD..$sha`" ]; then
    :
fi
于 2010-11-08T21:07:47.963 回答
4

rev-list | grep方法工作正常;开销最小,因为 git 必须打印出所有 SHA1grep才能查看,但这并不是什么大问题。

如果您愿意,您也可以这样做git merge-base- 如果目标提交的合并基础和分支是目标提交,则分支包含目标提交:

if [ "$(git merge-base $commit $branch)" = "$commit" ]; then
    ...
fi

无论采用哪种方式,请注意rev-list并且merge-base将打印出 SHA1,因此,如果您正在测试包含的提交由分支或标签命名,您需要git rev-parse先将其转换为 SHA1。

于 2010-11-08T23:18:20.323 回答
3

git cat-file 打印有关存储库中对象的信息。“-e”检查对象是否有效并以 0 状态退出,当无效时以 1 状态存在。

git cat-file -e 3d68db1028afe27a0055c2234f98fc945b1958f5
echo $?
1
于 2015-08-18T12:35:27.083 回答
2
git merge-base --is-ancestor $sha HEAD

这将测试是否$sha是当前分支 ( HEAD) 的祖先提交,如果是则成功退出。

在你的例子中,

sha=$1
if ! git merge-base --is-ancestor $sha HEAD; then
  echo "Invalid commit sha: $sha"
  exit 1
fi
于 2015-09-07T17:40:32.163 回答
1
git rev-list branch-youre-interested-in | grep -q sha-youre-interested-in

您可以在条件句中使用 grep 的退出代码。

对于当前分支,

 git rev-list HEAD | grep -q sha-youre-interested-in
于 2010-11-08T21:06:55.573 回答