Git:如何确定是否存在对提交的引用

时间:2016-01-06 08:23:14

标签: git

我需要找出是否存在对提交的引用。几乎有效的一件事是git show,如果ref不存在,有时会返回非零值。但是,它还接受当前源树中的路径。因此,如果我有一个名为master的文件,但参考master不存在,则git show会成功。我无法找到更具体的命令。

我希望接受这个方法:

  • 分支机构名称
  • 提交哈希
  • 标签
  • 像HEAD这样的关键字

编辑:我这样做是因为我想以编程方式对用户输入进行健全性检查。

4 个答案:

答案 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)

如果要检查所有分支,可以使用git branch -a列出所有远程和定位分支。

如果要检查所有提交哈希值,可以使用git log列出所有提交。

如果要检查所有标记,可以使用git tag -l列出所有标记名称。

如果您想知道HEAD指向哪个提交,您可以使用git rev-parse HEAD进行检查。并以this为参考。

如果您想了解更多信息,可以查看图书Pro Git