Come configuro git per ignorare alcuni file localmente?


1351

Posso ignorare i file localmente senza inquinare la configurazione globale di git per tutti gli altri? Ho file non tracciati che sono spam nel mio stato git ma non voglio impegnare le modifiche di configurazione git per ogni singolo piccolo file casuale non tracciato che ho nelle mie filiali locali.

Risposte:


1864

Dalla relativa documentazione Git :

I pattern che sono specifici di un determinato repository ma che non devono essere condivisi con altri repository correlati (ad es. File ausiliari che vivono all'interno del repository ma che sono specifici del flusso di lavoro di un utente) dovrebbero andare nel $GIT_DIR/info/excludefile.

Il .git/info/excludefile ha lo stesso formato di qualsiasi .gitignorefile. Un'altra opzione è quella di impostare core.excludesFileil nome di un file contenente schemi globali.

Nota, se hai già modifiche non messe in scena devi eseguire quanto segue dopo aver modificato i tuoi pattern di ignore:

git update-index --assume-unchanged <file-list>

Nota su$GIT_DIR : questa è una notazione usata in tutto il manuale di git semplicemente per indicare il percorso al repository git. Se la variabile di ambiente è impostata, sostituirà la posizione di qualsiasi repository in cui ci si trova, che probabilmente non è quello che si desidera.


Modifica : un altro modo è usare:

git update-index --skip-worktree <file-list>

Invertire di:

git update-index --no-skip-worktree <file-list>

204
Come nota, assicurati di eseguire git update-index --assume-unchanged [<file>...]dopo aver effettuato l'aggiunta al file di esclusione. Le modifiche non verranno raccolte fino ad allora.
tollmanz,

30
Non avevo bisogno di eseguire 'git update-index ...' per rendere effettive le modifiche usando git 1.7.9.5.
Jeffrey Martinez,

39
Devi solo usare git update-index se hai già apportato una modifica al file e ora vuoi che venga ignorato. Se si modifica exclude prima di apportare la modifica, non è necessario.
Brady Emerson,

13
Mentre questo impedisce al file di apparire come modificato durante commit come .gitignore, a differenza dei file ignorati, i file verranno comunque ripristinati alla versione repository se si esegue git reset --hard.
Brady Emerson,

19
Per stackoverflow.com/questions/23097368/… e stackoverflow.com/questions/13630849/… , skip-worktreesarebbe probabilmente preferito assume-unchanged.
dan Shumway,

436

Aggiornamento : considera git update-index --skip-worktree [<file>...]invece l' utilizzo , grazie @danShumway! Vedi la spiegazione di Borealid sulla differenza tra le due opzioni .


Vecchia risposta:

Se devi ignorare le modifiche locali ai file tracciati (lo abbiamo con modifiche locali per configurare i file), usa git update-index --assume-unchanged [<file>...].


8
Solo per notare, ho aggiunto un file a $ GIT_DIR / info / exclude (ad esempio, my-file.php) e poi ho dovuto correre git update-index --assume-unchanged my-file.phpper farlo ignorare. Grazie per il consiglio!
tollmanz,

78
Per annullarlo: git update-index --no-assume-unchanged my-file.php
Ray

18
Solo per chiarimenti: supponiamo che invariato sia per i file tracciati (esistono nel repository) ... OP stava chiedendo i file UNtracked, nel qual caso .git/info/excludeè quello che vuoi (per evitare di inquinare i file .gitignore spesso condivisi e tracciati)
dyodji

7
Secondo stackoverflow.com/questions/23097368/… questo è considerato non sicuro e i tuoi file potrebbero comunque essere sottoposti a commit se non stai attento. È inteso come un aiuto alla prestazione, non come una soluzione infallibile a questo problema.
danShumway,

3
Mi sono precipitato --assume-unchangedprima di leggere il tuo aggiornamento . Mi sono sciolto --no-assume-unchangede poi ho fatto --skip-worktree... Sono in chiaro?
Nicolas Miari,

162

Aggiungi le seguenti righe alla sezione [alias] del tuo file .gitconfig

ignore = update-index --assume-unchanged
unignore = update-index --no-assume-unchanged
ignored = !git ls-files -v | grep "^[[:lower:]]"

Ora puoi usare git ignore my_fileper ignorare le modifiche al file locale e git unignore my_fileper smettere di ignorare le modifiche. git ignoredelenca i file ignorati.

Questa risposta è stata ottenuta da http://gitready.com/intermediate/2009/02/18/temporarily-ignoring-files.html .


1
"! git ls-files -v | grep" ^ [[: lower:]] "- Qualche possibilità che tu sappia come fare su Windows cmd?
Haohmaru,

3
Installa una vera shell (ad esempio Babun fornisce bash o zsh);) Conosco i tuoi sentimenti, ma di recente sono passato da Windows a Linux e non avrei mai più usato cmd.
Xerus,

