zed/crates/git/src
Eagl61 ca0b3c92d7
git: Show submodule changes in commit diffs (#60479)
## Objective

Fix Git Graph showing `0 Changed Files` for commits that modify
submodules.

This happened because submodule entries are gitlinks rather than regular
blobs, so the existing commit diff loading path could not resolve them
correctly.

I ran into this issue previously, and it was confusing because the
commit clearly contained changes, but the UI did not reflect them. If a
commit included many file changes plus a submodule update, the submodule
change was effectively hidden and the UI could still show `0 Changed
Files` for that entry. Since submodules are not used in every
repository, the bug is easy to miss and may go unnoticed for a long
time.

## Solution

- Switched commit diff loading to use Git's raw diff output so submodule
entries are represented explicitly.
- Added parsing for gitlink entries alongside regular file changes.
- Render submodule changes as `Subproject commit <oid>` so they show up
in commit diffs instead of being dropped.

## Testing

- Added a repository test covering commit diffs that include submodule
changes.
- Ran the `git` crate test suite.
- Ran formatting and lint checks.
- Verified the Git UI crate still builds.
- Ran and tested it locally on MacOS.

Reviewer notes:
- The change is limited to commit diff loading and should not affect
normal blob diffs.
- Submodule changes now appear as explicit entries instead of being
counted as zero files.

## Self-Review Checklist:

- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content adheres to Zed's UI standards
([UX/UI](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
and [icon](https://github.com/zed-
industries/zed/blob/main/crates/icons/README.md) guidelines)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

## Showcase

Before:
<img width="200" alt="Screenshot 2026-07-06 at 19 22 57"
src="https://github.com/user-attachments/assets/16efc348-5909-4cb0-8589-b0662923df56"
/>

After:
<img width="200" alt="Screenshot 2026-07-06 at 20 20 11"
src="https://github.com/user-attachments/assets/3201b264-6e61-45de-a9fc-c585f3b54e09"
/>

<img width="200" alt="Screenshot 2026-07-06 at 20 37 57"
src="https://github.com/user-attachments/assets/182ed4e1-9e90-4e33-9136-7626aba31153"
/>

---

Release Notes:

- Fixed Git Graph showing `0 Changed Files` for commits that update
submodules.
2026-07-12 21:19:11 +00:00
..
blame.rs Stream git blame parsing (#58733) 2026-06-06 18:36:07 +00:00
checkpoint.gitignore agent: Don't track large and common binary files (#31352) 2025-05-26 11:31:25 +00:00
commit.rs git: Show submodule changes in commit diffs (#60479) 2026-07-12 21:19:11 +00:00
git.rs worktree: Watch .git/refs subdirectories for external ref updates (#60660) 2026-07-10 17:29:20 +00:00
hosting_provider.rs git: Use CDN endpoint for GitHub avatars to avoid rate limiting (#47894) 2026-01-31 13:49:42 -05:00
remote.rs git: Detect SCP remotes with non-standard SSH usernames (#59457) 2026-06-18 12:52:51 +00:00
repository.rs git: Show submodule changes in commit diffs (#60479) 2026-07-12 21:19:11 +00:00
stash.rs git: Add git stash picker (#35927) 2025-09-12 14:45:38 -04:00
status.rs git: Degrade gracefully when refreshing git state (#57292) 2026-05-25 16:15:12 +00:00