utilizzando gitignore per ignorare (ma non eliminare) i file


98

Ho una directory tmp nel mio repository git che vorrei che esistesse ancora, ma essere ignorata. L'ho aggiunto a .gitignore, ma git statusmi informa ancora sulle modifiche ai file in quella directory. Ho provato git rm -r --cached, ma questo lo rimuove dal repository remoto. Come posso interrompere il monitoraggio delle modifiche a questa directory, ma consentirne comunque l'esistenza? Devo farlo anche per 1 file, ma le modifiche vengono visualizzate anche git statusdopo .gitignoreaverle inserite. Cosa dovrei fare?


1
scrivi che aspetto ha esattamente il tuo file .gitignore?
kdehairy

Risposte:


183

Invece di .gitignore, puoi aggiornare il repository git locale eseguendo il seguente comando:

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

In questo caso viene tracciato un file nel repository di origine. Puoi modificarlo nel tuo repository locale e git non lo contrassegnerà mai come modificato. Maggiori informazioni su:


22
Il mio amore per Git potrebbe essere appena raddoppiato.
Mark Fox

2
Questa dovrebbe essere la risposta accettata. Grazie per esserti collegato a quello.
Gowiem

4
C'è un modo per inviarlo al repository remoto?
Brian Ortiz

2
hmm preferirei contrassegnare un file come "non è un file git, non sincronizzarlo mai con git, anche in altri repository di
qualcun

11
Puoi ripristinarlo con git update-index --no-assume-unchanged <file>. Se vuoi elencarli git ls-files -v | grep '^h'.
Sanghyun Lee

12

Ignorare le modifiche apportate ai file pur consentendo loro di esistere è lo scopo esatto di .gitignore. Quindi aggiungere i file (o le directory) .gitignoreè l'unica cosa che devi fare.

Ma il tuo problema è che git sta già monitorando i file che vuoi ignorare e .gitignorenon si applica ai file tracciati. L'unico modo per interrompere questo monitoraggio è dire a git di rimuoverli. Usando git rm --cached, impedisci a git di eliminare i tuoi file locali, ma qualsiasi altro repository che riceve le tue modifiche applicherà la rimozione. Non penso che ci sia un modo per evitarlo dal tuo repository. Devi fare qualcosa sugli altri repository o accettare che i file vengano rimossi.

Per impedire la rimozione su ogni altro repository è possibile:

  • (ovviamente) eseguire il backup dei file da qualche parte, eseguire il pull delle modifiche e ripristinare i file,
  • o anche git rm --cachedi file e il commit prima di estrarre le modifiche. Git unirà bene le due rimozioni senza toccare i file già non tracciati.

6
Non deve essere vero ("stop tracking = remove file"). È ancora possibile avere un file rintracciato in un repo e di non vedere eventuali modifiche apportate, utilizzando: git update-index --assume-unchanged <file>. Dai un'occhiata a: blog.pagebakers.nl/2009/01/29/…
ducin

questo ha risolto il mio problema perché ho bisogno di rimuovere il file dal repositorie inviato in git così git rm --cached <filename> -r e dopo questo push cambia di nuovo nel repositorie in modo che il file venga rimosso
Vinicius Cardoso

7

Metti un /alla fine del nome della directory nel tuo .gitignorefile, ad es

tmp/

Se hai tracciato dei file all'interno di quella directory, devi prima dire a git di dimenticarli (prima di aggiungere la directory all'elenco degli ignorati). Supponendo che tu non abbia nulla di vitale lì dentro (cioè che puoi graffiarlo):

git rm -rf ./tmp/
git commit -m "untrack tmp dir"
mkdir tmp
echo tmp/ >> .gitignore
git add .gitignore ; git commit -m "add tmp/ to ignore list"

I nuovi file in quella directory non verranno tracciati.

L' --cachedopzione per git rmfunziona solo sull'indice (in attesa di modifiche più o meno). Non ha alcun effetto sull'albero di lavoro o sullo stato di ciò che è stato tracciato o meno.


Ce l'ho. Entrambi the/dir/ethe/dir/*
21312312

Ehi Mat, se ho qualcosa come / Media in cartelle diverse che vorrei ignorare, è possibile? Quindi come / 1 / Media, / 2 / Media, fino a come 99?
Nic,


1

Sembra che tu stia cercando di tracciare un file (ad esempio index.php), aggiungerlo a un repository remoto, quindi smettere di guardarlo tracciarlo, mantenendo il file nel remoto (cioè mantieni index.phpinvariato nel repository remoto mentre lo cambi localmente).

Da quello che ho capito, git non può farlo. Puoi tenere traccia di un file oppure no. Se si tiene traccia di un file, esso esiste nel repository remoto e cambia quando si esegue il commit delle modifiche. Se non si tiene traccia di un file, non esiste nel repository remoto.

Poiché non è possibile fare esattamente quello che vuoi con git, ci sono potenzialmente altre soluzioni, a seconda della tua esatta situazione. Ad esempio, perché non vuoi index.phpcambiare da remoto quando lo modifichi localmente? Sono presenti impostazioni specifiche dell'utente nel file? Se questo è il caso, puoi fare:

cp index.php index_template.php
git rm --cached index.php

Ora modifica index_template.php in modo che sia come vuoi che appaia nel repository remoto. Aggiungi qualcosa al tuo README per dire alle persone che usano il tuo repository che una volta clonato, devono copiare index_template.php in index.php e modificarlo per soddisfare le loro esigenze.

git add index_template.php
git add README
git commit -m 'added template index.php file'
git push

Quando qualcuno clona il tuo repository, deve crearne uno proprio index.php. Hai fatto più facile per loro: è sufficiente copiare index_template.phpper index.phpe rivedere con le impostazioni del computer-specifici.

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.