Git中的术语“porcelain”是什么意思?

609
“瓷器”这个词在Git的文档中偶尔会出现。它是什么意思?
9个回答

698

"瓷器"是通常用于制作厕所 (有时也包括洗脸盆等设施) 的材料。这与 "管道"(实际的管道和排水)不同,其中瓷器为用户提供了更友好的接口来使用管道。

Git使用这个类比术语,将用户通常不需要直接使用的低级命令(“管道”)与更用户友好的高级命令(“瓷器”)分开。


62
我认为这个答案对我来说很有道理,但再说一遍,我假设是Linus创造了这个术语,所以当我阅读他的世界时,我倾向于调整我的大脑更加直接和简洁。 :) - Nick Klauer
83
让人不禁想象Linus是否在想象他的管道将被用来输送哪些可能的粪便流。为开源代码提供管道工作虽然脏,但总得有人去做。 - Evan Plaice
50
有些人认为,实际的 git porcelain 更像是放在管道上的一层涂料。 - hemflit
5
这个答案如果能够提供哪些命令是“plumbing”(管道)命令、哪些是“porcelain”(瓷器)命令的例子会更有用。 - demongolem
10
我有所遗漏,还是这个比喻和实现完全相反了?如果将“管道”视为低级/机器的,“瓷器”视为高级/人类友好的(就像在浴室装置中一样),那么为什么添加“ -- 瓷器”选项(比如到git status)会去除人类可读的冗长性并使结果更加机器可读呢? - jez
显示剩余6条评论

559
更重要的是,“瓷器”一词适用于高级命令,其输出为:
  • 旨在供人阅读
  • 不适合解析
  • 容易发生变化/演变
这是关键:如果您编写脚本,则应尽可能使用管道命令,其输出稳定。不要使用瓷器命令。
但是,您可以在脚本中使用具有--porcelain选项的瓷器命令的输出(请参见下文),例如:
git status --porcelain
git push --porcelain
git blame --porcelain

虽然 Git 包括其自己的外壳层,但其低级命令足以支持替代外壳层的开发。
与外壳层命令相比,这些低级命令的接口(输入、输出、选项集和语义)更加稳定,因为这些命令主要用于脚本使用。
另一方面,外壳层命令的接口可能会改变,以改善最终用户体验。
请参见“如何以编程方式确定是否存在未提交的更改?”作为使用管道命令而不是外壳命令的示例。
注意:Porcelain 命令可以有 --porcelain 选项。
例如:git status --porcelain,这表示一个旨在被解析的输出。
--porcelain

为脚本提供易于解析的输出格式。这类似于短输出,但将在git版本和用户配置不稳定的情况下保持稳定。有关详细信息,请参见下文。
上面提到的主题详细说明了:
这在某种程度上是我的错。 “short-status”形式确实是为人眼设计的,并由Junio设计。 有些人也想要可脚本化的状态输出,因此我在相同的格式上添加了“--porcelain”,关闭了可配置的功能,如相对路径名和颜色设置,并做出了一个隐含的承诺,即我们不会对格式进行进一步的更改。 这样做的目的是防止人们围绕“--short”进行脚本编写,因为它从未被设计为稳定的。 因此,虽然“--porcelain”本身是稳定且可脚本化的,但它可能不太友好于解析器。而“-z --porcelain”格式则更加友好,我建议任何人在“git status”周围进行脚本编写时使用它。
这反映了git用户在他们的脚本中使用瓷器命令的需求!但只有通过稳定的输出(使用“--porcelain”)才能实现。

正如威廉·伯格所评论的那样,git push也是如此!

--porcelain

产生机器可读的输出。 每个引用的输出状态行将以制表符分隔并发送到stdout而不是stderr。 将提供引用的完整符号名称。

正如约翰·格拉斯迈尔评论中提出的:

也许--porcelain在这里的意思是“生成适合于使用porcelain脚本的输出”

这可以得到第一个支持"--porcelain选项"的案例的支持
(在git status --porcelain,提交6f15787,2009年9月,git 1.7.0之前,
git push --porcelain,提交1965ff7,2009年6月,git 1.6.4之前):

git blame --porcelain:

-p
--porcelain

展示为机器消费设计的格式。 提交 b5c698d,2006年10月,git 1.4.4 新选项使命令的本机输出格式发出更易于Porcelain处理的输出。

3
我注意到 git push 有一个类似异常的机器可读选项 --porcelain - william.berg
24
这里 --porcelain 的含义可能是“产生适合于机器处理的输出结果”。 - John Glassmyer
22
所以,“--porcelain”是一个选项,使输出不是“porcelain”吗?(注:这句话可能有歧义,原文中的含义并不清晰,需要根据上下文进行理解。) - Patrick Sanan
3
在某种程度上是的。使用该选项可以可靠地解析它们的输出。 - VonC
6
所以当你添加 --porcelain 时,它就像管道一样运行。感谢 Git! - Dercsár
显示剩余2条评论

73

