Skip to content

Performance Regression: Slow startup in repos with many annotated tags #4770

@willbush

Description

@willbush

Describe the bug

The other day I updated to v0.53.0 and noticed a huge delay on statup on lazygit in a private repo I work in.

lazygit -d gave a clue it was related to tags:

{"level":"info","msg":"refreshed tags in 7.866606855s","time":"2025-07-25T22:16:58-05:00"}

Indeed, I cloned the repo without tags and had no issue. We have a large number of git tags ~8k at the moment for reasons..

I tried to reproduce the issue by creating 8k tags on 1 commit, but ran into a panic instead: #4765
I then tried to break up 8k tags across many commits, but could not replicate any perf issues.
However, I realized that if the git tags are annotated (as most of ours are) then I can repro the perf issue in a new git repository.

I used git bisect to narrow it down to this commit (see Additional context section for steps I did):

To Reproduce

  1. create test git repo: mkdir tester && cd tester && git init
  2. create a random message for git annotated tag: MSG=$(head -c 10000 /dev/urandom | base64). Note 10k bytes is just to make the delay more noticeable. It can by half of this and still noticeable.
  3. generate 5k commits each with a annotated git tag:
for i in $(seq 1 5000); do git commit --allow-empty -m "Commit for tag #$i"; git tag -a "tag-$i" -m "$MSG"; done
  1. lazygit or lazygit --debug for debug mode with logging.
  2. Spam right arrow key to cycle panes. If you're fast enough, you can initially make it to the next pane before it freezes. Keep pressing right arrow to see when it is no longer frozen.

Here's my development.log for tester repo (refreshed tags in 4.411122778s is about half of the delay compared to private repo with ~8k annotated tags.) I'm not sure if delay depends more on the number of annotated tags or the length of the tag messages:

