Architecture Decision Records - ADR260201f
2026/02/01Bypass delle ignore rules come scelta deliberata
Autore: Marco Orlandin, Architect
Data: 01 Febbraio 2026
Status: Implementato
Progetto: git-side (open-source, sviluppato per Solexma LLC)
Constraint principali: I file side-tracked sono per definizione in .gitignore, nessuna modifica ai file di ignore del repo principale, comportamento prevedibile
Contesto e problema
I file che git-side traccia sono, nella stragrande maggioranza dei casi, esplicitamente ignorati dal repo principale. BACKLOG.md è in .gitignore. La cartella scratch/ è in .gitignore. Le config locali dell'IDE sono nel global gitignore.
Questo crea un paradosso operativo: git-side deve versionare file che Git è stato istruito a ignorare.
Le ignore rules di Git operano su più livelli:
.gitignoredel progetto.gitignorenelle sottodirectory- Global gitignore (
core.excludesFile) - System-wide gitignore
Un git add normale rifiuta di aggiungere file che corrispondono a qualsiasi di queste regole. git-side deve bypassarle tutte.
Requisiti non funzionali
- Aggiungere qualsiasi file al side repo, indipendentemente dalle ignore rules
- Non modificare mai
.gitignoreo il global gitignore - Comportamento deterministico: nessun file rifiutato silenziosamente
- Chiarezza semantica: l'utente deve capire perché il bypass è necessario
Opzioni valutate
Opzione 1: Modificare temporaneamente .gitignore
- Pro: Il
git addstandard funzionerebbe senza flag speciali. - Contro: Modifica un file del repo principale (anche se temporaneamente). Rischio di commit accidentale della modifica. Race condition se l'utente lavora in parallelo. Viola il principio di zero inquinamento.
Opzione 2: Usare un gitignore custom per il side repo
- Pro: Isolamento delle regole.
- Contro: Il side repo con
--work-treenella directory del progetto eredita comunque le ignore rules del progetto. Non risolve il problema.
Opzione 3: Gestire un indice separato senza passare per git add
- Pro: Controllo totale sul contenuto dell'indice.
- Contro: Reimplementazione di logica che Git già gestisce. Complessità sproporzionata. Rischio di bug su edge case (symlink, permessi, encoding).
Opzione 4: git add -f (force)
- Pro: Flag standard Git, documentato, stabile. Bypassa tutte le ignore rules in un colpo. Nessuna modifica ai file di ignore. Semantica chiara.
- Contro: Nessuno significativo nel contesto di git-side. Il flag è pensato esattamente per questo caso d'uso.
Decisione
Scelto git add -f per tutte le operazioni di staging nel side repo.
Motivazioni principali:
- Semanticamente corretto: "ignorato dal repo principale" non significa "non versionabile". Sono due concetti distinti.
- Standard Git:
-fè un flag documentato, stabile, nessun hack. - Zero effetti collaterali: non modifica nessun file di ignore, non cambia il comportamento del repo principale.
- Universale: bypassa tutti i livelli di ignore (progetto, globale, sistema) in un colpo.
Implementazione passo-passo
- Add singolo:
git add -f <path>per file e directory aggiunti esplicitamente congit side add. - Auto sync, pass 1:
git add -f -uper aggiornare file già tracciati (modifiche e cancellazioni). - Auto sync, pass 2:
git add -f <path>per ogni path in.side-tracked, per catturare nuovi file nelle directory tracciate. - Due passaggi separati: La separazione tra update (
-u) e add esplicito è necessaria perché-unon aggiunge nuovi file, egit add -fsenza-unon gestisce le cancellazioni.
Conseguenze osservate
- Nessun file è mai stato rifiutato dal side repo a causa di ignore rules.
- Il two-pass staging (update + add) gestisce correttamente tutti i casi: file nuovi, modificati, cancellati, rinominati.
- L'approccio "directory come container semantico" funziona bene: quando si traccia una directory, tutti i nuovi file al suo interno vengono catturati automaticamente.
- Lezioni apprese:
- La distinzione "ignorato dal repo principale" vs "non versionabile" è fondamentale. Confonderli è un errore di design.
git add -fnon è un workaround, è lo strumento giusto per il lavoro giusto.- Il two-pass staging è un pattern che risolve elegantemente l'asimmetria tra
-u(solo update) e add esplicito (solo nuovi file).
Stack utilizzato
- Linguaggio: Rust (Edition 2024, MSRV 1.85)
- Git:
git add -f,git add -f -u
Quando considerare questo approccio
Se il tuo tool deve versionare file che sono deliberatamente esclusi dal tracking principale:
- File in
.gitignoreche hanno comunque bisogno di storia - Config locali, metadata di progetto, file generati
- Qualsiasi contesto in cui "ignorato" significa "non condiviso", non "non importante"
Il force add è la soluzione standard. Non servono hack o workaround.
Hai un caso simile? Contattami. Valutiamo insieme come gestire i file che cadono fuori dal perimetro del repo principale.