Gitignore vzor bez kotvy skryje zdrojové soubory — testy projdou, commit je neúplný
import { Aside } from ‘@astrojs/starlight/components’;
Symptom
Sekce “Symptom”Nezávislá kontrola kódu tvrdí, že oprava „není v commitu” — přitom lokálně soubor prokazatelně existuje, obsahuje správný kód a celá testovací suita prochází. git status je čistý, takže nic nenaznačuje problém. git ls-tree <sha> ale adresář se souborem vůbec neobsahuje a git diff --name-only ho nikdy neukázal.
Root cause
Sekce “Root cause”.gitignore obsahoval „pojistku” na uživatelské uploady:
# User uploads — nikdy do gituuploads/Holý vzor uploads/ (bez úvodního /) matchuje kterýkoli adresář uploads v celé hierarchii repa — tedy nejen datový adresář v rootu, ale i zdrojové adresáře typu src/app/api/uploads/, src/components/uploads/, src/lib/uploads/. Nové zdrojové soubory v těchto cestách git tiše ignoroval:
git add -Aje nepřidal a nic nehlásil,git statusje nezobrazoval (ignorované soubory se neukazují),- lokální testy běžely nad working tree, takže procházely,
- runtime na serveru fungoval, protože deploy kopíroval working tree (rsync), ne git checkout — takže rozpor se roky neprojevil.
Odhalilo to až statické porovnání commitu s tvrzením reportu při nezávislém auditu.
Fix
Sekce “Fix”- Kotva na root — vzor matchuje jen datový adresář:
/uploads//data/uploads/- Dohledat všechny dosud skryté zdrojáky a přidat je:
git status --ignored --porcelain src/ tests/ | grep '^!!'git add <nalezené zdrojové cesty>- Důkazní běhy testů od té doby výhradně z čistého checkoutu přesného SHA (
git worktree add --detach <dir> <sha>+npm ci), nikdy z working tree.
Prevence
Sekce “Prevence”- Periodicky (nebo v CI) kontrolovat
git status --ignored src/— v ignorovaných cestách nesmí být nic zdrojového. - Evidence/CI běhy z čistého checkoutu SHA — jediný způsob, jak dokázat, že „testy prošly” platí pro commit, ne pro working tree.
- Pozor na kombinaci s deployem přes rsync working tree: maskuje problém, protože produkce dostane i netrackované soubory.