在类似的主题Validate if commit exists中,他们建议:
git rev-list HEAD..$sha
如果退出时没有错误代码,则提交存在。
但它仅仅用于验证是否足够有效?
我在想这个选项:
git cat-file commit $sha
我的任务是否正确,还有其他想法吗?
答案 0 :(得分:33)
您可以运行git cat-file -t $sha
并检查它是否返回“commit”。你是对的,你不需要为此实际打印实际对象......
我不是百分之百确定幕后发生的事情会更有效率。
test $(git cat-file -t $sha) == commit
答案 1 :(得分:28)
git cat-file -e $sha^{commit}
来自git cat-file
文档:
-e Suppress all output; instead exit with zero status if <object> exists and is a valid object.
这(1)表明这是cat-file
的预期用例,(2)避免了实际输出任何提交内容的资源。
追加^{commit}
确保对象是提交(即不是树或blob),或者 - 正如remram指出的那样 - 解析为提交。
例如,
if git cat-file -e $sha^{commit}; then
echo $sha exists
else
echo $sha does not exist
fi
答案 2 :(得分:7)
如果您确定sha是提交,则可以使用cat-file -e
,例如:
if git cat-file -e $sha 2> /dev/null
then
echo exists
else
echo missing
fi
这是非常有效的,因为这是内置的,除了检查sha存在之外什么都不做:
return !has_sha1_file(sha1);
否则,如果不确定sha是提交对象,则需要使用git cat-file -t
确定类型与其他答案一样。这只是性能稍差,因为git必须查看文件信息。这并不像拆包整个文件那样昂贵。
答案 3 :(得分:1)
git rev-parse -q --verify "$sha^{commit}" > /dev/null
来自git rev-parse
文档:
--verify Verify that exactly one parameter is provided, and that it can be turned into a raw 20-byte SHA-1 that can be used to access the object database. If so, emit it to the standard output; otherwise, error out. If you want to make sure that the output actually names an object in your object database and/or can be used as a specific type of object you require, you can add the ^{type} peeling operator to the parameter. For example, git rev-parse "$VAR^{commit}" will make sure $VAR names an existing object that is a commit-ish (i.e. a commit, or an annotated tag that points at a commit). To make sure that $VAR names an existing object of any type, git rev-parse "$VAR^{object}" can be used. -q, --quiet Only meaningful in --verify mode. Do not output an error message if the first argument is not a valid object name; instead exit with non-zero status silently. SHA-1s for valid object names are printed to stdout on success.
作为奖励,如果不抑制输出,则可以获得完整的阴影。