2015-01-23 9 views
5

Let è guardare il file .gitignore - a cui ho aggiunto mllib/pom.xml e pom.xml e anche .gitignore (che non dovrebbe essere necessario - così qualcosa non va ..):git status sta mostrando "Modifiche non in scena per il commit" per i file elencati in .gitignore?

$head .gitignore 
.gitignore 
mllib/pom.xml 
pom.xml 

allora vediamo quali file git vuole aggiungere:

$ git status 
Changes not staged for commit: 
    (use "git add <file>..." to update what will be committed) 
    (use "git checkout -- <file>..." to discard changes in working directory) 

    modified: .gitignore 
    modified: mllib/pom.xml 
    modified: 

UPDATE ci sono due commenti su non "ignorare il .gitignore". Ma, dopo aver tolto di nuovo il .gitignore otteniamo questo:

Changes not staged for commit: 
    (use "git add <file>..." to update what will be committed) 
    (use "git checkout -- <file>..." to discard changes in working directory) 

    modified: .gitignore 
    modified: mllib/pom.xml 

Quindi (a) Gitignore sta rivelando e (b) il file specifico che è veramente importante non aggiungere ad un commit - mllib/pom.xml - mostra anche.

+3

non ignorare l'ignora – Anthony

+2

Uhhhh ... non si potrebbe voler ignorare '.gitignore'. –

+0

Se rimuovo .gitignore, viene visualizzato in "Modifiche non pianificate per il commit" – javadba

risposta

20

Il file .gitignore non significa ciò che si pensa significhi.

In particolare, una volta che avete fatto un file "nota" a git, in quanto è nell'indice, aggiungendo il nome di quel file per .gitignore non ha alcun effetto. Git già tiene traccia del file e continuerà a seguirlo.

In sostanza, il file .gitignore non è in realtà un elenco di file da ignorare. Invece, quando git incontra un caso di un file "non tracciato" e sta per segnalarlo, i contenuti dello .gitignore sono una lista di nomi che dovrebbe sopprimere.

Per il file .gitignore sé che probabilmente vuole solo git add i cambiamenti e li impegnano, dal momento che, come regola generale, chiunque clonare il repository probabilmente vuole ignorare lo stesso insieme di file non monitorate, in modo .gitignore dovrebbero essere tracciati e Versione controllata.

Per il file XML, tuttavia, potrebbe trattarsi di "contenuto generato" che non si desidera controllare con la versione, ma si desidera comunque mantenerlo nella struttura di lavoro. Questo è un po 'un problema, perché git lo sta già rintracciando e insisterà per continuare a controllare la versione del file.

Cosa si può fare a questo punto è rimuoverla dall'indice di git, ma non dal lavoro-albero:

git rm --cached mllib/pom.xml 

va bene per quanto si va (git rimuove il file dal indice e il il prossimo commit mancherà di quel file), ma creerà problemi se tornerai a un commit che ha il file, perché git vedrà che ha bisogno di creare il file - ti stai spostando da un commit in cui il il file non esiste (uno recente) in un commit in cui esiste (uno vecchio) e potrebbe lamentare che il contenuto di quel file sarà sbalordito. Oppure, anche se questa parte funziona, se si passa a una versione recente, allontanandosi dalla vecchia versione, git confronterà le vecchie e le nuove versioni e vedrà che il file è stato rimosso ... e sarà rimuoveremllib/pom.xml .

Ri-modificare, 20 ott 2016: Utilizzare git update-index --skip-worktree, non git update-index --assume-unchanged. Questo imposta un bit più potente nell'indice. Vedi Git - Difference Between 'assume-unchanged' and 'skip-worktree'.Edit: come Schwern noted in a comment below, è possibile utilizzare git update-index --assume-unchanged per rendere git nemmeno guardare il file per le modifiche, piuttosto che utilizzare git rm --cached di tirarla fuori dell'indice (vedi this answer per i dettagli). Anche questo va bene fino in fondo, potresti doverlo fare di nuovo (o far fare a tutti i tuoi colleghi da soli) su qualsiasi altro/nuovo clone.

(È possibile recuperare da quest'ultimo utilizzando git show <oldrev>:mllib/pom.xml > mllib/pom.xml per scaricare il file sullo standard output, e reindirizzare l'output standard per ricreare il file.)


Inconceivable!

(Più seriamente, tutti fanno questo errore Probabilmente gitignore era il nome sbagliato, e qualcosa come git-screen-away-untracked avrebbe potuto essere migliore, se klunkier.Tuttavia, elencando un file in .gitignore ha anche altri effetti collaterali: in particolare , è permits Git to clobber such files in alcuni casi)

+2

devi rimandare questo - se non altro per l'uso di "Inconcepibile". Peccato che le inflessioni corrette non siano riproducibili al di fuori di una pagina web. Thx per approfondire questo - .gitignore è in effetti ben più complicato del previsto. Imparerò a poco a poco un metodo per gestire la sola modifica delle modifiche locali richiesta per pom.xml – javadba

+2

[Inconcepibile!] (Https://www.youtube.com/watch?v=OHVjs4aobqs) – Schwern

+0

@javadba [Questa risposta] (http://stackoverflow.com/a/936325/14660) dovrebbe offrire una soluzione per ignorare le modifiche locali a un file tracciato. – Schwern

Problemi correlati