简体中文 ▾ 主题 ▾ 最新版本 ▾ git-rev-parse 上次更新于 2.52.0

名称

git-rev-parse - 解析和整理参数

概要

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

描述

许多 Git 的“porcelainish”命令接受一组合法的标志(即以破折号 - 开头的参数)和底层 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 模式下有意义。如果可用,则以长格式输出选项,并将其参数粘连在一起。

过滤选项

--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 在成功时会打印到 stdout。

--sq

通常输出是每行一个标志和参数。此选项将输出压缩为单行,并进行适当的引用以供 shell 使用。当您期望参数包含空格和换行符时(例如,在使用 git diff-* 的 pickaxe -S 时)很有用。与 --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 类似,但它会省略不是 ref 的输入(即分支或标签名称;或者更明确地是“heads/master”形式,当您想命名“master”分支但有一个不幸命名的标签“master”时),并将其显示为完整 refname(例如,“refs/heads/master”)。

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

允许从当前存储库支持的任何对象格式输入 oid。

指定“sha1”会进行必要的转换并返回一个 sha1 oid。

指定“sha256”会进行必要的转换并返回一个 sha256 oid。

指定“storage”会进行必要的转换并返回一个以存储哈希算法编码的 oid。

对象选项

--all

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

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

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

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

--glob=<pattern>

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

--exclude=<glob-pattern>

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

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

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

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

--disambiguate=<prefix>

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

文件选项

--local-env-vars

列出存储库本地的 GIT_* 环境变量(例如 GIT_DIR 或 GIT_WORK_TREE,但不是 GIT_EDITOR)。仅列出变量名,不包括其值,即使它们已设置。

--path-format=(absolute|relative)

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

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

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

--git-dir

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

如果未定义 $GIT_DIR 且当前目录未被检测为位于 Git 存储库或工作树中,则向 stderr 打印消息并以非零状态退出。

--git-common-dir

显示 $GIT_COMMON_DIR(如果已定义),否则显示 $GIT_DIR

--resolve-git-dir <path>

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

--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|compat)]

显示用于存储在 .git 目录中的对象格式(哈希算法)、输入、输出或兼容性。对于输入,可以打印多种算法,用空格分隔。如果请求 compat 且未启用兼容性算法,则打印空行。如果未指定,则默认为“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

符号 ref 名称。例如,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

    在 rebase 过程中,记录操作当前停止的提交,可能是因为冲突或交互式 rebase 中的 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 可能配置为建立在远程 R(由 branch.<name>.remote 配置)上的分支 X(由 branch.<name>.merge 配置)之上。B@{u} 指的是来自远程 R 的分支 X 的远程跟踪分支,通常位于 refs/remotes/R/X

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

后缀 @{push} 报告当检查出 branchname 时(如果没有指定 branchname,则为当前的 HEAD)执行 git push 将会推送到哪个分支。与 @{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> 是一个 commit-ish,<rev>^{commit} 就描述了相应的提交对象。类似地,如果 <rev> 是一个 tree-ish,<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

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

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

一个冒号,后跟一个路径,表示冒号之前的tree-ish对象中给定路径下的blob或tree。以./../开头的路径相对于当前工作目录。给定的路径将被转换为相对于工作树的根目录。这在引用来自具有与工作树相同树结构的提交或树的blob或tree时最为有用。

:[<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(根据上面“指定修订版”中解释的语法命名)时,您可以通过^r1 r2来请求从r2可达但排除从r1可达的提交,并且可以写成r1..r2

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

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

在这两种简写表示法中,您可以省略一端,让其默认为HEAD。例如,origin..origin..HEAD的简写,询问“自我们从origin分支分叉以来我做了什么?”类似地,..originHEAD..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内置函数相同的 fasilitas。它作为一个选项规范化器(例如,分割单个开关并聚合值),有点像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参数生成的用法中。它显示在gitcli[7]中记录的--help-all中。

  • 使用!以不提供相应的否定长选项。

<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] 套件的一部分