-
Notifications
You must be signed in to change notification settings - Fork 10.5k
feat: handle nested gitignore files #7645
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Summary of Changes
Hello @gsquared94, 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 significantly enhances the GitIgnoreParser to accurately interpret and apply ignore rules from .gitignore files found throughout the project's directory structure, not just the root. This change ensures that the tool's behavior mirrors Git's native handling of ignore patterns, leading to more precise and expected file exclusion across complex repositories.
Highlights
- Nested Gitignore Support: The GitIgnoreParser now correctly processes .gitignore files located in subdirectories, aligning with standard Git behavior.
- Pattern Transformation: Patterns defined in nested .gitignore files are now properly transformed and applied relative to their location within the project structure.
- Precedence Handling: The parser correctly handles pattern precedence, ensuring rules in nested .gitignore files are applied alongside root .gitignore and .git/info/exclude.
- Recursive File Discovery: A new method, findAndLoadGitignoreFiles, has been introduced to recursively scan the project directory for all .gitignore files.
- Enhanced Test Coverage: Comprehensive unit tests have been added to validate the new functionality, including tests for nested patterns and precedence rules.
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 in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.
| 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 issue 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
-
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. ↩
There was a problem hiding this 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 is a significant improvement, adding support for nested .gitignore files, which brings the tool's behavior more in line with standard Git functionality. The recursive approach to finding and parsing .gitignore files, along with the logic to transform patterns relative to their location, is well-implemented. The tests are thorough and cover important cases for nested patterns and precedence rules. I have identified one high-severity issue related to a hardcoded exclusion of node_modules, which should be addressed to ensure the parser's behavior is fully consistent with Git.
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> (cherry picked from commit abddd2b)
TLDR
This PR enhances the GitIgnoreParser to correctly process .gitignore files located in subdirectories. Previously, only the root .gitignore was considered. Now, rules defined in nested .gitignore files are properly applied relative to their location within the project structure.
Dive Deeper
The primary motivation for this change is to align the tool's behavior with standard Git functionality, where .gitignore files can be placed in any directory to specify ignore patterns for that part of the tree.
The key modifications are within packages/core/src/utils/gitIgnoreParser.ts:
A new findAndLoadGitignoreFiles method recursively scans the project directory for .gitignore files.
The logic in loadPatterns has been updated to transform patterns from these nested files. For instance, a pattern like build/ in a .gitignore located at src/component/ will be correctly interpreted to ignore src/component/build/ and not the root build/ directory.
The parser now correctly handles pattern precedence, ensuring that rules in nested .gitignore files are
applied correctly alongside the root .gitignore and .git/info/exclude.
Comprehensive unit tests have been added in packages/core/src/utils/gitIgnoreParser.test.ts to validate the new functionality, including tests for nested patterns and precedence rules.
Reviewer Test Plan
Testing Matrix
Linked issues / bugs
Fixes #3072