Come posso impedire a .gitignore di apparire nell'elenco dei file non tracciati?


971

Ho appena fatto uno git initalla radice del mio nuovo progetto.

Quindi ho creato un .gitignorefile.

Ora, quando scrivogit status , il file .gitignore appare nell'elenco dei file non tracciati. Perché?


13
git add self && git commit -m "-1 for reverting existential depression" && git remote rm HEAD
Alastair,

1
Posso ignorare la cartella .git / e inserirla in ".gitignore"?
Timo,

2
Potresti creare un "gitignore" globale nella tua cartella home sotto Linux e salvarlo lì: git config --global core.excludesfile ~ / .gitignore_global
Timo

14
Sono venuto qui cercando how to gitignore .gitinore filee la domanda e la risposta accettata non sono realmente legate al titolo. Il titolo potrebbe essere migliorato.
m.rufca,

6
Ci sono casi d'uso per ignorare .gitignore. Il flusso di lavoro del mio team mi richiede di modificare un set di file per il mio ambiente di sviluppo locale, ma non devono essere impegnati. Il flusso di lavoro potrebbe essere migliorato con un'architettura migliore ma è fuori dalle mie mani. Nel frattempo, avere git prestare attenzione a quei file è una responsabilità. Quindi voglio gitignore loro, ma solo localmente, e non voglio rischiare di impegnare il mio .gitignore in quanto non dovrebbe essere condiviso con il team.
Segna il

Risposte:


959

Il .gitignorefile dovrebbe essere nel tuo repository, quindi dovrebbe effettivamente essere aggiunto e impegnato, come git statussuggerisce. Deve far parte della struttura del repository, in modo che le modifiche ad esso possano essere unite e così via.

Quindi, aggiungilo al tuo repository, non dovrebbe essere gitignored.

Se vuoi davvero, puoi aggiungerlo .gitignoreal .gitignorefile se non vuoi che venga eseguito il commit. Tuttavia, in quel caso è probabilmente meglio aggiungere gli ignori a .git/info/exclude, uno speciale file di checkout-local che funziona proprio come .gitignore ma non viene visualizzato in "stato git" poiché si trova nella .gitcartella.

Vedi anche https://help.github.com/articles/ignoring-files


17
Questo non dovrebbe essere parte dei metadati del repository piuttosto che un file che viene monitorato?
endolith

13
I metadati del repository sono locali nel repository. Se aggiungi un hook di commit al tuo repository e qualcuno clona il tuo repository, non otterrà l'hook di commit, ad esempio.
August Lilleaas,

91
@wukong, se lavori in gruppo, non dovrebbero tutti ignorare lo stesso set di file? Ecco perché il file .gitignore viene aggiunto al repository. Nessuno dice che devi distribuirlo come parte del tuo progetto.
Ryan Lundy,

13
@endolith and wukong Non deve essere un file nel tuo repository. Puoi avere le tue impostazioni di ignorare in molti luoghi diversi. GitHub contiene un ottimo articolo su help.github.com/ignore-files Puoi avere impostazioni globali di ignorare ovunque e puoi avere impostazioni specifiche per i repository nei metadati .git per il repository.
Boushley,

6
@ deed02392 Nell'uso di questi file ignorati devi certamente usare il giudizio su ciò che hai inserito, ma hanno comunque degli ottimi usi. Ad esempio io uso Vim e quindi nel mio gitignore globale ho * .swp file contrassegnati come ignorati. In questo modo non devo aggiungerlo a ciascuno dei miei progetti e i ragazzi che non usano mai Vim non devono preoccuparsene.
Boushley,

282

Se si desidera memorizzare l'elenco di file ignorati all'esterno dell'albero Git, è possibile utilizzare il file .git / info / exclude . Viene applicato solo al checkout del repository.


19
+1, questo è ottimo per ignorare che non sono correlati al progetto, come i file di backup emacs * ~, .DS_Store da OS X e così via.
August Lilleaas,

38
@AugustLilleaas Personalmente preferisco inserire questi tipi di file specifici di {editor, piattaforma} in ~/.gitignoremodo che vengano ignorati per qualsiasi repository su cui lavoro.
Michael Mior,