@Haohmaru, puoi sempre usare WSL (sottosistema Windows per Linux).
A Sz

110

Hai diverse opzioni:

  • Lascia un file sporco (o non confermato) .gitignorenella tua cartella di lavoro (o applicalo automaticamente usando topgit o qualche altro strumento patch di questo tipo).
  • Inserisci le esclusioni nel tuo $GIT_DIR/info/excludefile, se questo è specifico di un albero.
  • Esegui git config --global core.excludesfile ~/.gitignoree aggiungi modelli al tuo ~/.gitignore. Questa opzione si applica se si desidera ignorare determinati schemi in tutti gli alberi. Lo uso per .pyce .pyofile, ad esempio.

Inoltre, assicurati di utilizzare i pattern e di non enumerare esplicitamente i file, se applicabile.


10
Penso che tu debba git config --globalimpostare l'opzione a livello globale.
Josh Lee,

7
In realtà, aggiungi .gitignore a .gitignore;)!
Dominik George,

68

Penso che tu stia cercando:

git update-index --skip-worktree FILENAME

che ignora le modifiche rese locali

Ecco http://devblog.avdi.org/2011/05/20/keep-local-modifications-in-git-tracked-files/ ulteriori spiegazioni su queste soluzioni!

per annullare utilizzare:

git update-index --no-skip-worktree FILENAME

9
C'è una discussione pertinente tra --skip-worktreee --assume-unchangedsu questa domanda SO
Merwer

1
Come potrei annullare questo, o vedere l'elenco di file / pattern che attualmente vengono ignorati --skipworktree, se dovessi cambiare idea in seguito e voler ricominciare a tracciare il file?
Anomalia,

1
come annullare questo?
user1735921

3
Per annullare, utilizzaregit update-index --no-skip-worktree <file>
user1735921

49

È possibile installare alcuni alias git per semplificare questo processo. Questo modifica il [alias]nodo del tuo .gitconfigfile.

git config --global alias.ignore 'update-index --skip-worktree'
git config --global alias.unignore 'update-index --no-skip-worktree'
git config --global alias.ignored '!git ls-files -v | grep "^S"'

Le scorciatoie che questa installa per te sono le seguenti:

  • git ignore config.xml
    • git farà finta di non vedere alcun cambiamento, config.xmlimpedendoti di commetterli accidentalmente.
  • git unignore config.xml
    • git riprenderà a riconoscere le modifiche apportate a config.xml- consentendoti di nuovo di eseguire il commit di tali modifiche.
  • git ignored
    • git elencherà tutti i file che "ignori" nel modo sopra descritto.

Li ho costruiti facendo riferimento alla risposta di Phatmann, che presenta una --assume-unchangedversione dello stesso.

La versione che presento utilizza --skip-worktreeper ignorare le modifiche locali. Vedi la risposta di Borealid per una spiegazione completa della differenza, ma essenzialmente lo --skip-worktreescopo è che gli sviluppatori modifichino i file senza il rischio di commetterli .

Il git ignoredcomando presentato qui utilizza git ls-files -ve filtra l'elenco per mostrare solo quelle voci che iniziano con il Stag. Il Stag indica un file il cui stato è "skip worktree". Per un elenco completo degli stati dei file mostrati da git ls-files: consultare la documentazione per l' -topzione on git ls-files.


1
Questo non funziona per i file non tracciati: <(git 2.13.5 su osx)
Terra Ashley

