Adding .env to .gitignore does not stop Git tracking a file already in its index. In our disposable test repository, the file still appeared in a diff after the ignore rule was added. Removing it from the index left both the local file and an older committed copy intact.
That matters when you ask a coding assistant to “fix the secrets in this repo.” There are several separate jobs hidden in that request. A successful ignore-pattern check does not prove a file is untracked, absent from history, inaccessible to a local process, or safe to distribute.
This guide is for a developer or small team reviewing environment-file handling before adopting a shared secrets workflow. The experiment uses invented strings only. It does not test Claude Code permissions, a live credential, or a paid secrets product.
Start with the question Git can actually answer
The Git ignore manual documents the boundary: ignore rules concern intentionally untracked files; files already tracked are unaffected. Our test makes that distinction observable without opening a real environment file.
From the repository root, these commands inspect one named path:
git ls-files -- .env
git check-ignore -v -- .env
git check-ignore --no-index -v -- .env
git diff --name-only -- .env
ls-files answers whether the path is in the index. The two check-ignore calls are deliberately different: the command documentation says tracked paths are normally omitted, while --no-index ignores the index when evaluating patterns. A matching rule in that second result is not evidence that Git has stopped tracking the file.
For this single-path example, exit status 1 from check-ignore means no ignored match was reported; it is not by itself a broken-command diagnosis. Inspect errors separately. A negated rule can also appear in verbose output: read the pattern, not just the presence of output. The fixture below uses only two positive patterns to keep its result unambiguous.
These commands show paths and ignore rules rather than file contents. Filenames themselves may still be sensitive, so review output locally before sharing it. This is a named-path check, not a complete repository secret scanner.
Seven observations from a disposable repository
We ran the downloadable experiment on October 25, 2026, with Git 2.50.1 (Apple Git-155) and Python 3.14.3 on macOS. It creates a temporary repository, commits a dummy .env, and changes only that fixture. There is no remote, network request, credential store, or real project data.
| Fixture step | Observed result | What it does not prove |
|---|---|---|
Add .env to ignore rules after committing it | .env remains indexed | That the rule is misspelled |
Compare normal and --no-index ignore checks | Normal check omits the tracked path; --no-index matches | That a pattern match removed the file |
| Edit the tracked dummy file | Its path still appears in the diff | That its contents are safe |
Create an untracked .env.local with a matching rule | The file is ignored and not indexed | That another process cannot read it |
Remove .env from the index | The local file remains readable | That a local tool is denied access |
| Commit the untracking change | The previous commit still contains the dummy path | That old copies were erased |
| Force-add the ignored path in the fixture | The path is indexed again | That ignore rules enforce an access policy |
All seven expected outcomes passed. The local-read observation is a Python file read under the same OS account, not a test of any AI product’s automatic context loading or permission settings. The history observation checks an older blob’s existence without printing its contents.
Reproduce without touching your project
Download check_boundaries.py and run it with Python 3 and Git available:
python3 check_boundaries.py
The script creates and cleans up its own temporary directory. It prints version information and seven boolean results. It does not accept a repository path or read your .env. It disables global/system Git configuration and hooks inside the isolated fixture commands to keep personal settings from affecting the experiment; that is not a recommendation to bypass hooks in your project. No dependencies are installed.
The expected summary is "passed": 7. The recorded result identifies the tested platform. Windows, Linux, other Git releases, unusual path encodings, submodules and complex nested ignore rules were not tested here.
Give your coding assistant a bounded inspection task
A rule file can state what a reviewer should inspect before proposing changes. It is an instruction, not an OS access-control mechanism. This block can be adapted for an AGENTS.md workflow:
When investigating a potentially tracked environment file:
- Work on an explicitly named path from the repository root.
- Inspect index membership and matching ignore rules separately.
- Do not print file contents, credential values, or historical blobs.
- Report current index state separately from historical presence.
- Do not stage, untrack, delete, force-add, rewrite history, or push.
- Propose the narrow change and its effect on collaborators first.
- If real exposure is suspected, stop and identify the credential owner.
Our rules gallery contains other instruction-file examples. None of those instructions replaces the tool permissions and filesystem controls applicable to your environment.
In the fixture, we used git rm --cached -- .env to observe untracking. Do not copy that action indiscriminately into a shared project: it stages a removal from the repository snapshot while retaining the file in the current working directory. Review the intended shared-file change and deployment dependencies first. A broad cache reset is unnecessary for diagnosing one path.
For actual credential exposure, an ignore change is not the incident response. GitHub’s removal guidance puts revocation or rotation first and explains the coordination and side effects of history rewriting. Our experiment does not perform either operation, inspect hosted copies, or establish that an exposed key is no longer usable.
Free Git checks or a paid secrets workflow?
Free tools are sufficient for the problem tested here. You do not need a subscription to identify a tracked path, evaluate its ignore pattern, or reproduce the seven outcomes. Fixing a Git index mistake is not a reason on its own to buy a vault.
A different requirement can justify evaluating a managed service: several people or jobs need maintained access to shared project secrets, and the team wants a managed way to distribute them at runtime instead of copying plaintext configuration between machines. State that requirement separately from Git cleanup.
For example, 1Password’s runtime-environment documentation describes supplying secrets to a subprocess at runtime, and its secret-reference documentation describes references that can replace plaintext values in configuration. These are documented capabilities, not capabilities we tested against an account. An authorized subprocess still receives its values; choosing that workflow does not establish that every child tool is safe to receive them.
Before purchasing, verify the plan and workflow against your team’s actual requirements: who can retrieve each secret, how retained clients recover after rotation, and who owns the target-service credentials. Our offboarding buying checklist tests why removing a shared source does not revoke a previously copied value. This article tests a different boundary: Git’s index and history.
If shared runtime delivery is a requirement you actually have, you can evaluate 1Password through our existing partner link. Disclosure: this is an affiliate link; we may earn a commission. No purchase is needed for the downloadable test. A purchase does not remove old commits, revoke exposed provider credentials, or establish an AI tool’s file-access policy.
We have not measured buyer willingness, time saved, or conversion outcomes for this workflow. Use the experiment to distinguish the problem you have before choosing a tool.