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

7
我需要查找提交的引用是否存在。有一种几乎有效的方法是使用git show,但是如果引用不存在,它有时会返回非零值。但是,它也接受当前源代码树中的路径。因此,如果我有一个名为master的文件,但是引用master不存在,git show仍然成功。我没有找到任何更具体的命令。
我希望这种方法能够接受:
  • 分支名称
  • 提交哈希
  • 标签
  • 关键词,如HEAD
编辑:我这样做是因为我想通过程序对用户输入进行合理性检查。
4个回答

11

您可以使用 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,您似乎已经有了一种验证用户输入是否为有效提交参考的好方法。


谢谢!看来“git cat-file -t”就是我要找的 :) - timthelion
1
请注意,它将返回“tag”作为标签,因此您需要检查输出是否为“commit”或“tag”。 - Captain Ahab
正是我所需要的!非常适合查找可以使用 HEAD~ 回溯多远的情况,例如查找第一个提交。 - xdevs23
请注意,这种方法无法验证 commit ID 是否存在。相反,git rev-parse 的帮助页面建议使用 git rev-parse --verify <commit_id>^{commit}(或者对于任何类型的对象使用 ^{object})来进行验证。 - dan

1
git show [options] <object>

如果您按照这里所述更精确地编写对象名称,我可以帮助您。例如,有关主分支的注释如下:

主分支通常是由refs/heads/master引用的提交对象。如果您同时拥有heads/master和tags/master,则可以明确指出heads/master以告诉Git您想要哪一个。

有关git show的更多信息。


这在命令行下是有效的,但我现在正在尝试以编程方式对用户输入进行清理。在我的程序执行检查的那一点上,它并不知道任何关于输入的信息,只知道它是一个键入的字符串。 - timthelion

0

如果你想要检查所有的分支,你可以使用git branch -a列出所有的远程和本地分支。

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

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

如果你想知道你的HEAD指向哪个提交,你可以使用git rev-parse HEAD进行检查。参考这里

如果你想了解更多,你可以查看书籍Pro Git


git log 是列出所有提交记录,还是仅列出与 HEAD 相关的提交记录?其他分支中的提交记录呢? - timthelion

0

所以,如果给定一个解析为现有提交的内容,你想要找到指向它的所有引用吗?

以下似乎可以满足你的需求:

git show-ref --head --heads --tags | grep `git rev-parse $THING`

我想对用户输入进行合理性检查。show-ref 命令可以帮我完成一半的工作。现在我可以检查分支名称或其他引用(如 HEAD)是否存在/有效。但我仍然不知道如何确定提交哈希值是否存在。 - timthelion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接