What to add to "git status --porcelain" to make it behave like "git status"?

git

Solution

The idea in git scripts is to always use:

- low-level "plumbing" commands,

- or porcelain commands with plumbing options

See "What does the term porcelain mean in Git?". As I explain, the `--porcelain` option is, unfortunately (because its naming is confusing), the "plumbing" way to get a status, that is the "reliable" way, meaning its format won't change over time, which is why it is the recommended command for scripting.

For `git log`, it is better to use `git rev-list`:

git rev-list HEAD@{upstream}..HEAD

See "How to know if git repository has changes that have not been synchronized with server (origin)?"

Problem

An earlier question resulted in some ideas on how to check whether your Git repo contains a dirty index or untracked files. The answer I adopted from that discussion was the following: ``` #!/bin/sh exit $(git status --porcelain | wc -l) ``` The idea behind that answer was to emulate what the programmer would do: run `git status` and then examine the output. Unfortunately `git status --porcelain` and `git status` do not do exactly the same thing. In particular, `git status` will report unpushed changes, while `git status --porcelain` will not. Here is an example ``` [jarmo@localhost math-hl]$ git status --porcelain [jarmo@localhost math-hl]$ git status # On branch master # Your branch is ahead of 'origin/master' by 1 commit. # (use "git push" to publish your local commits) # nothing to commit, working directory clean ``` So my question is: what do I need to add to the original script to also identify when the repo has unpushed changes? In particular, would this be a correct approach? ``` #!/bin/bash if [ $(git status --porcelain | wc -l) != "0" \ -o $(git log @{u}.. | wc -l) != "0" ]; then echo "local repo is not clean" ``` Would it be ok, in the long run, to rely on `git log`, or should I use a "plumbing" command instead?

Original source

Related problems