验证是否存在提交

时间:2010-11-08 20:54:01

标签: git scripting githooks

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

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

e.g。

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

6 个答案:

答案 0 :(得分:18)

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

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

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

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

答案 1 :(得分: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

答案 2 :(得分:4)

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

如果您愿意,也可以使用git merge-base执行此操作 - 如果目标提交和分支的合并基础是目标提交,则分支包含目标提交:

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

无论哪种方式,请注意rev-listmerge-base将打印出SHA1,因此如果您要测试包含的提交是由分支或标记命名的,那么''我想先用git rev-parse把它变成SHA1。

答案 3 :(得分:2)

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

git cat-file -e 3d68db1028afe27a0055c2234f98fc945b1958f5
echo $?
1

答案 4 :(得分: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

答案 5 :(得分: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