22
Una volta tracciato un file, è possibile utilizzare git update-index --assume-unchanged <file>per interrompere il rilevamento delle modifiche senza modificare il repository. Questo è molto utile su grandi progetti condivisi in cui è necessario apportare modifiche locali, ma nessun altro vuole vedere le tue cose impegnate nel repository. Vedi blog.pagebakers.nl
Chris Esplin,

6
@AugustLilleaas: gitignore per utente è migliore per quel caso d'uso.
Lumaca meccanica il

3
grazie per questo suggerimento, sto usando git-svn, quindi gli altri utenti del repository svn sul server non vorrebbero esattamente .gitignore registrato.
enorl76

74

Potresti effettivamente inserire una riga .gitignorenel tuo .gitignorefile. Ciò farebbe .gitignoreignorare il file da git. In realtà non penso sia una buona idea. Penso che il file ignore debba essere controllato e monitorato. Lo sto solo pubblicando per completezza.


7
Ha funzionato per me! versione 1.5.6.5. Concordo anche con 1800 INFORMATION che non è una buona idea, ma penso che potrebbe andare bene in determinati contesti (supponiamo che tu usi un repository git-svn e non vuoi che i file git-ish vadano in svn). Il file di esclusione è probabilmente migliore.
J. Polfer,

4
@ehsanul: il file non deve essere monitorato (non è necessario aggiungerlo o memorizzarlo). Puoi rintracciarlo. Questa probabilmente non è una grande idea in un ambiente solo git, ma se ti capita, ad esempio, di usare git come client intelligente per un repository di sovversione (senza che gli altri lo sappiano, <risate maniacali>) - un simile trucco è grande.
Tomasz Gandor,

2
@IshanSrivastava Probabilmente hai già tracciato il file. Prova a correregit rm --cached .gitignore
Gideon,

51

Puoi anche avere un .gitignorefile git utente globale che si applicherà automaticamente a tutti i tuoi repository. Questo è utile per i file IDE ed editor (ad es. swpE *~file per Vim). Modifica le posizioni delle directory in base al tuo sistema operativo.

  1. Aggiungi al tuo ~/.gitconfigfile:

    [core]
    excludesfile = /home/username/.gitignore
    
  2. Creare un ~/.gitignorefile con schemi di file da ignorare.

  3. Salvare i file dot in un altro repository in modo da disporre di un backup (opzionale).

Ogni volta che copi, esegui o cloni un repository, verrà utilizzato anche il tuo file gitignore globale.


6
Credo che questa sia la soluzione migliore per le situazioni in cui i tuoi editor lasciano file temporanei, ad es. *. Swp (VIM) e ._ * (TM), dal momento che non avrebbe senso aggiungere continuamente queste regole ad ogni repository git, e per forzare altri utenti con IDE diversi a controllare questi file.
Thomas Hunter II

1
Questo funziona brillantemente per ignorare che non dovrebbe essere spinto in alcun ramo. Sostituisci 'username' con il tuo vero nome utente, ovviamente, e non aggiungere una seconda sezione [core] a .gitconfig se ne hai già una - posiziona semplicemente la linea exclesfile nella sezione [core] esistente.
smeriglio

47

Se qualcuno ha già aggiunto a .gitignoreal tuo repository, ma desideri apportare alcune modifiche e far sì che tali modifiche vengano ignorate, procedi come segue:

git update-index --assume-unchanged .gitignore

Fonte .


5
Cattiva idea, esiste una ragione .git/info/excludes.
Arrowmaster,

6
Presumo che --assume-unchangedesista anche una ragione . Perché uno è migliore dell'altro?
Leif Gruenwoldt,

9
E btw .git/info/excludesnon funziona se il file è già tracciato.
Leif Gruenwoldt,

Questo mi ha davvero aiutato con un .gitignore che era già stato impegnato e per il quale non volevo commettere cambiamenti. Sto eseguendo git 1.7.4.1 dai repository di Ubuntu 11.04 e le pagine di aiuto lo aggiungono in update-index. "Questa opzione può essere utilizzata anche come meccanismo approssimativo a livello di file per ignorare le modifiche non confermate nei file tracciati (simile a ciò che fa .gitignore per i file non tracciati). Git fallirà (con garbo) nel caso in cui debba modificare questo file nell'indice ad esempio quando si unisce in un commit; quindi, nel caso in cui il file presupposto-non tracciato venga modificato a monte, sarà necessario gestire la situazione manualmente. "
YonahW,

