哪些是与水管和瓷器相关的命令?

59

对于git命令,有“plumbing”和“porcelain”命令之分。我该如何确定哪些命令属于“plumbing”,哪些属于“porcelain”?也就是说,怎么区分它们的界限在哪里?

我的问题不是什么是“porcelain”或“plumbing”命令,而是当给出一个命令时,我如何确定它属于哪种类型。


@TimBiegeleisen 绝对不是。我知道它们是什么,我想知道如何判断 git status 是否为瓷砖命令。 - zer0uno
4
关于 OP 所指的参考链接:https://dev59.com/r2w05IYBdhLWcg3w3lkl - Tim Biegeleisen
1
也许你可以包含一些关于为什么需要了解这个区别的信息,例如你正在构建一个插件,你有性能方面的顾虑等等。 - Tim Biegeleisen
@TimBiegeleisen 我只是出于理论目的想了解。 - zer0uno
4个回答

60

正如blue112所指出的,划分线是模糊的。然而,第一个文档页面有一个明确的列表(并且正如R.M.在下面指出的那样,一个主要标准是稳定的接口,为此一些名义上的瓷器命令有--porcelain1来强制更稳定和/或更机器可读的输出)。你可以选择使用他们的列表,也可以决定有些命令过于高级而不适合作为低级,或者太低级而不适合作为高级。例如,你可能不同意git apply是一个管道命令,但Git页面说它是。或者,你可能认为像git fast-import这样的东西只能在脚本内使用。

编辑,2020年5月31日:自2016年以来,Git文档已更改以将命令重新分配到新部分;下面的数据现在已经过时。请查阅您自己的Git版本文档(例如通过git help git)以查看您自己的系统所说的内容。另请参见VonC's answer,其中包含对文档的2018年更改的链接。

以下列表仅从文档中提取,去除了描述和附加分类,只留下“porcelain”与“plumbing”。 (子分类保留为字母排序顺序的反转形式。我没有为每个条目构建链接,因为在StackOverflow markdown中这将会更加困难 - 这只需要一个简单的<pre>...</pre>包装器即可。)

porcelain

git-add git-rebase git-cherry git-am git-reset git-count-objects git-archive git-revert git-difftool git-bisect git-rm git-fsck git-branch git-shortlog git-get-tar-commit-id git-bundle git-show git-help git-checkout git-stash git-instaweb git-cherry-pick git-status git-merge-tree git-citool git-submodule git-rerere git-clean git-tag git-rev-parse git-clone git-worktree git-show-branch git-commit gitk git-verify-commit git-describe git-config git-verify-tag git-diff git-fast-export git-whatchanged git-fetch git-fast-import gitweb git-format-patch git-filter-branch git-archimport git-gc git-mergetool git-cvsexportcommit git-grep git-pack-refs git-cvsimport git-gui git-prune git-cvsserver git-init git-reflog git-imap-send git-log git-relink git-p4 git-merge git-remote git-quiltimport git-mv git-repack git-request-pull git-notes git-replace git-send-email git-pull git-annotate git-svn git-push git-blame

水暖工程

git-apply git-for-each-ref git-receive-pack git-checkout-index git-ls-files git-shell git-commit-tree git-ls-remote git-upload-archive git-hash-object git-ls-tree git-upload-pack git-index-pack git-merge-base git-check-attr git-merge-file git-name-rev git-check-ignore git-merge-index git-pack-redundant git-check-mailmap git-mktag git-rev-list git-check-ref-format git-mktree git-show-index git-column git-pack-objects git-show-ref git-credential git-prune-packed git-unpack-file git-credential-cache git-read-tree git-var git-credential-store git-symbolic-ref git-verify-pack git-fmt-merge-msg git-unpack-objects git-daemon git-interpret-trailers git-update-index git-fetch-pack git-mailinfo git-update-ref git-http-backend git-mailsplit git-write-tree git-send-pack git-merge-one-file git-cat-file git-update-server-info git-patch-id git-diff-files git-http-fetch git-sh-i18n git-diff-index git-http-push git-sh-setup git-diff-tree git-parse-remote git-stripspace

1更合理的称呼似乎应该是--plumbing,但是正如 VonC在回答相关问题时所指出的那样,你可以将其视为一个请求:“我正在实现瓷器,请给我提供管道风格的输出。” 这个论点的缺陷在于,你可能正在实现复杂的管道系统,并希望使用简单的管道来完成它:现在看不到任何瓷器,但是你的复杂的管道却向一些简单的管道传递了--porcelain


