# Avoid holding worktree lock for a long time while updating large repos' git status \(\#12266\) · gitcafe/zed

[View on GitCafe](https://git.cafe/gitcafe/zed/commit/f7a86967fd488e72f8166c74bb5fb2cbc9cd8953)

Repository: [gitcafe/zed](https://git.cafe/gitcafe/zed)

Visibility: public

Requested revision: f7a86967fd488e72f8166c74bb5fb2cbc9cd8953

Requested commit: f7a86967fd488e72f8166c74bb5fb2cbc9cd8953

Commit: f7a86967fd488e72f8166c74bb5fb2cbc9cd8953

Tree: da9fe42e47568cc3175e09448d249e7916d72c0f

Author: Max Brunsfeld

Committer: GitHub

## Message

```
Avoid holding worktree lock for a long time while updating large repos' git status (#12266)

Fixes https://github.com/zed-industries/zed/issues/9575
Fixes https://github.com/zed-industries/zed/issues/4294

### Problem

When a large git repository's `.git` folder changes (due to a `git
commit`, `git reset` etc), Zed needs to recompute the git status for
every file in that git repository. Part of computing the git status is
the *unstaged* part - the comparison between the content of the file and
the version in the git index. In a large git repository like `chromium`
or `linux`, this is inherently pretty slow.

Previously, we performed this git status all at once, and held a lock on
our `BackgroundScanner`'s state for the entire time. On my laptop, in
the `linux` repo, this would often take around 13 seconds.

When opening a file, Zed always refreshes the metadata for that file in
its in-memory snapshot of worktree. This is normally very fast, but if
another task is holding a lock on the `BackgroundScanner`, it blocks.

###  Solution

I've restructured how Zed handles Git statuses, so that when a git
repository is updated, we recompute files' git statuses in fixed-sized
batches. In between these batches, the `BackgroundScanner` is free to
perform other work, so that file operations coming from the main thread
will still be responsive.

Release Notes:

- Fixed a bug that caused long delays in opening files right after
performing a commit in very large git repositories.
```

## Parents

- [800c1ba91663ea7a810e8e8755b357f5e3b55a2f](https://git.cafe/gitcafe/zed/commit/800c1ba91663ea7a810e8e8755b357f5e3b55a2f?format=markdown)

[Source at this commit](https://git.cafe/gitcafe/zed/tree/f7a86967fd488e72f8166c74bb5fb2cbc9cd8953?format=markdown)
