我需要找出是否存在对提交的引用.几乎有效的一件事是git show
,如果ref不存在,有时会返回非零值.但是,它还接受当前源树中的路径.因此,如果我有一个名为master
但master
不存在ref 的文件,则git show
成功.我找不到任何更具体的命令.
我想要接受的方法:
分支机构的名称
提交哈希值
标签
关键词如HEAD
编辑:我这样做是因为我想以编程方式对用户输入进行完整性检查.
您可以使用git rev-parse
该--verify
标志来解析各种引用并将它们解码为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
,您似乎有一个很好的方法来验证用户输入是否是有效的提交引用.