{"command":"git --version","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git --version (1.113133ms)","time":"2025-07-25T22:31:27-05:00"}
{"command":"git -C /home/will/code/tester rev-parse --path-format=absolute --show-toplevel --absolute-git-dir --git-common-dir --is-bare-repository --show-superproject-working-tree","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git -C /home/will/code/tester rev-parse --path-format=absolute --show-toplevel --absolute-git-dir --git-common-dir --is-bare-repository --show-superproject-working-tree (1.992394ms)","time":"2025-07-25T22:31:27-05:00"}
{"command":"git -C /home/will/code/tester rev-parse --path-format=absolute --show-toplevel --absolute-git-dir --git-common-dir --is-bare-repository --show-superproject-working-tree","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git -C /home/will/code/tester rev-parse --path-format=absolute --show-toplevel --absolute-git-dir --git-common-dir --is-bare-repository --show-superproject-working-tree (2.062968ms)","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"starting main loop","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"Binary is not built with the buildBinary flag so we won't check for an update","time":"2025-07-25T22:31:27-05:00"}
{"command":"git fetch --all --no-write-fetch-head","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"refreshing all scopes in async mode","time":"2025-07-25T22:31:27-05:00"}
{"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","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"command":"git for-each-ref --sort=-creatordate --format=%(refname)%00%(objecttype)%00%(contents:subject) refs/tags","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"command":"git stash list -z --pretty=%ct|%gs","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"command":"git branch --show-current","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"Refresh took 532.717µs","time":"2025-07-25T22:31:27-05:00"}
{"level":"debug","msg":"Error getting git config value for key: status.showUntrackedFiles. Error: the key is not found for [git config --get --null status.showUntrackedFiles]","time":"2025-07-25T22:31:27-05:00"}
{"command":"git status --untracked-files=all --porcelain -z --find-renames=50%","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git for-each-ref --sort=refname --format=%(refname) refs/remotes (1.065052ms)","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"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 (1.286731ms)","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"postRefreshUpdate for remotes took 9.087µs","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"postRefreshUpdate for remoteBranches took 7.063µs","time":"2025-07-25T22:31:27-05:00"}
{"command":"git worktree list --porcelain","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git stash list -z --pretty=%ct|%gs (1.126428ms)","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"postRefreshUpdate for stash took 4.639µs","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git branch --show-current (1.099527ms)","time":"2025-07-25T22:31:27-05:00"}
{"command":"git merge-base main main@{u}","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"command":"git rev-parse --symbolic-full-name master@{u}","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"command":"git rev-parse --symbolic-full-name main@{u}","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"level":"debug","msg":"Error getting git config value for key: rebase.updateRefs. Error: the key is not found for [git config --get --null rebase.updateRefs]","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git fetch --all --no-write-fetch-head (2.11739ms)","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"refreshing the following scopes in sync mode: branches,commits,remotes,tags","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git worktree list --porcelain (1.083116ms)","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git status --untracked-files=all --porcelain -z --find-renames=50% (1.371912ms)","time":"2025-07-25T22:31:27-05:00"}
{"command":"git for-each-ref --sort=-creatordate --format=%(refname)%00%(objecttype)%00%(contents:subject) refs/tags","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"command":"git -C /home/will/code/tester rev-parse --path-format=absolute --absolute-git-dir","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"command":"git merge-base main main@{u}","level":"error","msg":"fatal: no upstream configured for branch 'main'\n","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git merge-base main main@{u} (1.320364ms)","time":"2025-07-25T22:31:27-05:00"}
{"command":"git rev-parse --symbolic-full-name main@{u}","level":"error","msg":"fatal: no upstream configured for branch 'main'\n","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git rev-parse --symbolic-full-name main@{u} (1.214955ms)","time":"2025-07-25T22:31:27-05:00"}
{"command":"git rev-parse --symbolic-full-name master@{u}","level":"error","msg":"fatal: no such branch: 'master'\n","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git rev-parse --symbolic-full-name master@{u} (1.526704ms)","time":"2025-07-25T22:31:27-05:00"}
{"command":"git rev-parse --verify --quiet refs/remotes/origin/main","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"command":"git rev-parse --verify --quiet refs/remotes/origin/master","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git for-each-ref --sort=refname --format=%(refname) refs/remotes (1.216288ms)","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"postRefreshUpdate for remotes took 3.987µs","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"postRefreshUpdate for remoteBranches took 2.345µs","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"refreshed remotes in 1.322438ms","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git -C /home/will/code/tester rev-parse --path-format=absolute --absolute-git-dir (1.148008ms)","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"postRefreshUpdate for worktrees took 42.42µs","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"postRefreshUpdate for localBranches took 17.783µs","time":"2025-07-25T22:31:27-05:00"}
{"command":"git rev-parse --verify --quiet refs/remotes/origin/main","level":"error","msg":"","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git rev-parse --verify --quiet refs/remotes/origin/main (883.229µs)","time":"2025-07-25T22:31:27-05:00"}
{"command":"git rev-parse --verify --quiet refs/remotes/origin/master","level":"error","msg":"","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git rev-parse --verify --quiet refs/remotes/origin/master (882.647µs)","time":"2025-07-25T22:31:27-05:00"}
{"command":"git rev-parse --verify --quiet refs/heads/main","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"command":"git rev-parse --verify --quiet refs/heads/master","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"command":"git rev-parse --verify --quiet refs/heads/master","level":"error","msg":"","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git rev-parse --verify --quiet refs/heads/master (821.182µs)","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git rev-parse --verify --quiet refs/heads/main (861.668µs)","time":"2025-07-25T22:31:27-05:00"}
{"command":"git merge-base HEAD refs/heads/main","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"postRefreshUpdate for submodules took 4.438µs","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"postRefreshUpdate for files took 10.92µs","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git merge-base HEAD refs/heads/main (983.539µs)","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git -c log.showSignature=false log -g --abbrev=40 --format=%h%x00%ct%x00%gs%x00%P (33.26119ms)","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git -c log.showSignature=false log -g --abbrev=40 --format=%h%x00%ct%x00%gs%x00%P (32.103492ms)","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"postRefreshUpdate for reflogCommits took 66.326579ms","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"postRefreshUpdate for reflogCommits took 88.666665ms","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"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 -- (203.277245ms)","time":"2025-07-25T22:31:27-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"postRefreshUpdate for commits took 265.762µs","time":"2025-07-25T22:31:27-05:00"}
{"command":"git branch --show-current","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git branch --show-current (1.162216ms)","time":"2025-07-25T22:31:27-05:00"}
{"command":"git merge-base main main@{u}","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"command":"git merge-base HEAD refs/heads/main","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git merge-base HEAD refs/heads/main (1.214595ms)","time":"2025-07-25T22:31:27-05:00"}
{"command":"git merge-base main main@{u}","level":"error","msg":"fatal: no upstream configured for branch 'main'\n","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git merge-base main main@{u} (1.293835ms)","time":"2025-07-25T22:31:27-05:00"}
{"command":"git log --graph --color=always --abbrev-commit --decorate --date=relative --pretty=medium refs/heads/main --","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git for-each-ref --sort=-creatordate --format=%(refname)%00%(objecttype)%00%(contents:subject) refs/tags (399.603609ms)","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"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 -- (199.804935ms)","time":"2025-07-25T22:31:27-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"postRefreshUpdate for commits took 240.775µs","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"refreshed commits and commit files in 404.513194ms","time":"2025-07-25T22:31:27-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:27-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:27-05:00"}
{"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","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"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 (1.527726ms)","time":"2025-07-25T22:31:27-05:00"}
{"command":"git log --graph --color=always --abbrev-commit --decorate --date=relative --pretty=medium refs/heads/main --","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"postRefreshUpdate for localBranches took 147.158µs","time":"2025-07-25T22:31:27-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"refreshed reflog and branches in 407.330687ms","time":"2025-07-25T22:31:27-05:00"}
{"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","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"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 (1.362715ms)","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"git for-each-ref --sort=-creatordate --format=%(refname)%00%(objecttype)%00%(contents:subject) refs/tags (411.369076ms)","time":"2025-07-25T22:31:27-05:00"}
{"command":"git log --graph --color=always --abbrev-commit --decorate --date=relative --pretty=medium refs/heads/main --","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"postRefreshUpdate for localBranches took 84.068µs","time":"2025-07-25T22:31:27-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:27-05:00"}
{"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","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"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 (1.702917ms)","time":"2025-07-25T22:31:27-05:00"}
{"command":"git log --graph --color=always --abbrev-commit --decorate --date=relative --pretty=medium refs/heads/main --","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"postRefreshUpdate for localBranches took 126.099µs","time":"2025-07-25T22:31:27-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:27-05:00"}
{"command":"git -C /home/will/code/tester -c diff.noprefix=false show --no-ext-diff --submodule --color=always --unified=3 --stat --decorate -p 062f040bd95c411479a4e275db069a97c268a191 --find-renames=50%","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:27-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:27-05:00"}
{"level":"info","msg":"postRefreshUpdate for tags took 4.006292294s","time":"2025-07-25T22:31:31-05:00"}
{"level":"info","msg":"refreshed tags in 4.411122778s","time":"2025-07-25T22:31:31-05:00"}
{"level":"info","msg":"Refresh took 4.411174546s","time":"2025-07-25T22:31:31-05:00"}
{"level":"info","msg":"postRefreshUpdate for tags took 7.27461327s","time":"2025-07-25T22:31:34-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:34-05:00"}
{"command":"git log --graph --color=always --abbrev-commit --decorate --date=relative --pretty=medium refs/heads/main --","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:34-05:00"}
{"command":"git -C /home/will/code/tester -c diff.noprefix=false show --no-ext-diff --submodule --color=always --unified=3 --stat --decorate -p 062f040bd95c411479a4e275db069a97c268a191 --find-renames=50%","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:34-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:34-05:00"}
{"command":"git log --graph --color=always --abbrev-commit --decorate --date=relative --pretty=medium refs/heads/main --","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:34-05:00"}
{"command":"git -C /home/will/code/tester -c diff.noprefix=false show --no-ext-diff --submodule --color=always --unified=3 --stat --decorate -p 062f040bd95c411479a4e275db069a97c268a191 --find-renames=50%","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:34-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:34-05:00"}
{"command":"git log --graph --color=always --abbrev-commit --decorate --date=relative --pretty=medium refs/heads/main --","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:34-05:00"}
{"command":"git -C /home/will/code/tester -c diff.noprefix=false show --no-ext-diff --submodule --color=always --unified=3 --stat --decorate -p 062f040bd95c411479a4e275db069a97c268a191 --find-renames=50%","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:34-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:34-05:00"}
{"command":"git log --graph --color=always --abbrev-commit --decorate --date=relative --pretty=medium refs/heads/main --","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:34-05:00"}
{"command":"git -C /home/will/code/tester -c diff.noprefix=false show --no-ext-diff --submodule --color=always --unified=3 --stat --decorate -p 062f040bd95c411479a4e275db069a97c268a191 --find-renames=50%","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:34-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:34-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:34-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:34-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:34-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:34-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:35-05:00"}
{"command":"git -C /home/will/code/tester -c diff.noprefix=false show --no-ext-diff --submodule --color=always --unified=3 --stat --decorate -p 062f040bd95c411479a4e275db069a97c268a191 --find-renames=50%","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:35-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:35-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:35-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:35-05:00"}
{"command":"git log --graph --color=always --abbrev-commit --decorate --date=relative --pretty=medium refs/heads/main --","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:35-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:36-05:00"}
{"command":"git -C /home/will/code/tester -c diff.noprefix=false show --no-ext-diff --submodule --color=always --unified=3 --stat --decorate -p 062f040bd95c411479a4e275db069a97c268a191 --find-renames=50%","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:36-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:36-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:36-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:36-05:00"}
{"command":"git log --graph --color=always --abbrev-commit --decorate --date=relative --pretty=medium refs/heads/main --","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:36-05:00"}
{"level":"info","msg":"refreshing the following scopes in sync mode: files","time":"2025-07-25T22:31:37-05:00"}
{"level":"info","msg":"Heap memory in use: 5.4 GB","time":"2025-07-25T22:31:37-05:00"}
{"level":"debug","msg":"using cache for key status.showUntrackedFiles","time":"2025-07-25T22:31:37-05:00"}
{"level":"info","msg":"refreshed merge conflicts in 12.564µs","time":"2025-07-25T22:31:37-05:00"}
{"command":"git status --untracked-files=all --porcelain -z --find-renames=50%","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:37-05:00"}
{"level":"info","msg":"git status --untracked-files=all --porcelain -z --find-renames=50% (1.475367ms)","time":"2025-07-25T22:31:37-05:00"}
{"level":"info","msg":"refreshed files in 1.587148ms","time":"2025-07-25T22:31:37-05:00"}
{"level":"info","msg":"Refresh took 1.788219ms","time":"2025-07-25T22:31:37-05:00"}
{"level":"info","msg":"postRefreshUpdate for submodules took 4.549µs","time":"2025-07-25T22:31:37-05:00"}
{"level":"info","msg":"postRefreshUpdate for files took 2.285µs","time":"2025-07-25T22:31:37-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:37-05:00"}
{"command":"git -C /home/will/code/tester -c diff.noprefix=false show --no-ext-diff --submodule --color=always --unified=3 --stat --decorate -p 062f040bd95c411479a4e275db069a97c268a191 --find-renames=50%","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:37-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:37-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:37-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:37-05:00"}
{"command":"git log --graph --color=always --abbrev-commit --decorate --date=relative --pretty=medium refs/heads/main --","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:37-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:38-05:00"}
{"command":"git -C /home/will/code/tester -c diff.noprefix=false show --no-ext-diff --submodule --color=always --unified=3 --stat --decorate -p 062f040bd95c411479a4e275db069a97c268a191 --find-renames=50%","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:39-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:39-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:39-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:39-05:00"}
{"command":"git log --graph --color=always --abbrev-commit --decorate --date=relative --pretty=medium refs/heads/main --","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:39-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:39-05:00"}
{"command":"git -C /home/will/code/tester -c diff.noprefix=false show --no-ext-diff --submodule --color=always --unified=3 --stat --decorate -p 062f040bd95c411479a4e275db069a97c268a191 --find-renames=50%","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:39-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:39-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:39-05:00"}
{"level":"debug","msg":"using cache for key rebase.updateRefs","time":"2025-07-25T22:31:40-05:00"}
{"command":"git log --graph --color=always --abbrev-commit --decorate --date=relative --pretty=medium refs/heads/main --","level":"debug","msg":"RunCommand","time":"2025-07-25T22:31:40-05:00"}

Expected behavior

Should not freeze on startup.

Screenshots

note: I'm pressing right arrow key over and over the entire time to cycle panes.

screenrecord.mp4

Version info:

❯ lazygit --version
commit=, build date=, build source=nix, version=0.53.0, os=linux, arch=amd64, git version=2.50.0
❯ git --version
git version 2.50.0

Config info:

Verified issue with these things disabled:

git:
  autoFetch: false
  fetchAll: false
  log:
    showGraph: never
    showWholeGraph: false
  parseEmoji: false

This is my normal config (with theme and custom keybindings removed):

disableStartupPopups: true
git:
  paging:
    colorArg: always
    pager: delta --dark --paging=never

Additional context

How I checked with git bisect:

❯ git bisect start
status: waiting for both good and bad commits
❯ git bisect bad v0.53.0
status: waiting for good commit(s), bad commit known
❯ git bisect good v0.52.0
Bisecting: 44 revisions left to test after this (roughly 6 steps)
[5be97c61456cbfb587edc3e532d2a19a5c40e6d2] Remove another unnecessary refresh
❯ rm ./lazygit && nix-shell -p go gnumake --command "make"
go build -gcflags='all=-N -l'
❯ ./lazygit --path=/home/will/code/tester
❯ git bisect bad
Bisecting: 21 revisions left to test after this (roughly 5 steps)
[718cbdb48c3e2859681a295ee6b849d9cce0b1fa] Fix branch head icon appearing at head commit when a remote or tag exists with the same name as the current branch (#4669)
❯ rm ./lazygit && nix-shell -p go gnumake --command "make"
go build -gcflags='all=-N -l'
❯ ./lazygit --path=/home/will/code/tester
❯ ./lazygit --path=/home/will/code/tester
❯ git bisect good
Bisecting: 10 revisions left to test after this (roughly 4 steps)
[9b54dc0b28992cfdd161ce5f5365d7b21c5d1eb9] Update VS Code settings to use golangci-lint v2
❯ rm ./lazygit && nix-shell -p go gnumake --command "make"
go build -gcflags='all=-N -l'
❯ ./lazygit --path=/home/will/code/tester
❯ git bisect bad
Bisecting: 5 revisions left to test after this (roughly 3 steps)
[8c574f888c01fee48958557bd51373e3b2ee1c7c] Fix warning ST1016: methods on the same type should have the same receiver name
❯ rm ./lazygit && nix-shell -p go gnumake --command "make"
go build -gcflags='all=-N -l'
❯ ./lazygit --path=/home/will/code/tester
❯ git bisect bad
Bisecting: 2 revisions left to test after this (roughly 1 step)
[e5b09f34e060c87598e22bca9a5b676c3907df80] Show tag information for selected tag
❯ rm ./lazygit && nix-shell -p go gnumake --command "make"
go build -gcflags='all=-N -l'
❯ ./lazygit --path=/home/will/code/tester
❯ git bisect bad
Bisecting: 0 revisions left to test after this (roughly 0 steps)
[b12b1040c3b248959e2a330560d339d617d11a2d] Add IsAnnotated field to models.Tag struct
❯ rm ./lazygit && nix-shell -p go gnumake --command "make"
go build -gcflags='all=-N -l'
❯ ./lazygit --path=/home/will/code/tester
❯ git bisect bad
b12b1040c3b248959e2a330560d339d617d11a2d is the first bad commit
commit b12b1040c3b248959e2a330560d339d617d11a2d (HEAD)
Author: Stefan Haller <[email protected]>
Date:   Tue Jun 24 13:41:33 2025 +0200

    Add IsAnnotated field to models.Tag struct

 pkg/commands/git_commands/tag_loader.go      | 32 ++++++++++++++++++--------------
 pkg/commands/git_commands/tag_loader_test.go | 17 ++++++++---------
 pkg/commands/models/tag.go                   |  4 ++++
 3 files changed, 30 insertions(+), 23 deletions(-)
❯ rm ./lazygit && nix-shell -p go gnumake --command "make"
go build -gcflags='all=-N -l'
❯ ./lazygit --path=/home/will/code/tester
❯ git checkout HEAD^
Previous HEAD position was b12b1040c Add IsAnnotated field to models.Tag struct
HEAD is now at 718cbdb48 Fix branch head icon appearing at head commit when a remote or tag exists with the same name as the current branch (#4669)
❯ rm ./lazygit && nix-shell -p go gnumake --command "make"
go build -gcflags='all=-N -l'
❯ ./lazygit --path=/home/will/code/tester
❯ git bisect reset
Previous HEAD position was 718cbdb48 Fix branch head icon appearing at head commit when a remote or tag exists with the same name as the current branch (#4669)
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

lazygit master

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions