设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
- 2.45.4 → 2.50.1 无更改
-
2.45.3
2024-11-26
- 2.45.1 → 2.45.2 无更改
-
2.45.0
2024-04-29
- 2.44.1 → 2.44.4 无更改
-
2.44.0
2024-02-23
- 2.43.1 → 2.43.7 无更改
-
2.43.0
2023-11-20
- 2.42.1 → 2.42.4 无更改
-
2.42.0
2023-08-21
- 2.41.1 → 2.41.3 无更改
-
2.41.0
2023-06-01
- 2.39.4 → 2.40.4 无变更
-
2.39.3
2023-04-17
- 2.39.1 → 2.39.2 无更改
-
2.39.0
2022-12-12
- 2.37.3 → 2.38.5 无更改
-
2.37.2
2022-08-11
- 2.33.1 → 2.37.1 无变更
-
2.33.0
2021-08-16
- 2.31.1 → 2.32.7 无更改
-
2.31.0
2021-03-15
- 2.30.1 → 2.30.9 无更改
-
2.30.0
2020-12-27
- 2.29.1 → 2.29.3 无更改
-
2.29.0
2020-10-19
- 2.27.1 → 2.28.1 无变更
-
2.27.0
2020-06-01
- 2.25.1 → 2.26.3 无更改
-
2.25.0
2020-01-13
- 2.23.1 → 2.24.4 无更改
-
2.23.0
2019-08-16
- 2.22.1 → 2.22.5 无更改
-
2.22.0
2019-06-07
- 2.19.1 → 2.21.4 无更改
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 无更改
-
2.18.0
2018-06-21
- 2.17.0 → 2.17.6 无更改
-
2.16.6
2019-12-06
-
2.15.4
2019-12-06
- 2.14.6 无更改
-
2.13.7
2018-05-22
-
2.12.5
2017-09-22
-
2.11.4
2017-09-22
-
2.10.5
2017-09-22
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
- 2.6.7 → 2.7.6 无变更
-
2.5.6
2017-05-05
-
2.4.12
2017-05-05
- 2.3.10 无更改
-
2.2.3
2015-09-04
-
2.1.4
2014-12-17
-
2.0.5
2014-12-17
描述
许多 Git 高级命令会混合使用标志(即以破折号 - 开头的参数)和供其内部使用的底层 git rev-list 命令的参数,以及供其在 git rev-list 之后使用的其他命令的标志和参数。此命令的主要目的是允许调用程序区分它们。还有一些其他操作模式与上述“帮助解析命令行选项”无关。
除非另有说明,否则大多数选项和操作模式都要求您在 Git 仓库或受 Git 仓库控制的工作树内运行此命令,否则将导致致命错误。
选项
输出选项
- --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
-S
与 git 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 类似,但它会忽略非引用输入(即分支或标签名称;或更明确地消除歧义的“heads/master”形式,当您想在存在一个不幸命名的标签“master”时命名“master”分支时),并将其显示为完整的引用名称(例如,“refs/heads/master”)。
- --output-object-format=(sha1|sha256|storage)
-
允许从当前仓库支持的任何对象格式输入对象 ID。
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/
中找到的所有引用。 - --branches[=<pattern>]
- --tags[=<pattern>]
- --remotes[=<pattern>]
-
分别显示所有分支、标签或远程跟踪分支(即,分别显示
refs/heads
、refs/tags
或refs/remotes
中找到的引用)。如果提供了
pattern
,则只显示与给定 shell glob 匹配的引用。如果模式不包含通配符(?、*
或 [),则通过附加/*
转换为前缀匹配。 - --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/heads
、refs/tags
或refs/remotes
开头;而在应用于--glob
或--all
时,它们必须以refs/
开头。如果意图使用尾随的 /*,则必须明确给出。 -
不包含会被
git-fetch
、git-receive-pack
或git-upload-pack
隐藏的引用,通过查阅相应的fetch.hideRefs
、receive.hideRefs
或uploadpack.hideRefs
配置以及transfer.hideRefs
(参见 git-config[1])。此选项影响下一个伪引用选项--all
或--glob
,并在处理它们后清除。 - --disambiguate=<prefix>
-
显示名称以给定前缀开头的所有对象。
必须至少为 4 个十六进制数字长,以避免错误地列出仓库中的所有对象。
文件选项
以下选项受 --path-format
修改
- --git-dir
-
如果定义了
$GIT_DIR
,则显示它。否则显示 .git 目录的路径。显示的路径,如果是相对路径,则相对于当前工作目录。如果未定义
$GIT_DIR
并且未检测到当前目录位于 Git 仓库或工作树中,则向标准错误输出打印消息并以非零状态退出。 - --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
-
显示将当前仓库用作其子模块的超级项目工作树(如果存在)的根目录的绝对路径。如果当前仓库未被任何项目用作子模块,则不输出任何内容。
-
在分割索引模式下显示共享索引文件的路径,如果不是分割索引模式则为空。
以下选项不受 --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
-
显示仓库使用的引用存储格式。
指定修订版本
修订参数 <rev> 通常(但不总是)命名一个提交对象。它使用所谓的“扩展 SHA-1”语法。以下是拼写对象名称的各种方式。列表末尾的那些命名提交中包含的树和 blob。
注意
|
本文档显示 Git 所见的“原始”语法。shell 和其他 UI 可能需要额外的引用来保护特殊字符并避免单词拆分。 |
- <sha1>,例如 dae86e1950b1277e545cee180551750029cfe735, dae86e
-
完整的 SHA-1 对象名称(40 字节十六进制字符串),或在仓库中唯一的起始子字符串。例如,dae86e1950b1277e545cee180551750029cfe735 和 dae86e 都命名相同的提交对象,如果您的仓库中没有其他对象的名称以 dae86e 开头。
- <describeOutput>,例如 v1.7.4.2-679-g3bee7fb
-
git
describe
的输出;即,最近的标签,可选地后跟一个破折号和提交数量,然后是一个破折号、一个 g,以及一个缩写的对象名称。 - <refname>,例如 master, heads/master, refs/heads/master
-
一个符号引用名称。例如,master 通常指 refs/heads/master 引用的提交对象。如果您碰巧同时拥有 heads/master 和 tags/master,您可以明确地说 heads/master 来告诉 Git 您指的是哪一个。当存在歧义时,<refname> 会通过以下规则中的第一个匹配项来消除歧义:
-
如果
$GIT_DIR/<refname>
存在,那就是您所指的(这通常仅对HEAD
、FETCH_HEAD
、ORIG_HEAD
、MERGE_HEAD
、REBASE_HEAD
、REVERT_HEAD
、CHERRY_PICK_HEAD
、BISECT_HEAD
和AUTO_MERGE
有用); -
否则,如果
refs/<refname>
存在; -
否则,如果
refs/tags/<refname>
存在; -
否则,如果
refs/heads/<refname>
存在; -
否则,如果
refs/remotes/<refname>
存在; -
否则,如果
refs/remotes/<refname>/HEAD
存在。HEAD
-
命名您在工作树中基于其更改的提交。
FETCH_HEAD
-
记录您上次调用
git
fetch
时从远程仓库抓取的分支。 ORIG_HEAD
-
由大幅移动
HEAD
的命令(git
am
,git
merge
,git
rebase
,git
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
文件。虽然引用名称编码未指定,但首选 UTF-8,因为某些输出处理可能假定引用名称为 UTF-8。 -
- @
-
@ 单独使用是
HEAD
的快捷方式。 - [<refname>]@{<date>},例如 master@{yesterday}, HEAD@{5 minutes ago}
-
一个引用后跟后缀 @,并在大括号中包含日期规范(例如 {yesterday}, {1 month 2 weeks 3 days 1 hour 1 second ago} 或 {1979-02-26 18:30:00}),指定了该引用在过去某个时间点的值。此后缀只能紧跟在引用名称之后使用,且该引用必须存在日志($GIT_DIR/logs/<ref>)。请注意,这会查找您本地引用在给定时间的状态;例如,您本地 master 分支上周的内容。如果您想查看在特定时间段内进行的提交,请参阅
--since
和--until
。 - <refname>@{<n>},例如 master@{1}
-
一个引用后跟后缀 @,并在大括号中包含序数规范(例如 {1}, {15}),指定了该引用的第 n 个先前值。例如 master@{1} 是 master 的紧邻先前值,而 master@{5} 是 master 的第 5 个先前值。此后缀只能紧跟在引用名称之后使用,且该引用必须存在日志($GIT_DIR/logs/<refname>)。
- @{<n>},例如 @{1}
-
您可以使用 @ 结构,不带引用部分,来获取当前分支的 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
已检出时运行git
push
(如果未指定分支名称,则为当前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> 是一个 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:README, master:./README
-
后缀 : 后跟路径,命名冒号前部分命名的 tree-ish 对象中给定路径处的 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
,作用于一组提交,而不仅仅是单个提交。
对于这些命令,使用上一节中描述的符号指定单个修订版本,意味着从给定提交可到达的提交集。
指定多个修订版本意味着从任何给定提交可到达的提交集。
提交的可到达集是提交本身及其祖先链中的提交。
有几种符号用于指定一组连接的提交(称为“修订范围”),如下所示。
点范围符号
在这两种简写符号中,您可以省略一端,使其默认为 HEAD。例如,origin.. 是 origin..HEAD 的简写,表示“我从 origin 分支分叉以来做了什么?”。类似地,..origin 是 HEAD..origin 的简写,表示“我从他们那里分叉以来 origin 做了什么?”。请注意,.. 将意味着 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>,则 <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^@
-
后缀 ^ 后跟一个 @ 符号,与列出 <rev> 的所有父级相同(意思是,包括从其父级可到达的任何内容,但不包括提交本身)。
- <rev>^!,例如 HEAD^!
-
后缀 ^ 后跟一个感叹号,与给定提交 <rev> 及其所有父级前缀 ^ 以排除它们(及其祖先)相同。
- <rev>^-<n>,例如 HEAD^-, HEAD^-2
-
等同于
<rev>^<n>..<rev>
,如果未给出 <n>,则 <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,help
、dry-run
和f
是正确的 <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
选项。
示例
-
打印当前提交的对象名称
$ 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 的提交对象名称。