【问题标题】:Which are the plumbing and porcelain commands?管道和瓷器命令是什么?
【发布时间】:2017-02-12 08:28:11
【问题描述】:

对于 git 命令,“管道”和“瓷器”命令之间存在这种区别。我怎样才能确定什么会被归类为管道或瓷器?即允许我区分的边界线是什么?

我不是在问什么是瓷器或管道命令,而是在给定命令后,我如何才能说出它是哪种类型。

【问题讨论】:

  • @TimBiegeleisen 绝对不是。我知道它们是什么,我问我怎么能说git status是不是瓷器,例如
  • 关于OP所指内容的参考:stackoverflow.com/questions/6976473/…
  • 也许你可以提供一些关于为什么你需要知道这种区别的信息,例如你正在构建一个插件,你有性能问题,等等。
  • @TimBiegeleisen 我想知道的只是为了理论上的目的。

标签: git


【解决方案1】:

作为blue112 noted,分界线很模糊。然而,The very first documentation page 有一个明确的列表(和as R.M. notes below,一个主要标准是,或者至少应该是,接口的稳定性——一些名义上的瓷命令有--porcelain1 sup> 强制输出更稳定和/或更多机器可读的输出)。您可以选择使用他们的列表,或者决定某些命令级别太高而不是低级别,或者级别太低而不是高级。例如,您可能不同意 git apply 是一个管道命令,但 Git 页面说它是。或者,您可能会认为像 git fast-import 这样的东西只能在脚本中使用。

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

下面的列表只是从文档中提取的,其中描述和其他分类被剥离,只留下“瓷器”与“管道”。 (子分类在字母排序顺序中作为倒置仍然可见。我没有为每个条目构建链接,因为使用 StackOverflow markdown 会更加困难——这只需要一个简单的

...
包装器.)

瓷器

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-责备

管道

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 文件 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 notes in this answer to a related question,可以将其视为请求:“我正在实施瓷器,所以请给我管道式输出。”这个论点的缺陷是您可能正在实施复杂的管道,并希望使用简单的管道来完成它:现在看不到瓷器,但是,您的复杂管道将--porcelain 传递给了一些简单的管道。

【讨论】:

  • This answer 和您链接的文档表明瓷器和管道命令之间的主要分界线 - 从 git 维护者的角度来看 - 是接口/输出的稳定性。 Porcelain 命令旨在用于直接的人类交互,并且可能没有稳定的格式输出(也就是说,版本之间的微小格式更改可能会破坏后处理脚本)。管道命令的输出旨在由自动化脚本解析,因此版本之间会更加稳定。
  • @R.M.:好点,我也会在此处将其编辑为答案。
  • 感谢您的列表!为什么 git-rev-parse 被认为是瓷器?
  • @PiQuer:我真的不知道:git rev-parse 非常管道化。上面的列表直接来自截至 2016 年 10 月的文档。从那时起,文档已被修订:它现在有更多的子类别。 git rev-parse 已移至“询问命令”下的“管道”部分。
  • 哎呀,我们可以按字母顺序运行列表吗?这将使读者更容易快速直观地“查询”列表。我必须打破浏览器的文本搜索功能才能找到git-show-ref 所在的列表。:(
【解决方案2】:

我认为命令之间没有直线。

您日常使用的命令是瓷器(想想statusdiffcommit...),使用较少的命令,提供较少格式化的输出(想想diff-indexhash-objectsend-pack)。

您可以使用git help -a 获得完整的 git 命令列表。在这里很容易判断哪个命令更属于瓷器或管道工。

git send-pack的手册可以看到下面一行

通常你会想使用 git push,它是这个命令的更高级别的包装器。

这就是告诉你它更像是一个管道命令。

【讨论】:

  • "我认为命令之间没有直线。"似乎与“在这里很容易分辨哪个命令是哪个命令”相矛盾。
  • 感谢您的修复! :) 但是,老实说,我仍然无法理解您是否认为这件事容易。也许在这个细节层次上的品味问题;)
【解决方案3】:

列出管道命令(以及其他命令,在它们自己的部分)的实际命令是:

git help -av

来自git/git/command-list.txt

这在 Git 2.20(2018 年第四季度)发生了变化,考虑到“git help -a”和“git help -av”提供不同的信息,通常“详细”版本对新用户更友好。

git help -a”现在默认使用更详细的输出(使用“--no-verbose”,你可以回到原来的)。

参见Nguyễn Thái Ngọc Duy (pclouds)commit 26c7d06(2018 年 9 月 29 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit 54e564e,2018 年 10 月 19 日)

help -a:改进并使--verbose默认

当您输入“git help”(或只是“git”)时,您会看到一个包含常用命令及其简短描述的列表,建议您使用“git help -a”或“git help -g”了解更多详情。

git help -av”会更友好并与“git help”显示的内容内联,因为它还显示带有描述的命令列表,并且命令被正确分组。

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)commit 762d5b4(2019 年 10 月 28 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit ecbddd1,2019 年 12 月 1 日)

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

签字人:Philippe Blain
审核人:Jonathan Nieder

指南“gitsubmodules”被添加到d480345(“submodules:大修文档”,2017-06-22,Git v2.14.0-rc0 -- merge列在batch #0),但在commit 1b81d8c(“help:使用command-list.txt作为指南的来源”,2018-05-20,Git v2.18.0-rc1 -- merge)时没有添加到command-list.txt教“git help”从此文件中获取指南列表。

现在添加它,并将gitsubmodules的描述的第一个单词大写,就像1b81d8c中所做的那样(“help:使用command-list.txt作为指南的来源”,2018-05-20, Git v2.18.0-rc1 -- merge) 用于其他指南。

【讨论】:

    【解决方案4】:

    一个想法是访问Git documentation page,看看您要使用的命令是否列在高级命令(porcelain)或低级命令(plumbing)下

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-15
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 2018-02-13
      • 2016-06-18
      • 2012-06-18
      • 1970-01-01
      相关资源
      最近更新 更多