È il '!' dovrebbe essere '!git ls-files -v | grep "^S"'? Il comando non funziona per me con esso lì .. e sembra funzionare bene con rimosso.
Tiris,

il punto esclamativo in un alias git indica a git di eseguire un comando esterno , anziché un sottocomando git . L'ho inserito perché ho bisogno di una pipeline di shell, quindi ho bisogno di invocare git dall'esterno. Ho appena provato a rimuovere il punto esclamativo (secondo la tua raccomandazione), ma non funziona per me. Ho capito Expansion of alias 'ignored' failed; 'git' is not a git command. Questo ha senso; senza il punto esclamativo: git alias al tuo comando git git ls-files ….
Birchlabs,

Grazie per la spiegazione. Non ho familiarità con git alias e stavo solo eseguendo una shell per testare prima di creare l'alias.
Tiris,

Questa è una soluzione geniale. Poiché git tiene traccia per directory, quando si esegue l'alias sopra git ignore <filename>, si applica solo a quella directory. E quando finalmente vuoi apportare le modifiche a quel file e impegnarti e passare al telecomando, usa il pratico git unignore <filename>per iniziare temporaneamente a rintracciarlo! Grazie!
Nick

42

Puoi semplicemente aggiungere un file .gitignore alla tua home directory, ovvero $HOME/.gitignoreo ~/.gitignore. Quindi dì a git di usare quel file con il comando:

git config --global core.excludesfile ~/.gitignore

Questo è un normale file .gitignore che fa riferimento a git quando decide cosa ignorare. Dato che si trova nella tua home directory, si applica solo a te e non inquina alcun file .gitignore di progetto.

Uso questo approccio da anni con grandi risultati.


Grazie, @EricChen. Ho aggiornato la risposta; provalo e poi usa git check-ignore <file-name>per verificare. LMK se funziona per te
GESII

Ha funzionato solo per me senza =:git config --global core.excludesfile ~/.gitignore
E. Sundin,

Ho messo un .gitignorefile nella directory home e ho detto a git di usare quel file, quindi ho eliminato i file che vorrei rintracciare localmente. Tuttavia, dopo aver inviato le modifiche, anche il repository remoto ha eliminato quei file. Ho fatto qualcosa di male?
zyy

Wow, @xyz; .gitignoresi tratta di ignorare i file esistenti nella directory locale. Quello che avresti dovuto fare è git rm --cachedche li rimuove dal repository ma li lascia nel tuo locale. Dovresti essere in grado di tornare al tuo precedente commit con qualcosa come git reset --soft HEAD^annullare quel commit e recuperare i tuoi file. Questa è la bellezza di Git: è ancora tutto lì nella tua storia di Git.
GESii

2

Al fine di ignorare i file non tracciati, specialmente se si trovano in (alcune) cartelle non tracciate, una soluzione semplice è quella di aggiungere un .gitignorefile a ogni cartella non tracciata ed entrare in una singola riga contenente *seguita da una nuova riga. È una soluzione davvero semplice e diretta se i file non tracciati si trovano in poche cartelle. Per me, tutti i file provenivano da un'unica cartella non tracciata vendore quanto sopra funzionava.


1
Grande! Cordiali saluti: Funziona solo perché git tiene traccia (e consente di eseguire il commit) solo dei file, non delle cartelle.
jmiserez,

-2

Se il tuo repository non ha già un file .gitignore, una soluzione semplice è quella di creare un file .gitignore e in esso aggiungere .gitignoreall'elenco dei file da ignorare.


4
E se il team volesse aggiungere per aggiungere un gitignore in un secondo momento? Funziona anche questo? Sembra un'idea terribile e qualcosa che non dovrebbe nemmeno funzionare.
Bjorn,

La risposta di questo ragazzo mi ha spezzato. Nessuno lo sta facendo nessuno.
Martyn Chamberlin,

Questa è una soluzione rapida e semplice, purché ci sia un posto dove metterla. Il nostro repository ha un .gitignorefile condiviso in alto. Ma i miei file sporchi sono in una cartella profonda, quindi ho appena aggiunto i miei .gitignoreaccanto a loro. +1
joeytwiddle,
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.