Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Benchmark results of the fastest way to check if a git branch is dirty

Tested against the WebKit git repo by entering the repo with 1 file dirty.

git diff --quiet --ignore-submodules HEAD # Will tell if there are any uncomitted changes, staged or not.
0.6 sec

git diff-index --quiet HEAD # Only tracked
2 sec

git diff --shortstat
8.2 sec

git status --porcelain
42 sec

zstyle ':vcs_info:*' check-for-changes true
50 sec

git diff --quiet --ignore-submodules HEAD doesn't show the untracked files so it might cause some undesired accidents.


sindresorhus commented Mar 4, 2013

True, but the only git status --percelain will do that, and it's sloooow.

@sindresorhus Doesn’t git status without --porcelain do it too, kind of? That’s what I am using at the moment in my dotfiles: (credit to that code goes to @gf3; I stole it from him)

It might be slow, though.

Because it's related... this appears to be the fastest way to check the current branch (used by vcs_info and others)

git symbolic-ref -q HEAD | sed -e 's|^refs/heads/||'

dideler commented Sep 30, 2013

@paulirish My (non-scientific) tests show that not using the -q or --quiet option is the fastest, but then you'll probably want to redirect error messages to /dev/null/.

gjasny commented Dec 22, 2013

@paulirish Add the --short option and you can get rid of sed:

git symbolic-ref --short HEAD

artjock commented Feb 3, 2014

Did you try git status -suno? It's working faster for me and have the same limitations.
Full version is here:

ericbn commented Oct 14, 2016

Unless you want to take untracked files into account too. The best I've come up with is:

git diff-files --no-ext-diff --quiet || git diff-index --no-ext-diff --quiet --cached HEAD

This is the benchmark I got in a NFS filesystem with the WebKit repo clean:

Command Real time (secs)
git ls-files --other --exclude-standard (lists untracked files) 2.756
git status --porcelain (lists indexed, unindexed and untracked files) 2.313
git diff-index --no-ext-diff --quiet --cached HEAD (checks indexed files) 0.317
git diff-files --no-ext-diff --quiet (checks unindexed files) 0.022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment