Come fai a Git ignorare i file senza usare .gitignore?

A causa di strani vincoli esterni non posso modificare il .gitignore del mio repository. C’è un modo per ignorare file e directory diversi dalla modifica di .gitignore? Anche se si tratta di una soluzione globale come una configurazione globale che verrà applicata a tutti i miei repository.

Non dimenticare, secondo Gitignore , che esiste un ordine di precedenza nelle diverse “fonti di pattern ignoranti ” che Git considera:

  • Pattern letti dalla riga di comando per quei comandi che li supportano.
  • I pattern letti da un file .gitignore nella stessa directory del percorso o in qualsiasi directory padre, con pattern nei file di livello superiore (fino alla root) vengono sovrascritti da quelli nei file di livello inferiore fino alla directory che contiene il file.
  • Pattern letti da $GIT_DIR/info/exclude .
  • Pattern letti dal file specificato dalla variabile di configurazione core.excludesfile .

Gli ultimi due possono essere una soluzione per il tuo problema ma:

  • non sono replicati per un repository distante
  • possono avere i loro schemi sovrascritti dalle altre fonti

(Vedi anche questa domanda SO )


Le altre due soluzioni prevedono l’aggiornamento dell’indice ( git update-index ):

  • git update-index --assume-unchanged : vedi ” Git: non traccia un file solo nel repository locale e tienilo nel repository remoto “.
    È menzionato da Elijah Lynn nei commenti .
    • Puoi anche ignorare il contenuto di una cartella: ” git update-index --assume-unchanged on directory “.
    • Usa – --no-assume-unchange per invertire l’effetto: vedi ” È ansible git add un file attualmente protetto da assume-unchanged ? “.

Tuttavia, quando si esegue il checkout di un altro ramo o quando si git pull , lo stato di “ignora” potrebbe essere ripristinato. Quindi l’altra opzione:

  • git update-index --skip-worktree ; vedere:
    • ” Ignora le mie modifiche nei file ma non cancellarle dal rep remoto ” e
    • Msgstr ” Mantieni git – file non modificati – tra i checkout delle filiali “.

La differenza tra i due è spiegata in ” Git – Difference Between” assume-unchanged “e” skip-worktree ” “.

Se puoi modificare .git/info/exclude puoi mettere le stesse regole lì. Ma quel file è solo nel repository locale.

Ci sono tre modi per dire a GIT quali file ignorare:

  • .gitignore di file
  • $ GIT_DIR / .git / info / escludere
  • File puntati tramite l’impostazione core.excludesfile

Gli ultimi due punti potrebbero risolvere il tuo problema.

Per ulteriori informazioni, consultare gitignore (5) .

Se vuoi semplicemente avere alcuni file locali nel repository e la posizione della sottodirectory è flessibile, puoi mettere i tuoi file in tracked_dir1/tracked_dir2/untracked_dir/ e quindi aggiungere un tracked_dir1/tracked_dir2/untracked_dir/.gitignore con contenuti come:

*

ie

 $ cat > tracked_dir1/tracked_dir2/untracked_dir/.gitignore *  

Ignora le modifiche locali ai file tracciati: git update-index --assume-unchanged my-file.php

Annulla le modifiche locali ai file tracciati: git update-index --no-assume-unchanged my-file.php

fonte: git help update-index

 --[no-]assume-unchanged ... This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked files (akin to what .gitignore does for untracked files). Git will fail (gracefully) in case it needs to modify this file in the index eg when merging in a commit; thus, in case the assumed-untracked file is changed upstream, you will need to handle the situation manually. 

Puoi utilizzare il metodo gitignore globale invece di modificare quello del progetto https://help.github.com/articles/ignoring-files/#create-a-global-gitignore

Sono stato in situazioni simili, quindi sto aggiungendo la mia soluzione preferita che non vedo menzionata. Il problema con git update-index --assume-unchanged in questo caso è che non puoi farlo per un file non tracciato. Tu hai detto

Non riesco a modificare il .gitignore del mio repository.

Immaginerò cosa intendi dire che non puoi apportare alcuna modifica a .gitignore all’origine. In questo caso, ciò che puoi fare è aggiungere il file non tracciato al tuo .gitignore locale, quindi fare git update-index --assume-unchanged .gitignore modo che la tua modifica a .gitignore non venga mai eseguita. Ora stai ignorando il file (probabilmente) non tracciato e non influendo sul file .gitignore remoto.