Io voto per questa risposta perché generalmente avrai bisogno di questa azione per il tuo stato iniziale di repository master e manterrai i vantaggi della funzionalità git. Non vi è alcuna buona ragione per ignorare questo file (punto)
Lazaros Kosmidis,

37

Dopo aver aggiunto il .gitignorefile e averlo eseguito il commit, non verrà più visualizzato nell'elenco "file non tracciati".

git add .gitignore
git commit -m "add .gitignore file"
git status

20

Nel caso in cui qualcun altro abbia lo stesso dolore che abbiamo avuto. Volevamo escludere un file che era già stato eseguito il commit.

Questo post è stato molto più utile: lavorare con .git / info / exclude troppo tardi

In particolare, ciò che è necessario ignorare un file è in realtà utilizzare il comando git remove Vedi git rm ( http://www.kernel.org/pub/software/scm/git/docs/git-rm.html )

lo provi andando

git rm --dry-run *.log
(se dici volevi escludere tutti i file di registro)

questo produrrà ciò che sarebbe escluso se lo eseguissi.

poi

lo esegui andando

git rm *.log
(o qualunque sia il percorso / espressione del nome file che desideri)

Quindi aggiungi una *.loglinea al tuo .gitignorefile.


4
Naturalmente, potresti voler seguire questo con l'aggiunta dei modelli pertinenti (ad esempio, * .log) al tuo .gitignore, quindi non ingombreranno il tuo git statusse si presenteranno in futuro.
Patrick O'Leary,

2
Sebbene il mio problema non fosse correlato allo stesso dei PO: Grazie per avermi fatto sapere che avrei dovuto usare RM per "ripulire" il mio repository dopo aver apportato modifiche a .gitignore (se i file sono già stati sottoposti a commit.) Errore Noob Lo so, ma questo è stato il primo posto in cui ho visto personalmente qualcuno menzionarlo.
Mike

Grazie per il feedback. Sì, è per questo che l'ho scritto, essendo venuto qui e poi facendo un lungo cammino per risolvere anche questo, ho pensato che sarebbe stato bello scriverlo. :)
Evolve l'

16

Ovviamente il file .gitignore viene visualizzato sullo stato, perché non è tracciato e git lo vede come un nuovo file gustoso da mangiare!

Dato che .gitignore è comunque un file non monitorato, è un candidato che può essere ignorato da git quando lo metti in .gitignore!

Quindi, la risposta è semplice: basta aggiungere la riga:

.gitignore # Ignore the hand that feeds!

al tuo file .gitignore!

E, contrariamente alla risposta di August, dovrei dire che non è che il file .gitignore dovrebbe essere nel tuo repository. Accade solo che possa essere, il che è spesso conveniente. Ed è probabilmente vero che questo è il motivo per cui .gitignore è stato creato in alternativa a .git / info / exclude, che non ha l'opzione per essere monitorato dal repository. Ad ogni modo, come usi il tuo file .gitignore dipende totalmente da te.

Per riferimento, controlla la manpage gitignore (5) su kernel.org.


15

L'idea è di inserire nel file file specifici del progetto .gitignoree (come già detto) di aggiungerli al repository. Per esempio .pyce .ofile, registra che la suite di test crea, alcuni infissi etc.

Per i file che la tua configurazione crea ma che non appariranno necessariamente per tutti gli utenti (come .swpfile se usi vim, directory ecplise nascoste e simili), dovresti usare .git/info/exclude(come già accennato).


14

Prima di tutto, come molti altri hanno già detto, .gitignoredovresti essere monitorato da Git (e quindi non dovrebbe essere ignorato). Lasciami spiegare perché.

(TL; DR: esegue il commit del .gitignorefile e usa un globale.gitignore per ignorare i file creati dal tuo IDE o dal tuo sistema operativo)

Git è, come probabilmente già saprai, un sistema di controllo della versione distribuita . Ciò significa che consente di passare da una versione all'altra (anche se lo sviluppo è diviso in rami diversi) e consente inoltre a più sviluppatori di lavorare sullo stesso progetto.

Anche se il monitoraggio dei tuoi .gitignorevantaggi ha anche dei vantaggi quando si passa da un'istantanea all'altra, il motivo più importante per impegnarsi è che vorrai condividere il file con altri sviluppatori che stanno lavorando allo stesso progetto. Commettendo il file in Git, altri contributori otterranno automaticamente il .gitignorefile quando clonano il repository, quindi non dovranno preoccuparsi di eseguire il commit accidentale di un file che non dovrebbe essere eseguito il commit (come file di registro, directory della cache, credenziali del database , eccetera.). E se ad un certo punto il progetto .gitignoreviene aggiornato, possono semplicemente inserire quelle modifiche invece di dover modificare il file manualmente.

Naturalmente, ci saranno alcuni file e cartelle che vorresti ignorare, ma che sono specifici per te e non si applicano ad altri sviluppatori. Tuttavia, quelli non dovrebbero essere nel progetto .gitignore. Esistono altri due luoghi in cui è possibile ignorare file e cartelle:

  • I file e le cartelle creati dal tuo sistema operativo o IDE devono essere collocati in un globale.gitignore . Il vantaggio è che questo .gitignoreè applicato a tutti i repository sul tuo computer, quindi non è necessario ripeterlo per ogni repository. E non è condiviso con altri sviluppatori, poiché potrebbero utilizzare un sistema operativo e / o IDE diverso.
  • I file che non appartengono al progetto .gitignore, né al globale .gitignore, possono essere ignorati usando il repository esplicito esclude inyour_project_directory/.git/info/exclude . Questo file non verrà condiviso con altri sviluppatori ed è specifico per quel singolo repository

Bella menzione per il globale.gitignore
Gruber,

Penso che dopo l'installazione iniziale il file .gitignore dovrebbe essere ignorato, quindi non ci sono cambiamenti accidentali. Ciò non significa che non possa più essere modificato, ma è protetto dagli incidenti, in un certo senso. Gli incidenti su quel file possono creare confusione o addirittura mettere in pericolo qualche lavoro, quindi dovrebbe essere considerato anche il "sigillamento" (ignorando se stesso).
Sasa,

@Sasa .gitignorefunziona solo per ignorare i file che non sono ancora tracciati da Git. L'aggiunta di un file già tracciato .gitignorenon ti impedirà di apportare modifiche a quel file. Anche se ciò fosse possibile, come commetteresti il ​​cambiamento .gitignorequando indichi a Git di ignorare se stesso?
Nic Wortel,

@Nic - Ho passato la spiegazione dettagliata al mio punto di vista nella risposta separata alla fine di questa discussione.
Sasa,

12

Prestare attenzione al seguente "problema" A volte si desidera aggiungere directory ma nessun file all'interno di tali directory. La soluzione semplice è creare un .gitignore con il seguente contenuto:

*

Questo funziona correttamente fino a quando non ti rendi conto che la directory non è stata aggiunta (come previsto nel tuo repository. La ragione di ciò è che anche .gitignore verrà ignorato, e quindi la directory è vuota. Quindi, dovresti fare qualcosa del genere :

*
!.gitignore

9

Questo sembra funzionare solo per la directory corrente Gitper ignorare tutti i file dal repository.

aggiorna questo file

.git/info/exclude 

con il jolly o il nome file

*pyc
*swp
*~

5

Se hai già effettuato il check-in .gitignore e desideri ignorare le modifiche apportate, dai un'occhiata a questa risposta :

Prova a usare questo comando:

git update-index --assume-unchanged FILENAME_TO_IGNORE

Per invertirlo (se mai si desidera eseguire il commit delle modifiche), utilizzare:

git update-index --no-assume-unchanged

AGGIORNAMENTO :

Ecco come elencare i file 'assume invariato' nella directory corrente:

git ls-files -v | grep -E "^[a-z]"

Poiché l' -vopzione utilizzerà lettere minuscole per i file 'assume invariato'.


4

Nel mio caso, voglio escludere un file esistente. Solo la modifica di .gitignore non funziona. Ho seguito questi passaggi:

git rm --cached dirToFile/file.php
vim .gitignore
git commit -a

In questo modo, ho cancellato dalla cache il file che volevo escludere e dopo averlo aggiunto a .gitignore .


la migliore soluzione per me. puoi anche usare git add. in secondo luogo, dopo che git commit -m "fixing .gitignore"
brainray

3

Passare alla directory di base del proprio repository git ed eseguire il comando seguente:

echo '\\.*' >> .gitignore

Tutti i file di punti verranno ignorati, incluso quel fastidioso .DS_Store se sei su un mac.


4
Non lo farei. Potrebbero essere necessari file dot. Invece, aggiungerei letteralmente .gitignore e .DS_Store.
Edward Falk,

2

È possibile che un utente finale desideri che Git ignori il file ".gitignore" semplicemente perché le cartelle specifiche IDE create da Eclipse non sono probabilmente le stesse di NetBeans o di un altro IDE. Quindi, per mantenere l'IDE del codice sorgente antagonista, è facile far ignorare un git personalizzato che non è condiviso con l'intero team poiché i singoli sviluppatori potrebbero utilizzare IDE diversi.


1

.gitignoresi tratta di ignorare altri file. git riguarda i file, quindi si tratta di ignorare i file. Tuttavia, poiché git funziona su file, questo file deve essere presente come meccanismo per elencare gli altri nomi di file.

Se fosse chiamato .the_list_of_ignored_filespotrebbe essere un po 'più ovvio.

Un'analogia è un elenco di cose da fare che NON vuoi fare. A meno che non li elenchi da qualche parte sia una sorta di elenco di "cose ​​da fare" che non conoscerai.


1

Penso che ci siano situazioni in cui ignorare il .gitignore è molto utile. Ad esempio, quando si hanno più team o un team di grandi dimensioni che lavora sulla stessa base di codice. In tal caso, è necessario disporre di determinate convenzioni, una di quelle convenzioni riguarda ciò che viene ignorato nel repository git. Di solito si tratta di ignorare file e directory creati da IDE o OS, alcuni registri generati, ecc.

Tuttavia, esiste una forza che tende a introdurre modifiche non convenzionali al .gitignorefile. Il .gitignorefile può essere ulteriormente modificato da una persona irresponsabile, per errore, da uno strumento utilizzato o in qualche altro caso.

Per avere una contro-forza in questo, possiamo fare come segue:

  1. Il .gitignore iniziale dovrebbe riflettere la convenzione nelle squadre,
  2. Dopo averlo spinto, il .gitignore dovrebbe essere protetto aggiungendo la voce .gitignore e spingendo di nuovo quel cambiamento. Il .gitignorefile viene " sigillato " in questo modo.

Il file " sigillato " .gitignorepuò essere modificato, solo localmente, senza propagare i cambiavalute agli altri membri del team. Tuttavia, se un cambiamento è ampiamente concordato in tutto il / i gruppo / i di quanto sia possibile "annullarlo", modificarlo e "sigillarlo" di nuovo. Ciò non può essere fatto per errore, solo intenzionalmente.

Purtroppo, non puoi essere protetto al 100% dalla stupidità, ma in questo modo hai fatto tutto il possibile per impedire che accadessero cose stupide.

Se hai una squadra relativamente piccola con ottimi professionisti, questo non sarebbe importante, ma anche quei ragazzi apprezzerebbero avere una cosa in meno di cui preoccuparsi.

L'utilizzo .git/info/excludeè interessante quando non è possibile eseguire alcuna operazione sulle impostazioni dell'infrastruttura, semplicemente coprendo il proprio ** per non commettere errori.

Da un punto di vista di ciò che è giusto e di ciò che è sbagliato, voto per avere la voce .gitignore all'interno del .gitignorefile, dando a tutti la libertà di fare localmente quello che vogliono, ma non invadere gli altri.


0

Ho scoperto che il posto migliore per impostare un ignore per i .DS_Storefile fastidiosi è nel .git/info/excludefile.

IntelliJ sembra farlo automaticamente quando si configura un repository git in esso.


1
Il file ignore globale dell'utente sarebbe un posto migliore per ignorare .DS_Store
Max Nanasy
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.