【问题标题】:What does git rev-parse do?git rev-parse 有什么作用?
【发布时间】:2013-03-25 19:10:04
【问题描述】:

git rev-parse 是做什么的?

我已阅读手册页,但它提出的问题多于答案。比如:

挑选和按摩参数

按摩?这是什么意思?

我用作修订说明符的解析器(到 SHA1),例如

git rev-parse HEAD^

git rev-parse origin/master

这是命令的目的吗?如果不是,使用它来实现这一点是否正确?

【问题讨论】:

  • 据我在手册页中看到的,它主要是用于解析其他命令的修订/对象名称的内部实用程序。您所做的几乎就是 rev-parse 命令的目的。您还可以使用它来规范化命令行,这样实际程序就不必理解 Git 复杂的对象名称语法(您可以使用 git rev-parse 更改或“按摩”命令中的某些参数调用实际程序之前的行)。
  • git rev-parse 的手册页非常难以理解。我很惊讶没有人费心将这些行话改写成人类可读的东西,即使在 5 年后也是如此。
  • @not2qubit Me:“谢谢你的澄清,我感到自卑。” Linus Torvalds:“我重读了一遍,你到底没有理解哪一部分?”

标签: git git-rev-parse


【解决方案1】:

git rev-parse 是一个辅助的plumbing 命令,主要用于操作。

git rev-parse 的一个常见用法是打印给定修订说明符的 SHA1 哈希。此外,它有多种选项来格式化此输出,例如 --short 用于打印更短的唯一 SHA1。

我还使用过其他用例(在脚本和其他基于 git 构建的工具中):

  • --verify 验证指定的对象是一个有效的 git 对象。
  • --git-dir 用于显示.git 目录的绝对/相对路径。
  • 检查您当前是否在使用--is-inside-git-dir 的存储库中或使用--is-inside-work-tree 的工作树中
  • 使用--is-bare-repository 检查repo 是否是裸机
  • 打印分支 (--branches)、标签 (--tags) 的 SHA1 哈希值,还可以基于远程过滤引用(使用 --remote
  • --parse-opt 规范化脚本中的参数(类似于getopt)并打印可与eval 一起使用的输出字符串

Massage 只是暗示可以将信息从一种形式转换为另一种形式,即转换命令。以下是我能想到的一些简单示例:

  • 将分支或标记名称添加到它所指向的提交的 SHA1 中,以便可以将其传递给只接受提交的 SHA1 值的管道命令。
  • git loggit diff 的修订范围A..B 转换为基础管道命令的等效参数B ^A

【讨论】:

    【解决方案2】:

    为了详细说明命令名称 rev-parse 的词源,Git 在管道命令中始终使用术语 rev 作为“修订”的缩写,通常表示提交的 40 个字符的 SHA1 哈希。例如,命令 rev-list 打印一个 40 字符的提交哈希列表,用于分支或其他。

    在这种情况下,名称可能会扩展为parse-a-commitish-to-a-full-SHA1-hash。虽然该命令具有 Tuxdude 的回答中提到的几个辅助功能,但它的同名似乎是将用户友好的引用(如分支名称或缩写哈希)转换为对许多编程/管道最有用的明确 40 个字符的 SHA1 哈希的用例目的。

    我知道在我弄明白之前我一直在想它是“反向解析”的东西,并且在理解“按摩”和“操纵”这两个术语时遇到了同样的麻烦:)

    无论如何,我发现这种“解析到修订”的概念是一种令人满意的思考方式,并且是一种可靠的概念,可以在我需要这种东西时想到这个命令。在编写 Git 脚本时,您经常将用户友好的提交参考作为用户输入,并且通常希望在收到它后尽快将其解析为经过验证且明确的工作参考。否则,输入翻译和验证往往会通过脚本激增。

    【讨论】:

    • 感谢您的解释,我对 git-docs 有一点看不懂:git-scm.com/docs/git-rev-parse
    • 你能给我们举一个你之前提到的messagingmanipulation的例子吗?
    • 换句话说,git rev-parsegit revision-parse 的缩写。它接受给定的输入并返回相应的 40 个字符的修订 ID。
    • git doc 本身就像管道,而这个答案就是瓷器。
    • 哇,原来git rev-parse其实理解起来非常简单。为什么手册页是用这种象形文字写的?
    【解决方案3】:

    git rev-parse 也适用于使用--abbrev-ref 标志获取当前分支名称,例如:

    git rev-parse --abbrev-ref HEAD
    

    【讨论】:

    • 这种方式可以获取提交信息吗?
    • @LeoDroidcoder 试试git log --format=%B -n 1 <revision>
    • 有什么方法可以确保这实际上是一个分支?
    【解决方案4】:

    TLDR:

    它可以帮助您找出当前 HEAD 的提交 ID(即您正在查看的当前提交)

    git rev-parse HEAD
    

    或者如果你想要更短的提交

    git rev-parse --short HEAD
    

    如果你想在另一个分支中找到最新的提交,你可以这样做

    git rev-parse <local-branch-name>
    git rev-parse origin/<remote-branch-name>
    
    

    【讨论】:

      猜你喜欢
      • 2020-11-23
      • 2020-08-16
      • 2018-04-16
      • 2017-02-06
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      • 2016-05-25
      • 2017-11-19
      相关资源
      最近更新 更多