Skip to content

fix(cli): resolve reference ambiguity during extension checkout#28422

Open
DavidAPierce wants to merge 2 commits into
mainfrom
fix/resolve-refname-ambiguity
Open

fix(cli): resolve reference ambiguity during extension checkout#28422
DavidAPierce wants to merge 2 commits into
mainfrom
fix/resolve-refname-ambiguity

Conversation

@DavidAPierce

Copy link
Copy Markdown
Contributor

Summary

Improve the robustness of the extension clone and checkout implementation by resolving references to their concrete commit SHAs and verifying checkout integrity.

Details

During extension installation or update from a Git repository, the CLI clones the source and fetches the requested reference, which writes the target commit SHA to the .git/FETCH_HEAD pseudo-ref. Previously, the code performed git checkout FETCH_HEAD.

However, if a repository's default branch is literally named FETCH_HEAD, Git's reference resolution during a checkout command prioritizes the local branch over the pseudo-ref. This can cause the checkout to stay on the local branch instead of switching to the fetched commit.

This PR refactors the checkout process to resolve the reference name unambiguously:

  • Resolves the target pseudo-ref (FETCH_HEAD) to its absolute, unambiguous commit SHA using git rev-parse FETCH_HEAD (as rev-parse prioritizes the .git/ pseudo-refs).
  • Performs the checkout directly using the absolute commit SHA (e.g., git checkout <sha>), forcing an unambiguous detached HEAD state on the correct target commit.
  • Asserts that the checked-out commit SHA (git rev-parse HEAD) matches the resolved target SHA to ensure checkout integrity.
  • Adds an explicit SHA verification check: if a full 40-character (SHA-1) or 64-character (SHA-256) commit pin was requested, the checked-out commit SHA is verified to match the requested pin. This avoids false positives with short named branches or tags (e.g. ticket numbers) consisting entirely of hex characters.

Related Issues

None.

How to Validate

Run the unit tests targeting the modified git extension code:

npx vitest run packages/cli/src/config/extensions/github.test.ts

Verify build and lint compliance:

npm run typecheck -w @google/gemini-cli
npm run lint -w @google/gemini-cli

Pre-Merge Checklist

  • Updated relevant documentation and README (if needed)
  • Added/updated tests (if needed)
  • Noted breaking changes (if any)
  • Validated on required platforms/methods:
    • MacOS
    • Windows
    • Linux
      • npm run

@DavidAPierce
DavidAPierce requested a review from a team as a code owner July 16, 2026 18:57
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request improves the reliability and security of the Git extension checkout process in the CLI. By resolving references to their concrete commit SHAs and adding integrity checks, it mitigates potential issues where Git might incorrectly prioritize local branches over fetched content and ensures that pinned dependencies are correctly verified.

Highlights

  • Ambiguity Resolution: Refactored the checkout process to resolve FETCH_HEAD to an absolute commit SHA before checking out, preventing conflicts with local branches named 'FETCH_HEAD'.
  • Integrity Verification: Added a post-checkout verification step to ensure the checked-out HEAD matches the intended target SHA.
  • Security Pinning: Implemented strict SHA validation for pinned references to ensure the checked-out commit matches the requested SHA-1 or SHA-256 hash.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize the Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counterproductive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@github-actions github-actions Bot added the size/m A medium sized PR label Jul 16, 2026
@github-actions

github-actions Bot commented Jul 16, 2026

Copy link
Copy Markdown

📊 PR Size: size/M

  • Lines changed: 128
  • Additions: +124
  • Deletions: -4
  • Files changed: 3

@github-actions

github-actions Bot commented Jul 16, 2026

Copy link
Copy Markdown

Size Change: +765 B (0%)

Total Size: 35.2 MB

