.gitignore dopo il commit


210

Ho un repository git ospitato su Github. Dopo aver commesso molti file, sto realizzando che ho bisogno di creare .gitignoreed escludere .exe, .obji file.

Tuttavia, rimuoverà automaticamente questi file impegnati dal repository? C'è un modo per forzarlo?


6
I futuri googler potrebbero trovare questo estremamente utile. Succinto e al punto: git-tower.com/learn/git/faq/ignore-tracked-files-in-git
Austin Dean,

Risposte:


331

No, non è possibile forzare la rimozione di un file già impegnato nel repository solo perché viene aggiunto a .gitignore

Devi git rm --cachedrimuovere i file che non vuoi nel repository. (- cache dato che probabilmente si desidera conservare la copia locale ma rimuoverla dal repository.) Quindi, se si desidera rimuovere tutte le exe dal repository, fare

git rm --cached /\*.exe

(Notare che l'asterisco * è citato dalla shell - questo permette a git, e non alla shell, di espandere i nomi dei file e delle sottodirectory)


6
@Madhur Ahuja In realtà se lo fai git rm /\*.exeeliminerai tutti gli exe nel tuo repository
manojlds

4
A cosa servono gli / \?
Costa

5
@Costa sono lì per sfuggire all'asterisco, per impedire alla shell di interpretarlo, come previsto git.
Lambart,

2
Avvertenza: i file sono mantenuti in locale, è vero ... Ma altri utenti che eseguono un git pullvedranno i loro file eliminati.
ByScript

42

Tuttavia, rimuoverà automaticamente questi file impegnati dal repository?

No. Anche con un esistente .gitignorepuoi mettere in scena file "ignorati" con il -fflag (force). Se i file sono già stati sottoposti a commit, non vengono rimossi automaticamente.

git rm --cached path/to/ignored.exe

Significa che ho rimosso singolarmente ogni .exe
Madhur Ahuja il


30

Se non hai già inviato le modifiche:

git rm -r --cached .
git add .
git commit -m 'clear git cache'
git push

15

Ho dovuto rimuovere .idea e le cartelle di destinazione e dopo aver letto tutti i commenti ha funzionato per me:

git rm -r .idea
git rm -r target
git commit -m 'removed .idea folder'

e quindi spingere per padroneggiare


.ideaera il mio problema, immagino fosse anche tuo:)
Olivier Pons,

5

Tuttavia, rimuoverà automaticamente questi file impegnati dal repository?

No.

La ricetta "migliore" per farlo è usare git filter-branchcome scritto qui:

La pagina man per git-filter-branch contiene esempi completi.

Nota Stai riscrivendo la cronologia. Se hai pubblicato delle revisioni contenenti i file aggiunti per errore, ciò potrebbe creare problemi agli utenti di tali filiali pubbliche. Informali o forse pensa a quanto è necessario rimuovere i file.

Nota In presenza di tag, utilizzare sempre l' --tag-name-filter catopzione per git filter-branch. Non fa mai male e ti farà risparmiare il mal di testa quando ti rendi conto in seguito che ne avevi bisogno


Ho eseguito questo comando ha mostrato Rewrite 57c1f1f04a3ed01f50c3260714cfc82c973ac816 (3/3) ATTENZIONE: Ref 'refs / heads / master' è invariato e non è successo nulla
Madhur Ahuja

È un avvertimento, e molto probabilmente significa che il ramo master non conteneva (ancora) alcuna revisione con i file da rimuovere. Puoi facilmente verificarlo. In caso di problemi, si prega di aggiornare la domanda. PS: usa - --allper riscrivere tutti i rami (locali) contemporaneamente
vedi il

1

Anche dopo aver eliminato i file e aver eseguito il commit, avrai comunque quei file nella cronologia. Per eliminarli, considera l'utilizzo di Repo-Cleaner di BFG . È un'alternativa a git-filter-branch.

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.