Skip to content

[change_lister] Unshallow fetch to fix git merge-base in shallow clones#457

Merged
andrew-anyscale merged 1 commit intomainfrom
andrew/revup/main/fix-shallow
Mar 14, 2026
Merged

[change_lister] Unshallow fetch to fix git merge-base in shallow clones#457
andrew-anyscale merged 1 commit intomainfrom
andrew/revup/main/fix-shallow

Conversation

@andrew-anyscale
Copy link
Contributor

@andrew-anyscale andrew-anyscale commented Mar 13, 2026

In CI environments like Buildkite, repos are cloned with --depth=1 and
PR heads are fetched with --depth=1, leaving both the master tip and PR
commit as grafted roots with no shared history. This causes
git merge-base origin/master to fail with exit status 1.

Fix by checking git rev-parse --is-shallow-repository before fetching.
If shallow, use --unshallow to fetch the full base branch history so
merge-base can find the common ancestor. This avoids masking unrelated
errors (network, permissions) that would previously be swallowed by the
fallback.

Add TestListChangedFiles_ShallowClone to reproduce the failure and
verify the fix.

Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
Topic: fix-shallow
Signed-off-by: andrew andrew@anyscale.com

@andrew-anyscale
Copy link
Contributor Author

Reviews in this chain:
#457 [change_lister] Unshallow fetch to fix git merge-base in shallow clones

@andrew-anyscale
Copy link
Contributor Author

andrew-anyscale commented Mar 13, 2026

# head base diff date summary
0 346a6dbd d036417e diff Mar 13 11:47 AM 2 files changed, 48 insertions(+), 3 deletions(-)
1 21ac8247 d036417e diff Mar 13 11:57 AM 1 file changed, 8 insertions(+), 4 deletions(-)

@gemini-code-assist
Copy link
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 resolves an issue where git merge-base commands fail in shallow Git clones, a common scenario in CI environments like Buildkite. The changes ensure that the Git history is sufficiently deep to find a common ancestor by attempting an unshallow fetch, thereby preventing errors and improving the reliability of change detection.

Highlights

  • Git Fetch Logic: Modified the ListChangedFiles function to first attempt a git fetch --unshallow for the base branch to ensure a complete history for git merge-base operations.
  • Shallow Clone Handling: Implemented a fallback mechanism where if git fetch --unshallow fails (e.g., in a complete repository), a standard git fetch is performed instead.
  • Test Coverage: Added TestListChangedFiles_ShallowClone to reproduce and verify the fix for git merge-base failures in shallow clone environments, simulating CI setups like Buildkite.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • raycicmd/change_lister.go
    • Modified the ListChangedFiles function to include an --unshallow option in the initial git fetch command for the base branch.
    • Added error handling to fall back to a regular git fetch if the unshallow operation is not applicable or fails.
  • raycicmd/change_lister_test.go
    • Introduced TestListChangedFiles_ShallowClone, a new test case that simulates a shallow Git clone environment.
    • The test verifies that ListChangedFiles correctly identifies changed files even when the repository is shallowly cloned and the base branch is fetched shallowly.
Activity
  • No specific activity (comments, reviews, or progress updates) has been recorded for this pull request yet.
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 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 counter productive. 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.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

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.

Copy link
Contributor

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

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 addresses an issue with git merge-base failing in shallow clones, which is common in CI environments. The fix involves unshallowing the repository before trying to find the merge-base. The change is well-supported by a new test case that accurately reproduces the problem and verifies the solution.

My main feedback is a suggestion to improve the robustness of the implementation in raycicmd/change_lister.go. Instead of relying on error-based fallback, I recommend explicitly checking if the repository is shallow first. This will make the logic clearer and the error handling more precise.

Overall, this is a valuable fix for a real-world CI problem.

In CI environments like Buildkite, repos are cloned with --depth=1 and
PR heads are fetched with --depth=1, leaving both the master tip and PR
commit as grafted roots with no shared history. This causes
git merge-base origin/master <commit> to fail with exit status 1.

Fix by checking git rev-parse --is-shallow-repository before fetching.
If shallow, use --unshallow to fetch the full base branch history so
merge-base can find the common ancestor. This avoids masking unrelated
errors (network, permissions) that would previously be swallowed by the
fallback.

Add TestListChangedFiles_ShallowClone to reproduce the failure and
verify the fix.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Topic: fix-shallow
Signed-off-by: andrew <andrew@anyscale.com>
@andrew-anyscale andrew-anyscale force-pushed the andrew/revup/main/fix-shallow branch from 346a6db to 21ac824 Compare March 13, 2026 18:57
@andrew-anyscale andrew-anyscale merged commit e466401 into main Mar 14, 2026
3 checks passed
@andrew-anyscale andrew-anyscale deleted the andrew/revup/main/fix-shallow branch March 14, 2026 00:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants