Come fai in modo che Git ignori i file senza usare .gitignore?


133

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

Risposte:


179

Non dimenticare, secondo gitignore , che esiste un ordine di precedenza nelle diverse "fonti di pattern ignorate" che Git considera:

  • I pattern vengono 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 i pattern nei file di livello superiore (fino alla radice) che vengono sovrascritti da quelli nei file di livello inferiore fino alla directory contenente 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 al tuo problema ma:

  • non vengono 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):

Tuttavia, quando si esegue il checkout di un altro ramo o quando l'utente git pull, quello stato "ignora" potrebbe essere ripristinato. Da qui l'altra opzione:

La differenza tra i due è spiegata in " Git - Differenza tra ' assume-unchanged' e ' skip-worktree' ".


È possibile utilizzare update-index --assume-unchanged@see stackoverflow.com/a/25253144/292408
Elia Lynn

1
@ElijahLynn sicuro. Anche tu update-index --skip-work-tree. Ho modificato la risposta per aggiungere alcuni collegamenti alle mie vecchie risposte che illustrano quei due update-indexcomandi.
VonC,

141

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


Sembra che questa sia probabilmente la soluzione migliore; escludiamo i file dal tuo repository locale.
Abizern

1
Come funziona con i sottomoduli? Non c'è .gitdirectory in un sottomodulo ...
zakdances,

10
@yourfriendzak la .gitcartella di un sottomodulo si trova in realtà parent_repo/.git/modules/submodule_name. Quindi modificherestiparent_repo/.git/modules/submodule_name/info/exclude
Kara Brightwell il

25

Esistono tre modi per dire a GIT quali file ignorare:

  • .gitignore File
  • $GIT_DIR/.git/info/exclude
  • File indicati tramite l' core.excludesfileimpostazione

Gli ultimi due punti potrebbero risolvere il tuo problema.

Per ulteriori informazioni, consultare gitignore (5) .


5

Se vuoi solo avere alcuni file locali nel repository e la posizione della sottodirectory è flessibile, puoi inserire i tuoi file tracked_dir1/tracked_dir2/untracked_dir/e quindi aggiungere un tracked_dir1/tracked_dir2/untracked_dir/.gitignorecon contenuti come:

*

ie

$ cat > tracked_dir1/tracked_dir2/untracked_dir/.gitignore
*
<Ctrl+D>

4

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

Non riesco a modificare il .gitignore del mio repository.

Immagino che ciò che intendi è che non puoi inviare alcuna modifica .gitignoreall'origine. In tal caso, è possibile aggiungere il file non monitorato al proprio locale .gitignore, quindi fare in git update-index --assume-unchanged .gitignoremodo che la modifica a .gitignorenon venga mai inviata. Ora stai ignorando il file (forse) non tracciato e non influendo sul .gitignorefile remoto .


3

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

Annulla le modifiche locali ai file monitorati: 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 e.g. when merging in a commit; thus, in case the assumed-untracked file is
           changed upstream, you will need to handle the situation manually.


1

Un altro modo:

  • modifica locale .gitignore
  • poi git update-index --assume-unchanged .gitignore
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.