我需要找出是否存在对提交的引用。几乎有效的一件事是git show
,如果ref不存在,有时会返回非零值。但是,它还接受当前源树中的路径。因此,如果我有一个名为master
的文件,但参考master
不存在,则git show
会成功。我无法找到更具体的命令。
我希望接受这个方法:
编辑:我这样做是因为我想以编程方式对用户输入进行健全性检查。
答案 0 :(得分:6)
您可以使用带有--verify
标志的git rev-parse
来解析各种引用,并将它们解码为SHA-1哈希值。这将删除所有无效的引用和文件路径:
$ git rev-parse --verify HEAD
a93775d7fcd9bf27bbd89ee69e84a03e06223e9b
$ git rev-parse --verify HEAD~2
4100b19c32fac3e2c0838c85d180cd4f50500c2f
$ git rev-parse --verify master
e88352936f4ffc703cdfb0da95ad5592456feb0b
$ git rev-parse --verify origin/master
e88352936f4ffc703cdfb0da95ad5592456feb0b
$ git rev-parse --verify README.md
fatal: Needed a single revision
$ git rev-parse --verify doesnotexist
fatal: Needed a single revision
请注意,遗憾的是,这也会接受其他对象类型,例如:树木:
$ git rev-parse --verify "HEAD^{tree}"
5fdca9a3c0db1e1414229a7b50dac20e4e87a3b8
您可以使用git cat-file
,因为它直接在Git的对象数据库上运行。所以它只能找到实际存在的对象。它还会解析您传递给它的任何类型的修订参数,因此它可以理解各种引用。通过使用-t
参数,它将为您提供要传递的对象的类型。如果该类型是提交,那么您传递的任何内容都是指定现有提交的有效方式:
$ git cat-file -t HEAD
commit
$ git cat-file -t HEAD~2
commit
$ git cat-file -t master
commit
$ git cat-file -t origin/master
commit
$ git cat-file -t README.md
fatal: Not a valid object name README.md
$ git cat-file -t doesnotexist
fatal: Not a valid object name doesnotexist
$ git cat-file -t "HEAD^{tree}"
tree
因此,只需检查是否返回commit
,您似乎有一个很好的方法来验证用户输入是否是有效的提交引用。
答案 1 :(得分:0)
git show [options] <object>
如果您按照here所述更精确地编写对象名称,可以帮助您。例如,有关于master的注释:
master通常表示refs / heads / master引用的提交对象。如果您碰巧有head / master和tags / master,您可以明确地说head / master告诉Git你的意思。
有关git show
的更多信息答案 2 :(得分:0)
所以给定一些解析为现有提交的东西,你想找到指向它的所有引用吗?
以下似乎给出了你想要的东西:
git show-ref --head --heads --tags | grep `git rev-parse $THING`
答案 3 :(得分:0)