2009-03-09 2 views
24

In precedenza, il seguente è stata la mia .gitignore di file:Come ignorare un file già impegnato?

... 
config/database.yml 
.DS_Store 

Più tardi ho creato un file app_config.yml nella directory config e commesso.

Ora mi sono reso conto che non ho bisogno del file app_config.yml nel repository git. E ho modificato il mio file di .gitignore:

... 
config/app_config.yml 
config/database.yml 
.DS_Store 

Ora, quando ho commesso, che app_config.yml file è ancora nel mio repo. Voglio rimuovere quel file dal mio repository. Come posso farlo?

risposta

43

Come menzionate nelle "ignoring doesn't remove a file"
(la seguente citazione del grande articolo da Nick Quaranto,
nel suo blog git ready "imparare Git un commit alla volta"):

Quando dici a Git di ignorare i file, si fermerà solo a guardare le modifiche per quel file e nient'altro.
Ciò significa che la cronologia ricorderà il file e lo avrà
.

Se si desidera rimuovere un file dal repository, ma tenerlo nella directory di lavoro, è sufficiente utilizzare:

git rm --cached <file> 

Tuttavia, questo sarà ancora mantenere il file nella storia.

Se si vuole realmente per rimuoverlo dalla storia, è in realtà hanno due opzioni:

  • riscrivere commit del repository, o
  • ricominciare.

Entrambe le opzioni fanno davvero schifo, e questo è per una buona ragione: Git fa fatica a non perdere i dati.
Proprio come con la ridefinizione, Git ti costringe a pensare a questo tipo di opzioni poiché sono operazioni distruttive.

Se in realtà si desidera rimuovere un file dalla cronologia, git filter-branch è il seghetto che stai cercando.
Leggere decisamente il suo manpage prima di utilizzarlo, poiché letteralmente riscrive i commit del progetto. Questo è in realtà un ottimo strumento per alcune azioni, e può fare ogni genere di roba come rimuovere totalmente i commit di un autore per spostare la cartella radice del progetto.Il comando per rimuovere un file da tutte le revisioni è:

git filter-branch --index-filter 'git rm --cached <file>' HEAD 

Questa azione può sicuramente essere utile quando è necessario far saltare in aria le informazioni sensibili o riservate che possono essere stati inseriti nel vostro repository