Lazygit very slow on osx sonoma and small repo
Describe the bug lazygit is very slow to give diffs and slows down terminal even after exit for a few seconds
To Reproduce Steps to reproduce the behavior:
- launch lazygit
- scroll down some unstages changes
- observe "loading..."
Expected behavior Previously, on ubuntu it was lightning fast
Screenshots
https://github.com/user-attachments/assets/e605d8bd-59f5-4656-849e-e554ce3e26e9
Version info:
➜ ~ lazygit --version
commit=, build date=, build source=homebrew, version=0.44.1, os=darwin, arch=arm64, git version=2.47.0
➜ ~ git --version
git version 2.47.0
➜ ~ which git
/opt/homebrew/bin/git
Macosx sonoma 14.7
Additional context Ive also tried this using just the git that ships with mac (2.39) instead of homebrew - same issue Also on bash using native terminal app - same issue
lazygit logs:
➜ ~ lazygit --logs
Tailing log file /Users/dmesa/.local/state/lazygit/development.log
Oct 10 12:18:44 |INFO| refreshing the following scopes in sync mode: files
Oct 10 12:18:44 |INFO| Heap memory in use: 4.2 MB
Oct 10 12:18:44 |INFO| refreshed merge conflicts in 508.834µs
Oct 10 12:18:47 |INFO| git tag --list -n --sort=-creatordate (4.524746333s)
Oct 10 12:18:47 |INFO| postRefreshUpdate for tags took 20.5µs
Oct 10 12:18:49 |INFO| Receiving focus - refreshing
Oct 10 12:18:49 |INFO| refreshing all scopes in async mode
Oct 10 12:18:49 |DEBU| RunCommand command="git tag --list -n --sort=-creatordate"
Oct 10 12:18:49 |INFO| Refresh took 638µs
Oct 10 12:18:49 |DEBU| RunCommand command="git stash list -z --pretty=%ct|%gs"
Oct 10 12:18:52 |INFO| git status --untracked-files=all --porcelain -z --find-renames=50% (9.02547275s)
Oct 10 12:18:52 |DEBU| using cache for key status.showUntrackedFiles
Oct 10 12:18:52 |INFO| postRefreshUpdate for submodules took 15.708µs
Oct 10 12:18:52 |DEBU| RunCommand command="git status --untracked-files=all --porcelain -z --find-renames=50%"
Oct 10 12:18:52 |INFO| postRefreshUpdate for files took 788.542µs
Oct 10 12:18:54 |INFO| Heap memory in use: 6.3 MB
Oct 10 12:18:56 |INFO| git rev-parse --abbrev-ref --verify HEAD (13.5325895s)
Oct 10 12:18:56 |DEBU| RunCommand command="git merge-base master master@{u}"
Oct 10 12:18:56 |DEBU| RunCommand command="git merge-base HEAD refs/remotes/origin/master"
Oct 10 12:19:01 |INFO| git for-each-ref --sort=refname --format=%(refname:short) refs/remotes (18.03377775s)
Oct 10 12:19:01 |INFO| postRefreshUpdate for remotes took 188.667µs
Oct 10 12:19:01 |INFO| postRefreshUpdate for remoteBranches took 5.083µs
Oct 10 12:19:01 |INFO| git merge-base HEAD refs/remotes/origin/master (4.858140375s)
Oct 10 12:19:01 |INFO| git -c log.showSignature=false log -g --abbrev=40 --format=%h%x00%ct%x00%gs%x00%p (18.392961875s)
Oct 10 12:19:01 |INFO| postRefreshUpdate for reflogCommits took 46.417µs
Oct 10 12:19:01 |DEBU| RunCommand command="git for-each-ref --sort=-committerdate --format=%(HEAD)%00%(refname:short)%00%(upstream:short)%00%(upstream:track)%00%(push:track)%00%(subject)%00%(objectname)%00%(committerdate:unix) refs/heads"
Oct 10 12:19:01 |INFO| git stash list -z --pretty=%ct|%gs (18.393094792s)
Oct 10 12:19:01 |INFO| postRefreshUpdate for stash took 7.125µs
Oct 10 12:19:01 |INFO| git status --untracked-files=all --porcelain -z --find-renames=50% (9.365037958s)
Oct 10 12:19:01 |INFO| refreshed files in 17.30980925s
Oct 10 12:19:01 |INFO| Refresh took 17.31084075s
Oct 10 12:19:01 |DEBU| using cache for key status.showUntrackedFiles
Oct 10 12:19:01 |INFO| refreshing the following scopes in sync mode: files
Oct 10 12:19:01 |INFO| refreshed merge conflicts in 46.667µs
Oct 10 12:19:01 |DEBU| RunCommand command="git status --untracked-files=all --porcelain -z --find-renames=50%"
Oct 10 12:19:01 |INFO| git stash list -z --pretty=%ct|%gs (12.692843791s)
Oct 10 12:19:01 |INFO| postRefreshUpdate for stash took 77.875µs
Oct 10 12:19:01 |INFO| git -c log.showSignature=false log -g --abbrev=40 --format=%h%x00%ct%x00%gs%x00%p (12.697166375s)
Oct 10 12:19:01 |INFO| postRefreshUpdate for reflogCommits took 34.541µs
Oct 10 12:19:01 |INFO| git merge-base master master@{u} (4.872367542s)
Oct 10 12:19:01 |INFO| git for-each-ref --sort=-committerdate --format=%(HEAD)%00%(refname:short)%00%(upstream:short)%00%(upstream:track)%00%(push:track)%00%(subject)%00%(objectname)%00%(committerdate:unix) refs/heads (16.405167ms)
Oct 10 12:19:01 |DEBU| RunCommand command="git worktree list --porcelain"
Oct 10 12:19:01 |INFO| git for-each-ref --sort=refname --format=%(refname:short) refs/remotes (12.706067333s)
Oct 10 12:19:01 |INFO| postRefreshUpdate for remotes took 121.375µs
Oct 10 12:19:01 |INFO| postRefreshUpdate for remoteBranches took 8.958µs
Oct 10 12:19:01 |INFO| git tag --list -n --sort=-creatordate (12.706366083s)
Oct 10 12:19:01 |INFO| postRefreshUpdate for tags took 6.583µs
Oct 10 12:19:01 |INFO| postRefreshUpdate for submodules took 15.917µs
Oct 10 12:19:01 |INFO| postRefreshUpdate for files took 272.333µs
Oct 10 12:19:01 |INFO| git log HEAD --topo-order --oneline --pretty=format:%H%x00%at%x00%aN%x00%ae%x00%D%x00%p%x00%m%x00%s --abbrev=40 -300 --no-show-signature -- (4.890090375s)
Oct 10 12:19:01 |DEBU| using cache for key rebase.updateRefs
Oct 10 12:19:01 |INFO| postRefreshUpdate for commits took 181.167µs
Oct 10 12:19:01 |DEBU| RunCommand command="git rev-parse --abbrev-ref --verify HEAD"
Oct 10 12:19:01 |INFO| git status --untracked-files=all --porcelain -z --find-renames=50% (30.352167ms)
Oct 10 12:19:01 |INFO| git worktree list --porcelain (15.403375ms)
Oct 10 12:19:01 |DEBU| using cache for key status.showUntrackedFiles
Oct 10 12:19:01 |DEBU| RunCommand command="git -C /Users/dmesa/.dotfiles rev-parse --path-format=absolute --absolute-git-dir"
Oct 10 12:19:01 |DEBU| RunCommand command="git status --untracked-files=all --porcelain -z --find-renames=50%"
Oct 10 12:19:01 |INFO| git rev-parse --abbrev-ref --verify HEAD (8.756709ms)
Oct 10 12:19:01 |DEBU| RunCommand command="git merge-base master master@{u}"
Oct 10 12:19:01 |DEBU| RunCommand command="git merge-base HEAD refs/remotes/origin/master"
Oct 10 12:19:01 |INFO| postRefreshUpdate for submodules took 42.833µs
Oct 10 12:19:01 |INFO| postRefreshUpdate for files took 555.166µs
Oct 10 12:19:01 |INFO| git -C /Users/dmesa/.dotfiles rev-parse --path-format=absolute --absolute-git-dir (11.147625ms)
Oct 10 12:19:01 |INFO| postRefreshUpdate for worktrees took 351.125µs
Oct 10 12:19:01 |INFO| postRefreshUpdate for localBranches took 67.333µs
Oct 10 12:19:01 |INFO| git status --untracked-files=all --porcelain -z --find-renames=50% (18.914208ms)
Oct 10 12:19:01 |INFO| refreshed files in 50.704334ms
Oct 10 12:19:01 |INFO| Refresh took 50.925917ms
Oct 10 12:19:01 |INFO| git merge-base master master@{u} (14.426416ms)
Oct 10 12:19:01 |INFO| git log HEAD --topo-order --oneline --pretty=format:%H%x00%at%x00%aN%x00%ae%x00%D%x00%p%x00%m%x00%s --abbrev=40 -300 --no-show-signature -- (13.981791ms)
Oct 10 12:19:01 |INFO| git merge-base HEAD refs/remotes/origin/master (13.676041ms)
Oct 10 12:19:01 |DEBU| using cache for key rebase.updateRefs
Oct 10 12:19:01 |INFO| postRefreshUpdate for commits took 305.542µs
Oct 10 12:19:01 |DEBU| using cache for key rebase.updateRefs
Oct 10 12:19:01 |DEBU| RunCommand command="git for-each-ref --sort=-committerdate --format=%(HEAD)%00%(refname:short)%00%(upstream:short)%00%(upstream:track)%00%(push:track)%00%(subject)%00%(objectname)%00%(committerdate:unix) refs/heads"
Oct 10 12:19:01 |INFO| postRefreshUpdate for submodules took 46.375µs
Oct 10 12:19:01 |INFO| postRefreshUpdate for files took 369.875µs
Oct 10 12:19:01 |INFO| git for-each-ref --sort=-committerdate --format=%(HEAD)%00%(refname:short)%00%(upstream:short)%00%(upstream:track)%00%(push:track)%00%(subject)%00%(objectname)%00%(committerdate:unix) refs/heads (8.750791ms)
Oct 10 12:19:01 |DEBU| RunCommand command="git worktree list --porcelain"
Oct 10 12:19:01 |INFO| git worktree list --porcelain (4.936083ms)
Oct 10 12:19:01 |DEBU| RunCommand command="git -C /Users/dmesa/.dotfiles rev-parse --path-format=absolute --absolute-git-dir"
Oct 10 12:19:01 |INFO| git -C /Users/dmesa/.dotfiles rev-parse --path-format=absolute --absolute-git-dir (4.649542ms)
Oct 10 12:19:01 |INFO| postRefreshUpdate for worktrees took 29.875µs
Oct 10 12:19:01 |INFO| postRefreshUpdate for localBranches took 56.583µs
Oct 10 12:19:01 |DEBU| using cache for key rebase.updateRefs
Oct 10 12:19:04 |INFO| Heap memory in use: 5.0 MB
Oct 10 12:19:04 |INFO| refreshing the following scopes in sync mode: files
Oct 10 12:19:04 |INFO| refreshed merge conflicts in 432.958µs
Oct 10 12:19:04 |DEBU| using cache for key status.showUntrackedFiles
Oct 10 12:19:04 |DEBU| RunCommand command="git status --untracked-files=all --porcelain -z --find-renames=50%"
Am I reading this log correctly that some git operations took 9s? 18s? etc?
There was a similar issue recently that was solved by updating delta.
Does this happen if you don't use delta as your pager?
when I use delta it works slowly for me too
I had the same issue except I'm using difft for paging.
git:
paging:
externalDiffCommand: difft --color=always
After removing this config, lazygit works as expected.
Just wanted to chime in to say that it's not specific to delta.
For both delta and difft, you need to tell them whether you want dark mode or light mode (using --dark for delta, or --background dark for difft). Without that, they will try to auto-detect this by sending terminal control sequences to lazygit, which isn't prepared to answer these. They will wait a while to see if they get an answer though, hence the slowdown.