486

The term "porcelain" appears occasionally in the Git documentation. What does it mean?

iBug
  • 30,581
  • 7
  • 64
  • 105
Jan Hettich
  • 7,700
  • 4
  • 32
  • 33

9 Answers9

579

"Porcelain" is the material from which toilets are usually made (and sometimes other fixtures such as washbasins). This is distinct from "plumbing" (the actual pipes and drains), where the porcelain provides a more user-friendly interface to the plumbing.

Git uses this terminology in analogy, to separate the low-level commands that users don't usually need to use directly (the "plumbing") from the more user-friendly high level commands (the "porcelain").

Greg Hewgill
  • 828,234
  • 170
  • 1,097
  • 1,237
  • 48
    I think the answer makes sense to me, but then again, I'm assuming Linus was the one that coined the term, so I tend to adjust my brain to be a little more direct and crass when parsing his world. :) – Nick Klauer Oct 21 '11 at 04:16
  • 67
    Makes you wonder if Linus was imagining the potential streams of excrement his plumbing would be used to transport. Plumbing for open source code is a dirty job but someone's got to do it. – Evan Plaice Feb 18 '14 at 22:02
  • 37
    And a few of us feel that the actual git porcelain is more like a layer of paint over the plumbing. – hemflit Sep 20 '14 at 00:11
  • 16
    other answer below is both more true and more useful – Charney Kaye Jul 12 '15 at 19:34
  • 18
    does anyone else find this comical? – Ben Wilde Aug 25 '15 at 16:46
  • 8
    I find the analogy more confusing than helpful – THIS USER NEEDS HELP Oct 25 '15 at 02:28
  • 3
    This answer would be more useful with examples of which commands are the plumbing and which the porcelain. – demongolem Mar 09 '16 at 16:49
  • 3
    "user-friendly" toilet interface indeed! `mark# git flush`  `Did you mean this? push` – Mark K Cowan Oct 04 '16 at 15:27
  • 2
    I've not a clue what Linus actually had in mind, but in french, "porcelaine" refers to something refined and precious like high quality thin dinner plates (fine china). What toilets are made of is called "faïence", although there are many stylish pieces of "faïence" as well. https://www.wikiwand.com/en/Limoges_porcelain . Anyway, it seems that it is trendy in America to shit on France best know-how and art nowadays – RockyRoad Mar 10 '18 at 07:58
  • 2
    @RockyRoad In Swedish *(Linus' native language)* #, porcelaine is used the same as in French. With the distinction that it could refer to toilets, but more in the sense what they are made *of*. It's not generelly used to refer to a toilet. (It would be valid, but quaint.) A valid but more normal use though could be "clean the porcelaine very carefully with this special detergent" when instructing someone on how to clean a bathroom. # *- With the caveat that Linus' dialect of Swedish is from Finland, I may miss some nuance.* – Prof. Falken Apr 20 '18 at 08:09
  • 1
    Have I missed something, or is the analogy entirely the wrong way round, relative to the implementation? If "plumbing" is thought of as low-level/machine-y and "porcelain" is thought of as high-level/human-friendly (which is the way it is in bathroom fixtures), then why is it that **adding** the `--porcelain` option (let's say, to `git status`) **removes** the human-readable verbosity and makes the result **more** machine-readable? – jez Nov 19 '19 at 16:17
  • @jez: Because Git's command line interface is confusing and inconsistent. See [Which are the plumbing and porcelain commands?](https://stackoverflow.com/questions/39847781/which-are-the-plumbing-and-porcelain-commands) for further discussion about what `--porcelain` means. – Greg Hewgill Nov 19 '19 at 16:58
483

More importantly, the term "porcelain" applies to high-level commands, with output:

  • meant to be readable by human
  • not meant to be parsed
  • susceptible to changes/evolutions

That is key: if you script, you should use if possible plumbing commands, with stable outputs. Not porcelain commands.

However, you can use the output of a porcelain command which has a --porcelain option in script (see below), like:

git status --porcelain
git push --porcelain
git blame --porcelain

Although git includes its own porcelain layer, its low-level commands are sufficient to support development of alternative porcelains.
The interface (input, output, set of options and the semantics) to these low-level commands are meant to be a lot more stable than Porcelain level commands, because these commands are primarily for scripted use.
The interface to Porcelain commands on the other hand are subject to change in order to improve the end user experience.

See "How do I programmatically determine if there are uncommitted changes?" as an example to using plumbing commands instead of porcelain ones.


Note: A porcelain command can have a --porcelain option.
For instance: git status --porcelain, which designates an output meant to be parsed.

--porcelain

Give the output in an easy-to-parse format for scripts. This is similar to the short output, but will remain stable across git versions and regardless of user configuration. See below for details.

The thread mentioned above details:

This is my fault, to some degree.
The "short-status" form is meant for human eyeballs, and was designed by Junio.
Some people wanted a scriptable status output, too, so I slapped a "--porcelain" on the same format that turns off configurable features like relative pathnames and colorizing, and makes an implicit promise that we won't make further changes to the format.
The idea was to prevent people from scripting around --short, because it was never intended to be stable.
So yeah, while --porcelain by itself is stable and scriptable, it is perhaps not the most friendly to parsers. The "-z --porcelain" format is much more so, and I would recommend it to anyone scripting around "git status"

That reflects the need, for git users, to using porcelain commands in their scripts!
But only with stable output (with --porcelain)


As commented by william-berg, the same goes for git push!

--porcelain

Produce machine-readable output.
The output status line for each ref will be tab-separated and sent to stdout instead of stderr.
The full symbolic names of the refs will be given.


As John Glassmyer proposes in the comments:

Perhaps the meaning of --porcelain here is "produce output suitable for consumption by porcelain scripts".

And that could be supported by the very first case of "--porcelain option" introduction
(before git status --porcelain, commit 6f15787, September 2009, git 1.7.0,
before git push --porcelain, commit 1965ff7, June 2009, git 1.6.4):

git blame --porcelain:

-p
--porcelain

Show in a format designed for machine consumption.

Commit b5c698d, October 2006, git 1.4.4

The new option makes the command's native output format to emit output that is easier to handle by Porcelain.

dumbledad
  • 12,928
  • 20
  • 97
  • 226
VonC
  • 1,042,979
  • 435
  • 3,649
  • 4,283
61

The coinage and usage of the term "porcelain" in git was actually by Mike Taht, while otherwise losing a heated argument with Linus Torvalds.

http://www.gelato.unsw.edu.au/archives/git/0504/0881.html

In fact, one of my hopes was that other SCM's could just use the git plumbing.
But then I'd really suggest that you use "git" itself, not any "libgit". Ie you take all the plumbing as real programs, and instead of trying to link against individual routines, you'd script it.

If you don't want it, I won't do it.
Still makes sense to separate the plumbing from the porcelain, though.

Greg Hewgill
  • 828,234
  • 170
  • 1,097
  • 1,237
dave taht
  • 611
  • 5
  • 2
  • 7
    Interesting. +1. My [own answer above](http://stackoverflow.com/a/6978402/6309) is from using the product, but your link references what seems to be the origin of that term. – VonC Dec 08 '13 at 09:38
25

Porcelain is cute name for programs and program suites depending on core git, presenting a high level access to core git. Porcelains expose more of a SCM interface than the "plumbing".

--Porcelain, Git Wiki

Johnsyweb
  • 121,480
  • 23
  • 172
  • 229
15

Short and Simple Explanation

  • There are two types of git commands: "porcelain" and "plumbing".
  • "Porcelain" commands should NOT be relied on when programming/scripting: (because they are likely to change; they and are meant for humans not machines).
  • "Plumbing" commands should be used for scripting, (because they are more stable, and are less likely to change).

yeah, but what about the confusing --porcelain option!?

If you want to:

  1. use a porcelain command (remember, porcelain commands are for humans and not parsing) AND
  2. parse it reliably

....then you can add the --porcelain option use the output for scripting.

Example:

I may use git status --porcelain and use the output for scripting.

Where does porcelain/plumbing terminology come from?

  • If English is not your first language then Greg Hewgill explains it perfectly.
  • For greater detail: checkout VonC's answer.
BKSpurgeon
  • 24,945
  • 9
  • 86
  • 68
  • 1
    What about the confusing --porcelain option? I address that in my answer: https://stackoverflow.com/a/6978402/6309 – VonC Aug 29 '19 at 04:32
  • agreed! I had added a link to your very answer above: `For more detail, checkout VonC's answer.` – BKSpurgeon Aug 29 '19 at 21:54
  • OK, at least using an option named `--porcelain` on already "porcelain" commands to achieve "pseudo-plumbing" functionality blends very nicely with the general UI design of Git... ;) – Sz. Sep 19 '19 at 12:47
  • 4
    I don't get it why this option is called "porcelain". The entire command is already "porcelain". The option should be called `--plumbing` (since you're a plumber this time, not a regular "porcelain" user). – seeker_of_bacon Mar 22 '20 at 09:29
  • Thanks for your answer, @BKSpurgeon. VonC's answer may be more detailed, but I needed your acknowledgement that the `--porcelain` option is confusing, in order to understand properly. – mwfearnley Sep 25 '20 at 16:31
7

Porcelain commands are designed for human consumption, as opposed to commands whose output is easy for computers to parse. git status would be one example.

dahlbyk
  • 67,544
  • 8
  • 95
  • 120
  • 9
    "Porcelain"... "for human consumption"... [I can eat glass](http://en.wikipedia.org/wiki/I_Can_Eat_Glass). (just kidding / noting mixed metaphor for anyone who may be easily confused) – ajm475du Apr 06 '14 at 15:20
  • 5
    Porcelain commands are for human consumption, but when you use the `--porcelain` option, it is for machine consumption. – ThomasW Apr 05 '17 at 06:10
  • `git status --porcelain`: Give the output in an easy-to-parse format for scripts. (...) but will remain stable across Git versions and regardless of user configuration. – tymtam Oct 21 '19 at 00:46
  • Thanks for the downvote. Yes, `git status --porcelain` has a stable format that can be parsed, but the `status` command itself is designed to be user-facing (as opposed to, for example, `git ls-files`). – dahlbyk Oct 24 '19 at 19:49
3

There are two distinct meanings of porcelain in git.

These two meanings, while it can be argued are not strictly contradictory, can appear contradictory.

A. Conceptual (plumbing vs porcelain)

The official Pro Git book:

But because Git was initially a toolkit for a version control system rather than a full user-friendly VCS, it has a number of subcommands that do low-level work and were designed to be chained together UNIX-style or called from scripts. These commands are generally referred to as Git’s “plumbing” commands, while the more user-friendly commands are called “porcelain” commands.

B. --porcelain / =porcelain options

Many git commands come with a --porcelain option which is meant for scripting.

git status' documentation:

--porcelain[=<version>]

Give the output in an easy-to-parse format for scripts. This is similar to the short output, but will remain stable across Git versions and regardless of user configuration. See below for details.

git diff's documentation:

--word-diff[=<mode>]

porcelain

      Use a special line-based format intended for script consumption.

tymtam
  • 20,472
  • 3
  • 58
  • 92
3

Greg Hewgill's answer is exactly correct. Note that there are alternative porcelains available for Git, including Easy Git, yap, pyrite, and vng. Each is intended to make Git easier to learn/use for some part of the community. Links to all of these projects is on the Easy Git page: http://people.gnome.org/~newren/eg/.

Pablo Halpern
  • 865
  • 7
  • 12
2

Porcelain is cute name for programs and program suites depending on core git, presenting a high level access to core git.

https://git.wiki.kernel.org/index.php/Porcelain

André Puel
  • 7,716
  • 7
  • 45
  • 78