perf: Avoid normalizing git index path joins#12944
Merged
Merged
Conversation
Contributor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
anthonyshew
pushed a commit
that referenced
this pull request
Jun 25, 2026
## Release v2.10.1-canary.1 > [!CAUTION] > Versioned docs aliasing FAILED. [View logs](https://github.com/vercel/turborepo/actions/runs/28187593190) ### Changes - release(turborepo): 2.9.19-canary.10 (#13130) (`a12323b`) - release(turborepo): 2.10.0 (#13131) (`6939250`) - docs: Add Turborepo 2.10 release post and update docs (#13096) (`c07e48f`) - perf: Avoid normalizing git index path joins (#12944) (`417c28d`) - chore: Remove tbx package (#13133) (`7bebb26`) - feat: Migrate TUI virtual terminals from vt100 to Ghostty (#13135) (`b22d3b4`) - chore: Add examples maintenance agent (#13136) (`05ac7b5`) - chore: Remove a few pre-push hooks (#13137) (`5eb24eb`) - ci: Making sure Zig works in releases (#13138) (`39340f1`) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
anthonyshew
pushed a commit
that referenced
this pull request
Jun 29, 2026
## Release v2.10.1 > [!CAUTION] > Versioned docs aliasing FAILED. [View logs](https://github.com/vercel/turborepo/actions/runs/28399666958) ### Changes - release(turborepo): 2.10.0 (#13131) (`6939250`) - docs: Add Turborepo 2.10 release post and update docs (#13096) (`c07e48f`) - perf: Avoid normalizing git index path joins (#12944) (`417c28d`) - chore: Remove tbx package (#13133) (`7bebb26`) - feat: Migrate TUI virtual terminals from vt100 to Ghostty (#13135) (`b22d3b4`) - chore: Add examples maintenance agent (#13136) (`05ac7b5`) - chore: Remove a few pre-push hooks (#13137) (`5eb24eb`) - ci: Making sure Zig works in releases (#13138) (`39340f1`) - release(turborepo): 2.10.1-canary.1 (#13139) (`69a743e`) - fix: Support Corepack packageManager integrity hashes (#13123) (`6bf6a67`) - fix(env): Add XDG_DATA_* to pass-through (#13145) (`0b3b4a6`) - release(turborepo): 2.10.1-canary.2 (#13147) (`e844c15`) - feat: Support `devEngines.packageManager` (#12388) (`e48c56c`) - feat: Support devEngines packageManager in workspaces (#13150) (`9d94ae5`) - release(turborepo): 2.10.1-canary.3 (#13149) (`0d32225`) - feat: Update add package manager codemod (#13151) (`27ca962`) - feat: Update workspace package manager declarations (#13154) (`f878719`) --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
Building the repo git index joins every normalized git-index path to the repository root before stat comparison. The normal join path cleans every joined path, which adds allocation churn in a hot turbo run planning path.
Using the new heap profiling, turbo run build --dry=json on this repository showed this path accounting for about 9.25 MiB and 18k allocations. Avoiding the normalization step removed about 12 MiB and 55k total allocations from that dry run. Additional local hyperfine runs showed roughly 3-5% improvement.
What
Adds a narrowly named join_unix_path_unchecked helper for already-normalized relative Unix paths and uses it when statting entries from .git/index.
The existing join_unix_path remains the safe/default API for callers that need
.or..normalization.How
Verified with:
Benchmarked locally with release-turborepo binaries using
TURBO_TELEMETRY_DISABLED=1 turbo run build --dry=json.Representative 30-run hyperfine sample: