在类似的主题Validate if commit exists中,他们建议:
git rev-list HEAD..$sha
如果它没有错误代码而退出,则提交存在。
但是,仅仅为了验证,它是否足够有效?
我在考虑这个选择:
git cat-file commit $sha
它是否适合我的任务,还有其他想法吗?
在类似的主题Validate if commit exists中,他们建议:
git rev-list HEAD..$sha
如果它没有错误代码而退出,则提交存在。
但是,仅仅为了验证,它是否足够有效?
我在考虑这个选择:
git cat-file commit $sha
它是否适合我的任务,还有其他想法吗?
5条答案
按热度按时间yiytaume1#
你可以运行
git cat-file -t $sha
并检查它是否返回“commit”。你是对的,你不需要为它打印实际的对象。我不是100%确定幕后发生的事情更有效率。
test $(git cat-file -t $sha) == commit
eit6fx6z2#
来自
git cat-file
文档:这(1)表明这是
cat-file
的预期用例,(2)避免了实际输出任何提交内容的资源。追加
^{commit}
可以确保对象是一个提交(即不是一个树或blob),或者正如remram指出的那样,解析为一个提交。比如说
dy1byipe3#
如果提交存在,此命令的错误代码将为0,如果不存在,则为1:
如果你想更容易阅读,附加
&& echo "exists" || echo "doesn't exist"
。git rev-parse
文档:作为奖励,如果你不抑制输出,你可以得到完整的sha。
pvcm50d14#
如果你确定sha是commit,那么
cat-file -e
可以用于以下例子:这是非常有效的,因为这是一个内置的,除了检查sha是否存在之外,不做任何事情:
否则,如果不确定sha是否是commit对象,你就需要使用
git cat-file -t
来确定类型。这只是性能稍差,因为git必须查看文件信息。这不像解压缩整个文件那么昂贵。zfciruhq5#
git rev-list HEAD..$sha
将检查$sha * 是否与HEAD
相关。git cat-file commit $sha
将检查存储库中是否存在$sha。这将取决于你的用例。
一个用例需要第一个选项,例如:检查上游是否有新提交
使用
rev-list
,我可以验证main
没有修订版2d9dbaa
,而cat-file
也没有帮助(因为修订版确实存在于不同的分支中)。