验证是否存在提交

tak*_*hin 14 git scripting githooks

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

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

例如

sha=$1
if [ -z `git magic --validate $sha` ]; then
  echo "Invalid commit sha: $sha"
  exit 1
fi
Run Code Online (Sandbox Code Playgroud)

小智 18

git rev-parse --quiet --verify <commit>
Run Code Online (Sandbox Code Playgroud)

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

git rev-parse --quiet --verify <sha1>^{commit}
Run Code Online (Sandbox Code Playgroud)

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


Cas*_*bel 4

rev-list | grep方法能正常工作; 这是最小的开销,因为git必须打印出所有的SHA1 grep才能看到,但这并不是什么大不了的事.

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

if [ "$(git merge-base $commit $branch)" = "$commit" ]; then
    ...
fi
Run Code Online (Sandbox Code Playgroud)

无论你采用哪种方式,请注意rev-listmerge-base打算输出SHA1,因此,如果您正在测试包含的提交是由分支或标记命名的,那么您将首先使用git rev-parse它将其转换为SHA1.

  • @nvie如果你试图验证提交的存在,我认为规范的方式是`git rev-parse --quiet --verify <commit>`. (8认同)