Git
English ▾ 主题 ▾ 最新版本 ▾ git-rev-parse 最后更新于 2.46.0

名称

git-rev-parse - 选择和处理参数

概要

git rev-parse [<options>] <arg>…​

描述

许多 Git 瓷器命令都混合使用了标志(即以连字符-开头的参数)和用于其内部使用的底层git rev-list命令的参数,以及用于其在git rev-list下游使用的其他命令的标志和参数。此命令的主要目的是允许调用程序区分它们。还有一些其他操作模式与上述“帮助解析命令行选项”无关。

除非另有说明,否则大多数选项和操作模式都需要你在 Git 仓库或受 Git 仓库控制的工作树内运行此命令,否则会给出致命错误。

选项

操作模式

这些选项中的每一个都必须在命令行中首先出现。

--parseopt

以选项解析模式使用git rev-parse(参见下面的 PARSEOPT 部分)。此模式下的命令可以在仓库或受仓库控制的工作树之外使用。

--sq-quote

以 shell 引用模式使用git rev-parse(参见下面的 SQ-QUOTE 部分)。与下面的--sq选项相反,此模式只进行引用。对命令输入不做任何其他处理。此模式下的命令可以在仓库或受仓库控制的工作树之外使用。

--parseopt 的选项

--keep-dashdash

仅在--parseopt模式下有意义。指示选项解析器输出遇到的第一个--,而不是跳过它。

--stop-at-non-option

仅在--parseopt模式下有意义。使选项解析器在第一个非选项参数处停止。这可以用于解析本身也带选项的子命令。

--stuck-long

仅在--parseopt模式下有意义。如果可用,则以长格式输出选项,并将它们的 arguments 附加在后面。

用于过滤的选项

--revs-only

不输出不属于git rev-list命令的标志和参数。

--no-revs

不输出属于git rev-list命令的标志和参数。

--flags

不输出非标志参数。

--no-flags

不输出标志参数。

用于输出的选项

--default <arg>

如果用户没有给出参数,则使用<arg>代替。

--prefix <arg>

表现得好像git rev-parse是从工作树的<arg>子目录中调用的。任何相对文件名都将被解析,就好像它们以<arg>为前缀一样,并将以这种形式打印出来。

这可以用来转换在子目录中运行的命令的参数,以便在移动到仓库的顶层后仍然可以使用它们。例如

prefix=$(git rev-parse --show-prefix)
cd "$(git rev-parse --show-toplevel)"
# rev-parse provides the -- needed for 'set'
eval "set $(git rev-parse --sq --prefix "$prefix" -- "$@")"
--verify

验证是否恰好提供了一个参数,以及它是否可以转换为可用于访问对象数据库的原始 20 字节 SHA-1。如果是,则将其输出到标准输出;否则,报错。

如果你想确保输出实际上命名了对象数据库中的一个对象和/或可以作为你需要的特定类型的对象使用,你可以将^{type}剥离运算符添加到参数中。例如,git rev-parse "$VAR^{commit}"将确保$VAR命名了一个存在的对象,它是一个提交式(即提交,或指向提交的带注释的标签)。要确保$VAR命名了任何类型的现有对象,可以使用git rev-parse "$VAR^{object}"

请注意,如果你正在验证来自不受信任来源的名称,最好使用--end-of-options,以避免名称参数被误认为是另一个选项。

-q
--quiet

仅在--verify模式下有意义。如果第一个参数不是有效的对象名称,则不输出错误消息;而是以非零状态静默退出。对于有效的对象名称,SHA-1 将在成功时打印到标准输出。

--sq

通常输出为每个标志和参数一行。此选项使输出成为单行,并进行适当的引用,以便 shell 使用。当你期望你的参数包含空格和换行符时很有用(例如,当使用 pickaxe -Sgit diff-*时)。与--sq-quote选项相反,命令输入仍然按照通常的方式解释。

--short[=<length>]

--verify相同,但将对象名称缩短为至少有length个字符的唯一前缀。最小长度为 4,默认值为core.abbrev配置变量的有效值(参见git-config[1])。

--not

显示对象名称时,在其前面加上^,并从已经带有^前缀的对象名称中去除^前缀。

--abbrev-ref[=(strict|loose)]

