【问题标题】:Git: How to determine if a ref to a commit existsGit:如何确定提交的引用是否存在
【发布时间】:2016-04-10 06:32:01
【问题描述】:

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

我想接受的方法:

  • 分支机构名称
  • 提交哈希
  • 标签
  • HEAD 等关键字

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

【问题讨论】:

    标签: git


    【解决方案1】:

    您可以使用 git rev-parse--verify 标志来解析各种 ref 并将它们解码为它们的 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”是我要找的:)
    • 请注意,它将为标签返回tag,因此您需要检查输出中是commit 还是tag
    • 正是我需要的!很适合使用HEAD~ 了解您可以返回多远,例如寻找第一个提交
    【解决方案2】:
    git show [options] <object>
    

    如果您按照here 的描述更准确地编写对象名称,可以为您提供帮助。比如有一个关于master的注释:

    master 通常表示 refs/heads/master 引用的提交对象。如果你碰巧有 head/master 和 tags/master,你可以明确地说 head/master 来告诉 Git 你指的是哪一个。

    更多关于git show的信息

    【讨论】:

    • 这在我在命令行时有效,但我现在正在做的是尝试以编程方式清理用户输入。在我的程序执行检查时,它对输入一无所知,只知道它是一个输入的字符串。
    【解决方案3】:

    因此,如果某些东西可以解析为现有的提交,你想找到所有指向它的 refs 吗?

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

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

    【讨论】:

    • 我想检查用户输入的完整性。 show-ref 实际上让我走到了一半。我现在可以检查分支名称或其他引用(如 HEAD)是否存在/有效。我仍然不知道如何确定提交哈希是否存在。
    【解决方案4】:

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

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

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

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

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

    【讨论】:

    • git log 是否实际上列出了所有提交或仅列出从 HEAD 链接到的提交?其他分支的提交呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    相关资源
    最近更新 更多