3
根据你提供的答案和链接文档,从Git维护者的角度来看,瓷器命令和管道命令的主要区别在于接口/输出的稳定性。瓷器命令旨在直接与人类进行交互,并且可能没有稳定格式的输出(也就是说,在不同版本之间的次要格式更改可能会破坏后处理脚本)。管道命令的输出旨在由自动化脚本解析,因此在版本之间会更加稳定。 - R.M.
1
@R.M.:好观点,我也会将其编辑到答案中。 - torek
1
谢谢提供列表!为什么git-rev-parse被认为是瓷器? - PiQuer
1
@PiQuer:我不是很清楚:git rev-parse非常像管道。上面的列表直接来自2016年10月的文档。此后,文档已进行了修订:现在有更多的子类别。git rev-parse已移至“询问命令”下的“管道”部分。 - torek
哎呀,我们能否对列表进行字母排序?这样读者就可以更快速地通过视觉“查询”列表了。我不得不使用浏览器的文本搜索功能才找到git-show-ref在哪个列表中。:( - mtraceur
显示剩余2条评论

6
实际的命令列表包括管道命令(和其他命令,分别在它们自己的部分中):
git help -av

这段内容来自于git/git/command-list.txt
随着Git 2.20(2018年第四季度)的更新,"git help -a"和"git help -av"提供不同的信息,通常“详细”版本更适合新用户。现在默认情况下,"git help -a"使用更详细的输出(使用"--no-verbose"可以返回原始信息)。
有关详细信息,请参见提交 26c7d06(由Nguyễn Thái Ngọc Duy (pclouds)于2018年9月29日提交)。
(由Junio C Hamano -- gitster --于2018年10月19日合并) 当您键入“git help”(或只是“git”)时,会显示一组常用命令及其简短描述,并建议您使用“git help -a”或“git help -g”获取更多详细信息。"git help -av"将更友好地显示命令列表及其描述,并适当分组。但是,"help -av"并不会显示"help -a"中的所有内容。
为此,在“help -av”中添加外部命令部分。同时,还要添加别名部分(直到现在,别名没有UI,只有“git config”)。
现在,一个简单的git help -a(使用Git 2.20+)将返回:
vonc@VONC D:\git\git
> git help -a
Main Porcelain Commands
   add                  Add file contents to the index
   am                   Apply a series of patches from a mailbox
   archive              Create an archive of files from a named tree
   bisect               Use binary search to find the commit that introduced a bug
...

在Git 2.25(2020年第一季度)中,命令列表更加完整。
请参见由Philippe Blain(phil-blain)于2019年10月28日提交的“commit 762d5b4”(https://github.com/git/git/commit/762d5b4f46c98406e94e863133d64d2a1090ca4a)。 (在2019年12月1日提交的“commit ecbddd1”中,由Junio C Hamano(gitster)合并。)

help:将gitsubmodules添加到指南列表中

Signed-off-by: Philippe Blain
Reviewed-by: Jonathan Nieder

d480345(“submodules: overhaul documentation”,2017-06-22,Git v2.14.0-rc0 - 在batch #0中列出的合并),添加了“gitsubmodules”指南,但是在提交1b81d8c(“help: use command-list.txt for the source of guides”,2018-05-20,Git v2.18.0-rc1 - 在合并),教授“git help”从这个文件中获取指南列表时,并没有将其添加到command-list.txt中。

现在添加它,并像其他指南一样,将gitsubmodules的描述的第一个单词大写,就像在1b81d8c(“help: use command-list.txt for the source of guides”,2018-05-20,Git v2.18.0-rc1 - 在合并)中所做的那样。


使用Git 2.36(2022年第二季度)

  • git help -a --no-external-commands 不会列出在 PATH 中找到的 git-xxx 可执行文件。
  • git help -a --no-aliases 不会列出任何定义为别名的 git xxx

6

我认为命令之间并没有直接的联系。

从日常使用的命令,比如status, diff, commit等都是瓷器级别的命令。较少使用且输出格式不太友好的命令则属于管道级别,例如diff-index, hash-objectsend-pack

你可以使用git help -a来获取完整的git命令列表。在这里很容易区分哪些命令属于瓷器级别,哪些属于管道级别。

通过查看git send-pack的手册,你会看到以下内容:

通常情况下,你应该使用更高级别的git push命令而不是直接使用本命令。

这就是告诉你它是一个管道级别的命令。


4
“我认为命令之间不存在直接的联系。” 这个观点似乎与 “在这里很容易区分哪个是哪个命令” 相矛盾。 - BartoszKP
谢谢你的修复!:) 不过,说实话,我仍然不明白你是否认为这个问题容易解决。也许这只是在细节层面上的品味问题 ;) - BartoszKP

3

一个想法是访问Git文档页面,看看你想要使用的命令是否在高级命令(porcelain)或低级命令(plumbing)列表中列出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接