在Git中使用和铸造“瓷器”这个词实际上是由Mike Taht完成的,而当时他正在与Linus Torvalds激烈争论。

https://web.archive.org/web/20190427113112/http://www.gelato.unsw.edu.au/archives/git/0504/0881.html

实际上,我的一个希望是其他 SCM 可以直接使用 git 的基础设施。但我真正建议你使用“git”本身,而不是任何“libgit”。也就是说,你将所有基础设施作为真正的程序,并且不是试图链接到单独的例程,而是写成脚本。
如果你不想要它,我就不会做。尽管如此,从根本上区分基础设施和主程序仍然有意义。

11
有趣。+1。我上面的回答是基于使用产品,但你提供的链接提到了似乎是该术语的起源。 - VonC

32

简单解释

  • "瓷器" 命令:不适用于脚本编写,因为:它们可能会改变;它们是为人类设计的,而不是机器。为了帮助你记住,想象一下你浴室里的瓷器水龙头 - 你可以轻松地用不同颜色的水龙头替换它们。 瓷器 == 易于更换
  • "管道" 命令:可以用于脚本编写,因为:它们更稳定/不太可能改变。管道指的是你浴室里的管道 - 管道是永久的,它们不能很容易地改变!

是的,但是混淆的 --瓷器 选项怎么办!?

如果你想要:

  1. 使用一个瓷器命令(为人类设计,而不是解析)并且
  2. 可靠地解析它

....那么你可以添加 --瓷器 选项并将输出用于脚本编写。

例子:我可以使用git status --porcelain并将输出用于脚本编写,没有问题。

(批评很容易,尤其是如果没有提供替代方案 - 对git的创建者表示最高的尊重。)

瓷器/管道术语的起源是什么?

  • 如果英语不是你的母语,那么Greg Hewgill解释得非常好。
  • 要了解更多细节,请查看VonC的回答。

2
那个令人困惑的—porcelain选项怎么办?我在我的答案中回答了这个问题:https://dev59.com/r2w05IYBdhLWcg3w3lkl#6978402 - VonC
1
同意!我已经在上面添加了一个链接,指向你的答案:要了解更多细节,请查看VonC的答案。 - BenKoshy
3
好的,至少对于已经是“瓷器”命令的选项,使用名为--porcelain的选项来实现“伪管道”功能与Git的通用UI设计非常搭配... ;) - Sz.
15
我不明白为什么这个选项被称为“porcelain”。整个命令已经是“porcelain”了。该选项应该被称为 --plumbing(因为这次你是一个管道工,而不是普通的“porcelain”用户)。 - seeker_of_bacon
2
感谢您的回答,@BKSpurgeon。VonC的回答可能更详细,但我需要您确认“--porcelain”选项很令人困惑,以便正确理解。 - mwfearnley

29

瓷器是基于核心Git的程序和程序套件的可爱名称,提供对核心Git的高级访问。瓷器比"plumbing"更多地暴露了SCM接口。

--Porcelain, Git Wiki


7

在 Git 中有两个明显的“瓷器”意义。

虽然可以争论这两个意义并非严格相反,但它们可能看起来是互相矛盾的。

A. 概念性(管道 vs 瓷器)

正式的Pro Git book:

但是由于 Git 最初是版本控制系统的工具包而不是完整的用户友好型 VCS,因此它有许多子命令可执行低级别工作,并设计为以 UNIX 风格链接在一起或从脚本中调用。这些命令通常称为 Git 的“管道”命令,而更易用的命令称为“瓷器”命令。

B. --porcelain / =porcelain 选项

许多 Git 命令都配备了一个--porcelain选项,该选项用于脚本编写。

git status' 文档:

--porcelain[=<version>]

以易于脚本解析的格式输出内容。这与短格式输出类似,但将在所有Git版本和用户配置下保持稳定。有关详细信息,请参见下文。

git diff 文档

--word-diff[=<mode>]

porcelain

使用一个特殊的基于行的格式,旨在供脚本使用。


6

瓷器命令旨在供人类使用,而不是计算机易于解析的命令的输出。例如git status


10
"瓷器"......"供人类食用"......我可以吃玻璃。(开玩笑/注意混淆隐喻,以免让容易困惑的人感到困惑) - ajm475du
9
瓷器指令是为人类使用而设计的,但当你使用--porcelain选项时,它则是为机器消费而设计的。 - ThomasW
git status --porcelain: 以易于脚本解析的格式输出结果。(...) 但它将在 Git 版本之间保持稳定,并且不受用户配置的影响。 - tymtam
1
感谢您的投票。是的,git status --porcelain具有可解析的稳定格式,但status命令本身旨在面向用户(例如,与git ls-files相反)。 - dahlbyk

3
格雷格·休吉尔的回答完全正确。请注意,Git有其他可用的瓷器,包括Easy Git、yap、pyrite和vng。每个瓷器旨在使Git对某个社区的一部分更易学/易用。所有这些项目的链接都在Easy Git页面上:http://people.gnome.org/~newren/eg/

2

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