mirror of
https://github.com/ohmyzsh/ohmyzsh.git
synced 2025-12-12 15:34:50 +08:00
Problem: In worktrees, enabling reftable caused the gitfast prompt to sometimes show “.invalid” for the branch name, e.g. `git:(.invalid|SPARSE)`. The cause was gitfast’s __git_ps1 reading $GIT_DIR/HEAD (and sequencer head-name files) directly and attempting to derive the ref name by string slicing. That approach is brittle with worktrees and newer ref backends like reftable. What changed: - Prefer `git symbolic-ref --short HEAD` to resolve the branch name. - Also use `--short` when HEAD is a symlink. - Keep existing fallbacks (describe/detached SHA) unchanged. Why this is correct: - Delegates ref resolution to Git’s ref API, which understands: - multiple worktrees (`.git/worktrees/<name>/HEAD`) - all ref storage backends (loose, packed, reftable) - edge cases around in-progress operations and symlinks - Avoids parsing internal files that can legitimately be non-canonical or transient (e.g., head-name during rebase, or placeholders that appear as “.invalid” with reftable+worktrees). Impact: - Correct branch names in worktrees regardless of ref backend (fixes “.invalid”). - Detached HEAD behavior remains: still falls back to describe/short SHA. - `|SPARSE` logic unchanged and still driven by `core.sparseCheckout`. - Backwards-compatible: older Git that supports `symbolic-ref --short` works; fallbacks still apply if not a branch. Rationale: Ref backends like reftable decouple refs from the filesystem layout that gitfast was implicitly depending on. Using Git’s plumbing for branch resolution is the robust, future-proof approach. |
||
|---|---|---|
| .. | ||
| _git | ||
| git-completion.bash | ||
| git-prompt.sh | ||
| gitfast.plugin.zsh | ||
| MANUAL.adoc | ||
| README.md | ||
Gitfast plugin
This plugin adds completion for Git, using the zsh completion from git.git folks, which is much faster than the official one from zsh. A lot of zsh-specific features are not supported, like descriptions for every argument, but everything the bash completion has, this one does too (as it is using it behind the scenes). Not only is it faster, it should be more robust, and updated regularly to the latest git upstream version.
To use it, add gitfast to the plugins array in your zshrc file:
plugins=(... gitfast)