Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
The slowness of my zsh prompt when in a git-svn managed directory was killing me. I improved it by removing the git status stuff that slows it down...
function git_prompt_info() {
ref=$(git symbolic-ref HEAD 2> /dev/null) || return
echo "$ZSH_THEME_GIT_PROMPT_PREFIX${ref#refs/heads/}$ZSH_THEME_GIT_PROMPT_SUFFIX"
}
@rbugajewski

This comment has been minimized.

Copy link

@rbugajewski rbugajewski commented Nov 13, 2012

In my theme (robbyrussell) I was missing the ending brace, so I changed the output to echo "$ZSH_THEME_GIT_PROMPT_PREFIX${ref#refs/heads/}${ZSH_THEME_GIT_PROMPT_CLEAN}${ZSH_THEME_GIT_PROMPT_SUFFIX}".

@toc21c

This comment has been minimized.

Copy link

@toc21c toc21c commented Apr 10, 2013

awesome!!

@akilman-zz

This comment has been minimized.

Copy link

@akilman-zz akilman-zz commented May 7, 2013

This has been bugging me for some time now. Thanks!

@admdikramr

This comment has been minimized.

Copy link

@admdikramr admdikramr commented Jun 6, 2013

This is excellent -- but when I'm not in a git directory, it says (master). Is there an easy way to prevent this?

@rajsahae

This comment has been minimized.

Copy link

@rajsahae rajsahae commented Sep 19, 2013

Huge huge help. Thank you.

@gferon

This comment has been minimized.

Copy link

@gferon gferon commented Oct 22, 2013

I think you should submit a pull request with this fix, so it can be toggled with a setting!

@rekendahl

This comment has been minimized.

Copy link

@rekendahl rekendahl commented Jan 7, 2014

Thank you. This has been bugging me under CentOS 6 for some time. It is true that what's slow on my system is git status. I wonder if it's a git version thing (CentOS runs a older version) or it it's a git svn thing.

@messick

This comment has been minimized.

Copy link

@messick messick commented Aug 12, 2014

👍

@jbnunn

This comment has been minimized.

Copy link

@jbnunn jbnunn commented Sep 3, 2014

Works on Yosemite as well--thank you!

@n1k0

This comment has been minimized.

Copy link

@n1k0 n1k0 commented Sep 8, 2014

Just to add a thank you to the stack. Cheers!

@kstach01

This comment has been minimized.

Copy link

@kstach01 kstach01 commented Oct 15, 2014

Thanks! That was driving me insane.

@yonatankarni

This comment has been minimized.

Copy link

@yonatankarni yonatankarni commented Jan 20, 2015

great stuff! thanks!

@justinharringa

This comment has been minimized.

Copy link

@justinharringa justinharringa commented Feb 9, 2015

👍

@retgoat

This comment has been minimized.

Copy link

@retgoat retgoat commented Apr 23, 2015

Works great! Thanks!

@kwketh

This comment has been minimized.

Copy link

@kwketh kwketh commented May 22, 2015

Thanks, that looks great.
If anybody is still running into issues, you may trace all commands with set -o xtrace, you will see full context and likely which command may be taking long time. It helped me trace my problem.

@pmalek

This comment has been minimized.

Copy link

@pmalek pmalek commented May 29, 2015

@kwketh How to undo set -o xtrace?

@pmalek

This comment has been minimized.

Copy link

@pmalek pmalek commented May 29, 2015

After applying this fix I am missing the * (when I have midified working tree).

@minhoryang

This comment has been minimized.

Copy link

@minhoryang minhoryang commented Oct 3, 2015

HAPPY TO MEET YOU!

@SSchnitzler

This comment has been minimized.

Copy link

@SSchnitzler SSchnitzler commented Oct 23, 2015

Thank you for this gist, it made working with zsh possible again for me as it was just unusably slow and i had to disable it again.

@songcy6202

This comment has been minimized.

Copy link

@songcy6202 songcy6202 commented Dec 16, 2015

That's great ,thanks a lot.

@smeggingsmegger

This comment has been minimized.

Copy link

@smeggingsmegger smeggingsmegger commented Dec 29, 2015

Still relevant and wonderful. Thanks!

@triadsk

This comment has been minimized.

Copy link

@triadsk triadsk commented Jan 2, 2016

That worked, thanks a lot!

@HandIeNeeded

This comment has been minimized.

Copy link

@HandIeNeeded HandIeNeeded commented Jan 5, 2016

Awesome!

@xiaoyang4011

This comment has been minimized.

Copy link

@xiaoyang4011 xiaoyang4011 commented Jan 16, 2016

nice!

@usmanayubsh

This comment has been minimized.

Copy link

@usmanayubsh usmanayubsh commented Jan 28, 2016

Works like a charm! Thank you so much.

@dannykopping

This comment has been minimized.

Copy link

@dannykopping dannykopping commented May 8, 2016

👍

@harukaeru

This comment has been minimized.

Copy link

@harukaeru harukaeru commented Oct 19, 2016

Great!

@smo0f

This comment has been minimized.

Copy link

@smo0f smo0f commented Nov 11, 2016

@pmalek to undo set -o xtrace, run set +o xtrace - plus instead of minus

@jep-dev

This comment has been minimized.

Copy link

@jep-dev jep-dev commented Oct 29, 2017

In my case, this didn't noticeably improve the delay. It has all the same symptoms (no delay outside of Git repo; delay for anything that causes a new prompt to draw, like hitting enter on an empty line, <ctrl+l>, etc.; no delay pressing other keys or while a command is still running.) This does not appear to be related to my network speed. I could post my versions, config files, etc. but I'd like to look find more general alternative approaches first.

For what it's worth, I'm using bhilburn/powerlevel9k with submodule checking disabled, effectively --ignore-submodules=dirty (not that the project I'm testing on has submodules anyway - more complicated projects I've cloned take much longer.)

Would it be possible to set a flag or add a sentinel file somewhere to indicate if/when the local status has actually changed? Maybe caching the command's output and using the cached version if the (parent) directory's modified date is within some threshold of the cache, or if the cache is similarly recent compared to the current time? The worst effects if it malfunctions should be saving the output every time (negligible contribution to original delay) or showing an outdated status, and both should be fixed by re-tuning the threshold, and of course excluding the cache file via .gitignore.

A few benchmarks for reference...
I can't seem to use the time command on git_prompt_info, but 500 iterations of the command (piped to /dev/null; book-ended by date) averaged to 26ms each.
Timing git add -An and git status with the same method each average to 12ms.
Pinging github.com (as a lower bound) shows an average delay of 20-30ms with a few minutes between each run.

@wang-nima

This comment has been minimized.

Copy link

@wang-nima wang-nima commented Dec 14, 2018

where should I insert your code to make it works? thanks!

@RasmusFonseca

This comment has been minimized.

Copy link

@RasmusFonseca RasmusFonseca commented Dec 18, 2018

where should I insert your code to make it works? thanks!

In your ~/.zshrc file.

Everyone seems pretty stoked to be rid of git status from their prompt because the git_current_branch function can be slow for large repos, but if anyone would still like to see info on their current branch you can replace with the following which is still fairly fast:

export PROMPT='${ret_status} %{$fg[cyan]%}%~%{$reset_color%} %{$fg[blue]%}$(git_current_branch)%{$reset_color%} $ '
@thomasaarholt

This comment has been minimized.

Copy link

@thomasaarholt thomasaarholt commented Jan 5, 2019

Could someone clarify: Should one paste the above function git_prompt... into ~/.zshrc? I don't seem to notice a difference, but then I am testing on a small repo.

@liladas

This comment has been minimized.

Copy link

@liladas liladas commented Jan 25, 2019

Git config modification to "hide dirty" check

git config --add oh-my-zsh.hide-dirty 1

https://github.com/robbyrussell/oh-my-zsh/blob/master/lib/git.zsh#L16

if [[ "$(command git config --get oh-my-zsh.hide-dirty)" != "1" ]]; then

@zad

This comment has been minimized.

Copy link

@zad zad commented May 15, 2019

thank you!

@ncdmr

This comment has been minimized.

Copy link

@ncdmr ncdmr commented Dec 4, 2019

thanks!

@namzo

This comment has been minimized.

Copy link

@namzo namzo commented Jan 22, 2020

Git config modification to "hide dirty" check

git config --add oh-my-zsh.hide-dirty 1

https://github.com/robbyrussell/oh-my-zsh/blob/master/lib/git.zsh#L16

if [[ "$(command git config --get oh-my-zsh.hide-dirty)" != "1" ]]; then

Thanks!

@anselm94

This comment has been minimized.

Copy link

@anselm94 anselm94 commented Aug 4, 2020

If someone uses gruvbox theme on ZSH, you may have to comment out prompt_bzr from build_prompt function in ~/.oh-my-zsh/custom/themes/gruvbox.zsh-theme file.

Or you may check why ZSH lags by executing this

zsh -vx
@stevenvo

This comment has been minimized.

Copy link

@stevenvo stevenvo commented Aug 20, 2020

this saved my day!

@avatar-lavventura

This comment has been minimized.

Copy link

@avatar-lavventura avatar-lavventura commented Nov 3, 2020

Thanks ; would it be enough if I just paste it into .zshrc file?

@trunc8

This comment has been minimized.

Copy link

@trunc8 trunc8 commented Nov 19, 2020

Awesome and thanks @liladas!
@avatar-lavventura, add this snippet just above the source $ZSH/oh-my-zsh.sh line in your ~/.zshrc

function git_prompt_info() {
  local ref
  if [[ "$(command git config --get oh-my-zsh.hide-dirty)" != "1" ]]; then
    if [[ "$(__git_prompt_git config --get oh-my-zsh.hide-status 2>/dev/null)" != "1" ]]; then
      ref=$(__git_prompt_git symbolic-ref HEAD 2> /dev/null) || \
      ref=$(__git_prompt_git rev-parse --short HEAD 2> /dev/null) || return 0
      echo "$ZSH_THEME_GIT_PROMPT_PREFIX${ref#refs/heads/}$(parse_git_dirty)$ZSH_THEME_GIT_PROMPT_SUFFIX"
    fi
  fi
}

And inside your desired (probably very large) git repo, run this command git config --add oh-my-zsh.hide-dirty 1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.