github / github/copilot-cli

Clarify/support .copilotignore semantics in Copilot CLI

Open
#3,785 0 comments 0 reactions 0 assignees View on GitHub
area:configuration area:permissions
Dominant language
Shell
Stars
11.2k
Forks
1.9k
Avg merge
14h 16m
Merged PRs (30d)
6

Description

### Summary

Please clarify and/or support `.copilotignore` semantics in Copilot CLI, especially for nested ignore files.

Related but broader issue: https://github.com/github/copilot-sdk/issues/963 asks for general `.copilotignore` support. This issue is specifically about the expected behavior in Copilot CLI and whether it should match the public VS Code Copilot Chat implementation.

### Existing public reference point

VS Code Copilot Chat has a public `.copilotignore` implementation:

- `COPILOT_IGNORE_FILE_NAME = '.copilotignore'` in `ignoreServiceImpl.ts`:
https://github.com/microsoft/vscode-copilot-chat/blob/main/src/platform/ignore/node/ignoreServiceImpl.ts#L23
- `IgnoreFile` uses the `ignore` npm package and `@humanwhocodes/gitignore-to-minimatch`, making the syntax intentionally gitignore-like:
https://github.com/microsoft/vscode-copilot-chat/blob/main/src/platform/ignore/node/ignoreFile.ts

The VS Code implementation appears to:

1. Track multiple `.copilotignore` files in a workspace.
2. Scope each ignore file to its own directory/subtree.
3. Sort ignore files deepest-first.
4. For a target path, check the deepest applicable ignore file first and stop when that file produces either an ignored or unignored result.

That is similar to gitignore-style scoped files, but it is not obviously the same as Git's full cascading merge semantics. It is closer to "nearest/deepest applicable `.copilotignore` wins when it has a matching ignore/unignore rule; otherwise broader files may still be checked."

### Problem

For Copilot CLI, the behavior is unclear:

- Does Copilot CLI support `.copilotignore` files at all, or only managed organization/repository content-exclusion policies?
- If `.copilotignore` is supported, should it match the VS Code Copilot Chat implementation linked above?
- Are multiple nested `.copilotignore` files discovered?
- Is each file scoped to its directory/subtree?
- Are patterns relative to the ignore file location or the repository/workspace root?
- How do negation patterns (`!foo`) interact across parent/child ignore files?
- Does the same exclusion decision apply consistently to file discovery, `@` file mentions, read/search tools, context loading, and edit targets?

This matters because users may assume `.copilotignore` behaves like `.gitignore`, place scoped files in nested directories, and then accidentally expose or allow edits to content they expected Copilot to ignore.

### Desired outcome

Please either:

1. Document that Copilot CLI supports `.copilotignore` and define its nested-file semantics, ideally aligning with VS Code Copilot Chat where possible; or
2. Document that Copilot CLI does not support `.copilotignore` and users should use managed content-exclusion policies instead; or
3. Add support/parity with VS Code Copilot Chat's public `.copilotignore` behavior.

### Environment

Observed while investigating Copilot CLI 1.0.61 behavior.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.