Filename Size Change
./bundle/chunk-2CR4ALHT.js 0 B -3.65 MB (removed) 🏆
./bundle/chunk-5K34CUKS.js 0 B -661 kB (removed) 🏆
./bundle/chunk-FBDZTTJI.js 0 B -16.6 MB (removed) 🏆
./bundle/chunk-FFUAVEJO.js 0 B -13 kB (removed) 🏆
./bundle/chunk-HSFOXIN5.js 0 B -3.77 kB (removed) 🏆
./bundle/chunk-O7LG3GTU.js 0 B -49.2 kB (removed) 🏆
./bundle/chunk-UI634AYR.js 0 B -3.43 kB (removed) 🏆
./bundle/chunk-XUELCTRA.js 0 B -19.5 kB (removed) 🏆
./bundle/core-IEGI5I2Y.js 0 B -50.1 kB (removed) 🏆
./bundle/devtoolsService-LAART3ZC.js 0 B -147 kB (removed) 🏆
./bundle/gemini-3S53KI7O.js 0 B -590 kB (removed) 🏆
./bundle/interactiveCli-UGGXXMLG.js 0 B -1.3 MB (removed) 🏆
./bundle/liteRtServerManager-TJ662M6F.js 0 B -2.08 kB (removed) 🏆
./bundle/oauth2-provider-DE3LISGA.js 0 B -9.12 kB (removed) 🏆
./bundle/chunk-2QFCE64V.js 3.77 kB +3.77 kB (new file) 🆕
./bundle/chunk-6BEV4RLF.js 3.65 MB +3.65 MB (new file) 🆕
./bundle/chunk-IG7LX7RE.js 13 kB +13 kB (new file) 🆕
./bundle/chunk-KDFT75PF.js 661 kB +661 kB (new file) 🆕
./bundle/chunk-PF4RX5RH.js 49.2 kB +49.2 kB (new file) 🆕
./bundle/chunk-QEDRRKRU.js 3.43 kB +3.43 kB (new file) 🆕
./bundle/chunk-UXGNUCUV.js 16.6 MB +16.6 MB (new file) 🆕
./bundle/chunk-VRKSC6WN.js 19.5 kB +19.5 kB (new file) 🆕
./bundle/core-JI6KVU6U.js 50.1 kB +50.1 kB (new file) 🆕
./bundle/devtoolsService-HK3IB5IT.js 147 kB +147 kB (new file) 🆕
./bundle/gemini-MWVI2WOC.js 590 kB +590 kB (new file) 🆕
./bundle/interactiveCli-YYCE5QG2.js 1.3 MB +1.3 MB (new file) 🆕
./bundle/liteRtServerManager-JJSSTNUB.js 2.08 kB +2.08 kB (new file) 🆕
./bundle/oauth2-provider-D4LRMCIW.js 9.12 kB +9.12 kB (new file) 🆕
ℹ️ View Unchanged
Filename Size Change
./bundle/bundled/third_party/index.js 8 MB 0 B
./bundle/chunk-34MYV7JD.js 2.45 kB 0 B
./bundle/chunk-5AUYMPVF.js 858 B 0 B
./bundle/chunk-5PS3AYFU.js 1.18 kB 0 B
./bundle/chunk-664ZODQF.js 124 kB 0 B
./bundle/chunk-DAHVX5MI.js 206 kB 0 B
./bundle/chunk-IUUIT4SU.js 56.5 kB 0 B
./bundle/chunk-L5V3KIDT.js 1.62 kB 0 B
./bundle/chunk-TUDYL3X4.js 40.3 kB 0 B
./bundle/cleanup-7EJ6TGXS.js 0 B -902 B (removed) 🏆
./bundle/devtools-TYCPOPV3.js 683 kB 0 B
./bundle/events-XB7DADIJ.js 418 B 0 B
./bundle/examples/hooks/scripts/on-start.js 188 B 0 B
./bundle/examples/mcp-server/example.js 1.43 kB 0 B
./bundle/gemini.js 5.38 kB 0 B
./bundle/getMachineId-bsd-TXG52NKR.js 1.55 kB 0 B
./bundle/getMachineId-darwin-7OE4DDZ6.js 1.55 kB 0 B
./bundle/getMachineId-linux-SHIFKOOX.js 1.34 kB 0 B
./bundle/getMachineId-unsupported-5U5DOEYY.js 1.06 kB 0 B
./bundle/getMachineId-win-6KLLGOI4.js 1.72 kB 0 B
./bundle/https-proxy-agent-AVGR4LHR.js 490 B 0 B
./bundle/multipart-parser-E7RMVJWU.js 11.7 kB 0 B
./bundle/multipart-parser-KPBZEGQU.js 11.7 kB 0 B
./bundle/sandbox-macos-permissive-open.sb 827 B 0 B
./bundle/sandbox-macos-permissive-proxied.sb 1.25 kB 0 B
./bundle/sandbox-macos-restrictive-open.sb 3.3 kB 0 B
./bundle/sandbox-macos-restrictive-proxied.sb 3.5 kB 0 B
./bundle/sandbox-macos-strict-open.sb 4.75 kB 0 B
./bundle/sandbox-macos-strict-proxied.sb 4.96 kB 0 B
./bundle/src-65GKNWUJ.js 45.4 kB 0 B
./bundle/src-U45KTUYT.js 45.7 kB 0 B
./bundle/src-XZYPU6PJ.js 352 kB 0 B
./bundle/start-S77PF3DB.js 0 B -622 B (removed) 🏆
./bundle/tree-sitter-7U6MW5PS.js 274 kB 0 B
./bundle/tree-sitter-bash-34ZGLXVX.js 1.84 MB 0 B
./bundle/worker/worker-entry.js 363 kB 0 B
./bundle/cleanup-3QDMSZSQ.js 902 B +902 B (new file) 🆕
./bundle/start-OVLQE57Z.js 622 B +622 B (new file) 🆕

compressed-size-action

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request enhances the security of the Git repository cloning process by resolving the target SHA before checkout and verifying that the checked-out commit matches the expected target SHA and any pinned reference. The reviewer suggested using strict inequality instead of 'startsWith' for the SHA verification to ensure exact matching, which I agree is a more robust approach.

Note: Security Review is unavailable for this PR.

Comment thread packages/cli/src/config/extensions/github.ts Outdated
@gemini-cli gemini-cli Bot added the status/need-issue Pull requests that need to have an associated issue. label Jul 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/m A medium sized PR status/need-issue Pull requests that need to have an associated issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants