2009-03-17 6 views
81

A causa di vincoli esterni non posso modificare il segno .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.Come si fa a Git ignorare i file senza usare .gitignore?

risposta

121

Non dimenticare, secondo gitignore, che c'è un ordine di precedenza nelle diverse "Ignora fonti pattern" che Git considerare:

  • Patterns letti dalla riga di comando per i comandi che li supportano.
  • 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 radice) sovrascritti da quelli nei file di livello inferiore fino alla directory che contiene il file.
  • Modelli 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 problema, ma:

  • non vengono replicati per un repository lontana
  • essi possono avere i loro modelli ignorato dalle altre fonti

(Vedi anche questo SO question)


Le altre due soluzioni comportano aggiornamento dell'indice (git update-index):

Tuttavia, quando si verifica un altro ramo o quando si git pull, che "ignora" status potrebbe essere ripristinato. Da qui l'altra opzione:

La differenza tra i due è spiegata in "Git - Difference Between 'assume-unchanged' and 'skip-worktree'".

+0

Puoi usare' update-index --assume-unchanged' @see http://stackoverflow.com/a/25253144/292408 –

+1

@ Elijah Lynn sicuramente. Hai anche 'update-index --skip-work-tree'. Ho modificato la risposta aggiungendo alcuni collegamenti alle mie vecchie risposte che illustrano questi due comandi di 'update-index'. – VonC

+0

Dolce, --skip-work-tree è molto utile, grazie! –

90

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

+0

Sembra che questo è probabilmente la scelta migliore; cerchiamo di escludere i file dal tuo repository locale. – Abizern

+1

Come funziona con i sottomoduli? Non c'è una directory '.git' in un sottomodulo ... – zakdances

+3

@yourfriendzak la cartella' .git' di un sottomodulo è in realtà in parent_repo/.git/modules/submodule_name'. Quindi modificherai 'parent_repo/.git/modules/submodule_name/info/exclude' –

17

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

  • file .gitignore
  • $ GIT_DIR/.git/info/escludere
  • file indicò tramite l'impostazione core.excludesfile

Questi ultimi due punti potrebbero risolvere il tuo problema.

Per ulteriori informazioni, vedere gitignore(5).

0

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

non ignorare più modifiche locali ai file cingolati: 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

Se volete solo avere alcuni file locali in il repository e la posizione della sottodirectory sono flessibili, è possibile inserire i file in tracked_dir1/tracked_dir2/untracked_dir/ e quindi aggiungere un tracked_dir1/tracked_dir2/untracked_dir/.gitignore con contenuti piace:

*

Vale a dire

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