对象名称的非歧义短名称。选项 core.warnAmbiguousRefs 用于选择严格缩写模式。

--symbolic

通常对象名称以 SHA-1 形式输出(可能带有^前缀);此选项使它们以尽可能接近原始输入的形式输出。

--symbolic-full-name

这类似于 --symbolic,但它省略了不是 refs 的输入(即分支或标签名称;或者更明确地说是消除歧义的“heads/master”形式,当你想要命名“master”分支时,而碰巧有一个名为“master”的标签),并将它们显示为完整的 refnames(例如“refs/heads/master”)。

--output-object-format=(sha1|sha256|storage)

允许从当前仓库支持的任何对象格式输入 oids。

Specifying "sha1" translates if necessary and returns a sha1 oid.
Specifying "sha256" translates if necessary and returns a sha256 oid.
Specifying "storage" translates if necessary and returns an oid in
encoded in the storage hash algorithm.

用于对象的选项

--all

显示在refs/中找到的所有 refs。

--branches[=<pattern>]
--tags[=<pattern>]
--remotes[=<pattern>]

分别显示所有分支、标签或远程跟踪分支(即分别在refs/headsrefs/tagsrefs/remotes中找到的 refs)。

如果给出了pattern,则只显示与给定 shell glob 匹配的 refs。如果模式不包含通配符(?*[),则通过附加/*将其转换为前缀匹配。

--glob=<pattern>

显示与 shell glob 模式pattern匹配的所有引用。如果模式不以refs/开头,则会自动在前面添加。如果模式不包含通配符(?*[),则通过附加/*将其转换为前缀匹配。

--exclude=<glob-pattern>

不包括与<glob-pattern>匹配的引用,否则下一个--all--branches--tags--remotes--glob会考虑这些引用。此选项的重复会累积排除模式,直到下一个--all--branches--tags--remotes--glob选项(其他选项或参数不会清除累积的模式)。

当分别应用于--branches--tags--remotes时,给定的模式不应以refs/headsrefs/tagsrefs/remotes开头,并且当应用于--glob--all时,它们必须以refs/开头。如果需要尾随/*,则必须明确给出。

--exclude-hidden=(fetch|receive|uploadpack)

不包括git-fetchgit-receive-packgit-upload-pack通过查阅相应的fetch.hideRefsreceive.hideRefsuploadpack.hideRefs配置以及transfer.hideRefs隐藏的引用(请参阅git-config[1])。此选项会影响下一个伪引用选项--all--glob,并在处理完它们后清除。

--disambiguate=<prefix>

显示名称以给定前缀开头的每个对象。<prefix>必须至少为 4 个十六进制数字长,以避免错误地列出存储库中的每个对象。

文件选项

--local-env-vars

列出存储库本地的 GIT_* 环境变量(例如 GIT_DIR 或 GIT_WORK_TREE,但不包括 GIT_EDITOR)。即使设置了变量,也只会列出变量的名称,而不是其值。

--path-format=(absolute|relative)

控制某些其他选项的行为。如果指定为绝对路径,则这些选项打印的路径将为绝对路径和规范路径。如果指定为相对路径,则路径将相对于当前工作目录(如果可能)。默认值是特定于选项的。

此选项可以多次指定,并且仅影响命令行中其后面的参数,直到命令行末尾或此选项的下一个实例。

以下选项受--path-format修改

--git-dir

如果定义了$GIT_DIR,则显示它。否则,显示 .git 目录的路径。显示的路径(如果为相对路径)相对于当前工作目录。

如果未定义$GIT_DIR并且未检测到当前目录位于 Git 存储库或工作树中,则打印一条错误消息到标准错误并以非零状态退出。

--git-common-dir

如果定义了$GIT_COMMON_DIR,则显示它,否则显示$GIT_DIR

--resolve-git-dir <path>

检查<path>是否为有效的存储库或指向有效存储库的 git 文件,并打印存储库的位置。如果<path>是 git 文件,则打印解析后的真实存储库路径。

--git-path <path>

解析“$GIT_DIR/<path>”并考虑其他路径重定位变量,例如 $GIT_OBJECT_DIRECTORY、$GIT_INDEX_FILE 等。例如,如果 $GIT_OBJECT_DIRECTORY 设置为 /foo/bar,则“git rev-parse --git-path objects/abc”返回 /foo/bar/abc。

--show-toplevel

显示工作树顶级目录的(默认为绝对)路径。如果没有工作树,则报告错误。

--show-superproject-working-tree

显示使用当前存储库作为其子模块的超级项目的根工作树的绝对路径(如果存在)。如果当前存储库未被任何项目用作子模块,则不输出任何内容。

--shared-index-path

显示拆分索引模式下共享索引文件的路径,或者在非拆分索引模式下显示为空。

以下选项不受--path-format影响

--absolute-git-dir

类似于--git-dir,但其输出始终是规范化的绝对路径。

--is-inside-git-dir

当当前工作目录位于存储库目录下时,打印“true”,否则打印“false”。

--is-inside-work-tree

当当前工作目录位于存储库的工作树内时,打印“true”,否则打印“false”。

--is-bare-repository

当存储库为空存储库时,打印“true”,否则打印“false”。

--is-shallow-repository

当存储库为浅存储库时,打印“true”,否则打印“false”。

--show-cdup

当从子目录调用命令时,显示顶级目录相对于当前目录的路径(通常是一系列“../”,或空字符串)。

--show-prefix

当从子目录调用命令时,显示当前目录相对于顶级目录的路径。

--show-object-format[=(storage|input|output)]

显示用于存储库的存储在.git目录内部、输入或输出的对象格式(哈希算法)。对于输入,可能会打印多个算法,以空格分隔。如果未指定,则默认为“storage”。

--show-ref-format

显示用于存储库的引用存储格式。

其他选项

--since=<datestring>
--after=<datestring>

解析日期字符串,并输出对应于git rev-list的 --max-age= 参数。

--until=<datestring>
--before=<datestring>

解析日期字符串,并输出对应于git rev-list的 --min-age= 参数。

<arg>…​

要解析的标志和参数。

指定修订版本

修订版本参数<rev>通常(但不一定)命名一个提交对象。它使用所谓的扩展 SHA-1语法。以下是拼写对象名称的各种方法。此列表末尾列出的那些命名提交对象中包含的树和 Blob。

注意
本文档显示了 git 看到的“原始”语法。Shell 和其他 UI 可能需要额外的引用来保护特殊字符并避免单词拆分。
<sha1>,例如 dae86e1950b1277e545cee180551750029cfe735dae86e

完整的 SHA-1 对象名称(40 字节十六进制字符串),或在存储库中唯一的开头子字符串。例如,如果存储库中没有其他对象的名称以 dae86e 开头,则 dae86e1950b1277e545cee180551750029cfe735 和 dae86e 都命名相同的提交对象。

<describeOutput>,例如 v1.7.4.2-679-g3bee7fb

git describe的输出;即最接近的标签,后面可选地跟一个连字符和提交次数,再跟一个连字符、一个g和一个简写对象名称。

<refname>,例如 masterheads/masterrefs/heads/master

一个符号引用名称。例如,master通常表示refs/heads/master引用的提交对象。如果您碰巧同时拥有heads/mastertags/master,则可以明确地说heads/master来告诉 Git 您指的是哪个。当存在歧义时,<refname>会通过以下规则中的第一个匹配项进行消除歧义

  1. 如果$GIT_DIR/<refname>存在,则表示您的意思(这通常仅对HEADFETCH_HEADORIG_HEADMERGE_HEADREBASE_HEADREVERT_HEADCHERRY_PICK_HEADBISECT_HEADAUTO_MERGE有用);

  2. 否则,如果refs/<refname>存在;

  3. 否则,如果refs/tags/<refname>存在;

  4. 否则,如果refs/heads/<refname>存在;

  5. 否则,如果refs/remotes/<refname>存在;

  6. 否则,如果refs/remotes/<refname>/HEAD存在。

    HEAD

    命名您在工作树中更改所依据的提交。

    FETCH_HEAD

    记录您上次git fetch调用从远程存储库获取的分支。

    ORIG_HEAD

    由以剧烈方式移动HEAD的命令(git amgit mergegit rebasegit reset)创建,以记录其操作前HEAD的位置,以便您可以轻松地将分支的顶端更改回运行它们之前的状态。

    MERGE_HEAD

    记录在运行git merge时要合并到分支中的提交。

    REBASE_HEAD

    在变基过程中,记录当前操作停止的提交,可能是由于冲突或交互式变基中的 edit 命令导致的。

    REVERT_HEAD

    在运行 git revert 时,记录您正在回退的提交。

    CHERRY_PICK_HEAD

    在运行 git cherry-pick 时,记录您正在 cherry-pick 的提交。

    BISECT_HEAD

    在运行 git bisect --no-checkout 时,记录当前要测试的提交。

    AUTO_MERGE

    记录一个树对象,该对象对应于当合并操作导致冲突时,ort 合并策略写入工作树的状态。

请注意,以上任何 refs/* 情况都可能来自 $GIT_DIR/refs 目录或 $GIT_DIR/packed-refs 文件。虽然 ref 名称编码未指定,但建议使用 UTF-8,因为某些输出处理可能会假定 ref 名称为 UTF-8。

@

单独的 @HEAD 的快捷方式。

[<refname>]@{<date>},例如 master@{yesterday}HEAD@{5 minutes ago}

ref 后跟后缀 @ 和用花括号括起来的时间规范(例如 {yesterday}{1 month 2 weeks 3 days 1 hour 1 second ago}{1979-02-26 18:30:00})指定先前某个时间点的 ref 值。此后缀只能紧跟在 ref 名称之后,并且 ref 必须具有现有日志($GIT_DIR/logs/<ref>)。请注意,这会查找本地 ref 在给定时间的状态;例如,上周您本地 master 分支中的内容是什么。如果要查看在特定时间内进行的提交,请参阅 --since--until

<refname>@{<n>},例如 master@{1}

ref 后跟后缀 @ 和用花括号括起来的序数规范(例如 {1}{15})指定该 ref 的第 n 个先前值。例如,master@{1}master 的直接先前值,而 master@{5}master 的第 5 个先前值。此后缀只能紧跟在 ref 名称之后,并且 ref 必须具有现有日志($GIT_DIR/logs/<refname>)。

@{<n>},例如 @{1}

您可以将 @ 结构与空 ref 部分一起使用以获取当前分支的 reflog 条目。例如,如果您在 blabla 分支上,则 @{1} 的含义与 blabla@{1} 相同。

@{-<n>},例如 @{-1}

结构 @{-<n>} 表示在当前分支之前检出的第 <n> 个分支/提交。

[<branchname>]@{upstream},例如 master@{upstream}@{u}

分支 B 可以设置为构建在分支 X 之上(使用 branch.<name>.merge 配置)并在远程 R(使用 branch.<name>.remote 配置)上。B@{u} 指的是从远程 R 获取的分支 X 的远程跟踪分支,通常位于 refs/remotes/R/X

[<branchname>]@{push},例如 master@{push}@{push}

后缀 @{push} 报告分支“如果运行 git push 时检出 branchname,我们将推送到哪个分支”(如果未指定分支名称,则为当前 HEAD)。与 @{upstream} 类似,我们报告与远程分支对应的远程跟踪分支。

以下是一个示例,以便更清楚地说明这一点

$ git config push.default current
$ git config remote.pushdefault myfork
$ git switch -c mybranch origin/master

$ git rev-parse --symbolic-full-name @{upstream}
refs/remotes/origin/master

$ git rev-parse --symbolic-full-name @{push}
refs/remotes/myfork/mybranch

请注意,在示例中,我们设置了一个三角形工作流程,从中一个位置拉取并在另一个位置推送。在非三角形工作流程中,@{push}@{upstream} 相同,因此不需要它。

此后缀也接受大写形式,并且无论大小写如何,含义都相同。

<rev>^[<n>],例如 HEAD^, v1.5.1^0

修饰符 ^ 后缀用于修饰版本参数,表示该提交对象的第一个父提交。^<n> 表示第 <n> 个父提交(即 <rev>^ 等效于 <rev>^1)。作为特殊规则,<rev>^0 表示提交本身,并在 <rev> 是引用提交对象的标签对象的名称时使用。

<rev>~[<n>],例如 HEAD~, master~3

修饰符 ~ 后缀用于修饰版本参数,表示该提交对象的第一个父提交。修饰符 ~<n> 后缀用于修饰版本参数,表示该命名提交对象的第 <n> 代祖先提交,仅沿着第一个父提交进行。即 <rev>~3 等效于 <rev>^^^,等效于 <rev>^1^1^1。请参见下文了解此形式的用法示例。

<rev>^{<type>},例如 v0.99.8^{commit}

修饰符 ^ 后跟用花括号括起来的对象类型名称,表示递归地取消对 <rev> 处对象的引用,直到找到类型为 <type> 的对象或无法再取消对对象的引用(在这种情况下,报错)。例如,如果 <rev> 是提交式,则 <rev>^{commit} 描述相应的提交对象。类似地,如果 <rev> 是树式,则 <rev>^{tree} 描述相应的树对象。<rev>^0<rev>^{commit} 的简写。

<rev>^{object} 可用于确保 <rev> 命名一个存在的对象,而无需 <rev> 是标签,也不需要取消对 <rev> 的引用;因为标签本身就是一个对象,所以即使取消引用一次也不必取消引用以获取对象。

<rev>^{tag} 可用于确保 <rev> 标识现有的标签对象。

<rev>^{},例如 v0.99.8^{}

修饰符 ^ 后跟空花括号表示该对象可能是标签,并且递归地取消对标签的引用,直到找到非标签对象。

<rev>^{/<text>},例如 HEAD^{/fix nasty bug}

修饰符 ^ 后缀用于修饰版本参数,后跟包含以斜杠开头的文本的花括号,与下面的 :/fix nasty bug 语法相同,只是它返回从 <rev> 之前 ^ 可达的最年轻的匹配提交。

:/<text>,例如 :/fix nasty bug

冒号后跟斜杠,再跟文本,命名一个其提交消息与指定正则表达式匹配的提交。此名称返回从任何 ref(包括 HEAD)可达的最年轻的匹配提交。正则表达式可以匹配提交消息的任何部分。要匹配以字符串开头的消息,可以使用例如 :/^foo。特殊序列 :/! 保留用于修改匹配的内容。:/!-foo 执行否定匹配,而 :/!!foo 匹配文字 ! 字符,后跟 foo。任何其他以 :/! 开头的序列目前都保留。根据给定的文本,shell 的单词拆分规则可能需要额外的引用。

<rev>:<path>,例如 HEAD:READMEmaster:./README

修饰符 : 后跟路径,命名在冒号之前部分命名的树式对象中给定路径处的 blob 或树。以 ./../ 开头的路径相对于当前工作目录。给定的路径将转换为相对于工作树根目录的相对路径。这对于从与工作树具有相同树结构的提交或树中寻址 blob 或树最有用。

:[<n>:]<path>,例如 :0:README:README

冒号后跟可选的阶段号(0 到 3)和冒号,再跟路径,命名索引中给定路径处的 blob 对象。缺少阶段号(以及跟随它的冒号)表示阶段 0 条目。在合并期间,阶段 1 是公共祖先,阶段 2 是目标分支的版本(通常是当前分支),阶段 3 是正在合并的分支的版本。

以下是 Jon Loeliger 的一个图示。提交节点 B 和 C 都是提交节点 A 的父提交。父提交从左到右排序。

G   H   I   J
 \ /     \ /
  D   E   F
   \  |  / \
    \ | /   |
     \|/    |
      B     C
       \   /
        \ /
         A
A =      = A^0
B = A^   = A^1     = A~1
C =      = A^2
D = A^^  = A^1^1   = A~2
E = B^2  = A^^2
F = B^3  = A^^3
G = A^^^ = A^1^1^1 = A~3
H = D^2  = B^^2    = A^^^2  = A~2^2
I = F^   = B^3^    = A^^3^
J = F^2  = B^3^2   = A^^3^2

指定范围

诸如 git log 之类的历史遍历命令操作的是一组提交,而不仅仅是一个提交。

对于这些命令,指定单个修订版(使用上一节中描述的表示法)表示从给定提交“可达”的提交集。

指定多个修订版表示从任何给定提交可达的提交集。

提交的可达集是提交本身及其祖先链中的提交。

有几种表示法可以指定一组连接的提交(称为“修订版范围”),如下所示。

提交排除

^<rev>(脱字符号)表示法

要排除从提交可达的提交,使用前缀 ^ 表示法。例如,^r1 r2 表示从 r2 可达的提交,但排除从 r1 可达的提交(即 r1 及其祖先)。

点范围表示法

..(双点)范围表示法

^r1 r2 集运算出现的频率很高,因此有一个简写形式。当您有两个提交 r1r2(根据“指定修订版”中说明的语法命名)时,您可以请求从 r2 可达的提交,排除从 r1 可达的提交,方法是 ^r1 r2,它可以写成 r1..r2

...(三点)对称差分表示法

类似的符号r1...r2称为r1r2的对称差,定义为r1 r2 --not $(git merge-base --all r1 r2)。它是指可从r1(左侧)或r2(右侧)中的一个到达,但不能同时从两者到达的提交集。

在这两种简写符号中,您可以省略一端并将其默认为HEAD。例如,origin..origin..HEAD的简写,询问“自从我从origin分支分叉以来我做了什么?”。类似地,..originHEAD..origin的简写,询问“自从我从他们那里分叉以来,origin做了什么?”。请注意,..将表示HEAD..HEAD,这是一个既可从HEAD到达又不可从HEAD到达的空范围。

确实存在专门设计用于获取两个不同范围的命令(例如,“git range-diff R1 R2”用于比较两个范围),但它们是例外情况。除非另有说明,否则所有对提交集进行操作的“git”命令都作用于单个修订范围。换句话说,将两个“两点范围符号”并排写,例如

$ git log A..B C..D

并**不**为大多数命令指定两个修订范围。相反,它将命名一个连接的提交集,即那些可从B或D到达但既不可从A到达也不可从C到达的提交。在线性历史记录中,例如

---A---B---o---o---C---D

因为A和B可从C到达,所以这两个点范围指定的修订范围是单个提交D。

其他<rev>^父级简写符号

还存在其他三种简写符号,对于合并提交特别有用,用于命名由一个提交及其父提交形成的集合。

r1^@符号表示r1的所有父提交。

r1^!符号包括提交r1,但排除其所有父提交。就其本身而言,此符号表示单个提交r1

<rev>^-[<n>]符号包括<rev>,但排除第<n>个父提交(即<rev>^<n>..<rev>的简写),如果未给出则<n> = 1。这通常对合并提交很有用,您只需传递<commit>^-即可获取合并提交<commit>中合并的分支中的所有提交(包括<commit>本身)。

虽然<rev>^<n>是关于指定单个提交父提交的,但这三种符号也考虑了其父提交。例如,您可以说HEAD^2^@,但是您不能说HEAD^@^2

修订范围摘要

<rev>

包含可从<rev>到达的提交(即<rev>及其祖先)。

^<rev>

排除可从<rev>到达的提交(即<rev>及其祖先)。

<rev1>..<rev2>

包含可从<rev2>到达的提交,但排除可从<rev1>到达的提交。当<rev1>或<rev2>被省略时,默认为HEAD

<rev1>...<rev2>

包含可从<rev1>或<rev2>到达的提交,但排除可从两者都到达的提交。当<rev1>或<rev2>被省略时,默认为HEAD

<rev>^@,例如HEAD^@

后缀^后跟一个at符号与列出<rev>的所有父提交相同(这意味着,包括可从其父提交到达的任何内容,但不包括提交本身)。

<rev>^!,例如HEAD^!

后缀^后跟一个感叹号与给出提交<rev>及其所有父提交并以^为前缀以排除它们(及其祖先)相同。

<rev>^-<n>,例如HEAD^-, HEAD^-2

等效于<rev>^<n>..<rev>,如果未给出则<n> = 1。

以下是一些使用Loeliger插图的示例,其中每个步骤的符号扩展和选择都仔细地阐述了

   Args   Expanded arguments    Selected commits
   D                            G H D
   D F                          G H I J D F
   ^G D                         H D
   ^D B                         E I J F B
   ^D B C                       E I J F B C
   C                            I J F C
   B..C   = ^B C                C
   B...C  = B ^F C              G H D E B C
   B^-    = B^..B
	  = ^B^1 B              E I J F B
   C^@    = C^1
	  = F                   I J F
   B^@    = B^1 B^2 B^3
	  = D E F               D G H E F I J
   C^!    = C ^C^@
	  = C ^C^1
	  = C ^F                C
   B^!    = B ^B^@
	  = B ^B^1 ^B^2 ^B^3
	  = B ^D ^E ^F          B
   F^! D  = F ^I ^J D           G H D F

PARSEOPT

--parseopt模式下,git rev-parse有助于整理选项,为shell脚本提供与C内置函数相同的工具。它充当选项规范化器(例如,拆分单个开关聚合值),有点像getopt(1)的作用。

它在标准输入上获取要解析和理解的选项规范,并在标准输出上回显一个适合sh(1) eval的字符串,以用规范化的字符串替换参数。如果发生错误,它将在标准错误流上输出用法,并以代码129退出。

注意:将其传递给eval时,请确保引用结果。请参见下面的示例。

输入格式

git rev-parse --parseopt输入格式完全基于文本。它有两个部分,由仅包含--的行分隔。分隔符之前的行(应为一行或多行)用于用法。分隔符之后的行描述了选项。

每行选项都具有以下格式

<opt-spec><flags>*<arg-hint>? SP+ help LF
<opt-spec>

其格式为短选项字符,然后是长选项名称,用逗号分隔。这两个部分都不是必需的,但至少需要一个。可能不包含任何<flags>字符。h,helpdry-runf是正确的<opt-spec>的示例。

<flags>

<flags>*=?!

  • 如果选项需要参数,请使用=

  • 使用?表示选项需要可选参数。您可能希望使用--stuck-long模式来能够明确地解析可选参数。

  • 使用*表示此选项不应在为-h参数生成的用法中列出。它显示在--help-all中,如gitcli[7]中所述。

  • 使用!表示不使相应的否定长选项可用。

<arg-hint>

<arg-hint>如果指定,则用作帮助输出中参数的名称,用于需要参数的选项。<arg-hint>以第一个空格结束。习惯上使用连字符分隔多字参数提示中的单词。

删除空格后,该行的其余部分用作与该选项关联的帮助信息。

空行将被忽略,不符合此规范的行将用作选项组标题(有意创建此类行,请在行首添加空格)。

示例

OPTS_SPEC="\
some-command [<options>] <args>...

some-command does foo and bar!
--
h,help!   show the help

foo       some nifty option --foo
bar=      some cool option --bar with an argument
baz=arg   another cool option --baz with a named argument
qux?path  qux may take a path argument but has meaning by itself

  An option group Header
C?        option C with an optional argument"

eval "$(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)"

用法文本

当上述示例中的"$@"-h--help时,将显示以下用法文本

usage: some-command [<options>] <args>...

    some-command does foo and bar!

    -h, --help            show the help
    --[no-]foo            some nifty option --foo
    --[no-]bar ...        some cool option --bar with an argument
    --[no-]baz <arg>      another cool option --baz with a named argument
    --[no-]qux[=<path>]   qux may take a path argument but has meaning by itself

An option group Header
    -C[...]               option C with an optional argument

SQ-QUOTE

--sq-quote模式下,git rev-parse在标准输出上回显一行适合sh(1) eval的字符串。此行是通过规范化--sq-quote后的参数创建的。除了引用参数之外,不会执行其他操作。

如果希望命令输入在输出被shell引用之前仍按git rev-parse的通常方式解释,请参见--sq选项。

示例

$ cat >your-git-script.sh <<\EOF
#!/bin/sh
args=$(git rev-parse --sq-quote "$@")   # quote user-supplied arguments
command="git frotz -n24 $args"          # and use it inside a handcrafted
					# command line
eval "$command"
EOF

$ sh your-git-script.sh "a b'c"

示例

  • 打印当前提交的对象名称

    $ git rev-parse --verify HEAD
  • 打印来自$REV shell变量中修订版本的提交对象名称

    $ git rev-parse --verify --end-of-options $REV^{commit}

    如果$REV为空或不是有效的修订版本,这将导致错误。

  • 与上面类似

    $ git rev-parse --default master --verify --end-of-options $REV

    但是,如果$REV为空,则将打印来自master的提交对象名称。

GIT

git[1]套件的一部分

scroll-to-top