From 76e39af76ff280a0bf184e9b7d4bf23577bfe902 Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Tue, 2 Jan 2024 22:17:11 +0100 Subject: [PATCH] Allow multiple fetch commands (or fetch and pull) to run concurrently Git has a bug [1] whereby running multiple fetch commands at the same time causes all of them to append their information to the .git/FETCH_HEAD file, causing the next git pull that wants to use the information to become confused, and show an error like "Cannot rebase onto multiple branches". This error would occur when pressing "f" and "p" in quick succession in the files panel, but also when pressing "p" while a background fetch happens to be running. One likely situation for this is pressing "p" right after startup. Since lazygit never uses the information written to .git/FETCH_HEAD, it's best to avoid writing to it, which fixes the scenarios described above. However, it doesn't fix the problem of repeatedly pressing "f" quickly on the checked-out branch; since we call "git pull" in that case, the above fix doesn't help there. We'll address this separately in another PR. [1] See https://public-inbox.org/git/xmqqy1daffk8.fsf@gitster.g/ for more information. --- pkg/commands/git_commands/sync.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/commands/git_commands/sync.go b/pkg/commands/git_commands/sync.go index d049deb07..4ab1f336b 100644 --- a/pkg/commands/git_commands/sync.go +++ b/pkg/commands/git_commands/sync.go @@ -51,7 +51,10 @@ func (self *SyncCommands) Push(task gocui.Task, opts PushOpts) error { func (self *SyncCommands) fetchCommandBuilder(fetchAll bool) *GitCommandBuilder { return NewGitCmd("fetch"). - ArgIf(fetchAll, "--all") + ArgIf(fetchAll, "--all"). + // avoid writing to .git/FETCH_HEAD; this allows running a pull + // concurrently without getting errors + ArgIf(self.version.IsAtLeast(2, 29, 0), "--no-write-fetch-head") } func (self *SyncCommands) FetchCmdObj(task gocui.Task) oscommands.ICmdObj {