Rimuovere la directory dal repository remoto dopo averli aggiunti a .gitignore


Risposte:


1067

Le regole nel tuo .gitignorefile si applicano solo ai file non tracciati. Dato che i file in quella directory erano già stati sottoposti a commit nel tuo repository, devi rimuoverli, creare un commit e inviarlo a GitHub:

git rm -r --cached some-directory
git commit -m 'Remove the now ignored directory "some-directory"'
git push origin master

Non è possibile eliminare il file dalla cronologia senza riscrivere la cronologia del repository: non è necessario farlo se qualcun altro sta lavorando con il repository o lo si utilizza da più computer. Se vuoi ancora farlo, puoi usare git filter-branchper riscrivere la cronologia: qui è disponibile una guida utile .

Inoltre, si noti che l'output da git rm -r --cached some-directorysarà qualcosa del tipo:

rm 'some-directory/product/cache/1/small_image/130x130/small_image.jpg'
rm 'some-directory/product/cache/1/small_image/135x/small_image.jpg'
rm 'some-directory/.htaccess'
rm 'some-directory/logo.jpg'

È il rmfeedback di git sul repository; i file sono ancora nella directory di lavoro.


3
Se qualcun altro tira, i file ora ignorati verranno eliminati per loro o rimarranno intatti?
Martin Konicek,

3
@Martin Konicek: se l'utente che sta eseguendo il pull delle modifiche non ha apportato modifiche a tali file, verranno rimossi.
Mark Longair,

@MarkLongair Cosa fa -re --cached. Grazie.
Labanino,

13
@Labanino: -rsignifica ricorsivo, necessario se stai facendo intere directory. --cachedsovrascrive il normale comportamento di git di eliminarli dalla directory di lavoro e mettere in scena la cancellazione per il commit, e fa funzionare git solo nell'area di staging pronta per il commit. È come dici a Git che vuoi conservare le tue copie locali dei file.
entheh,

2
Funziona bene, ma prima dovevo farlo: git reset name_of_fileperché ciò che è stato descritto sopra funziona
Edvard Haugland,

248

Lo faccio:

git rm --cached `git ls-files -i --exclude-from=.gitignore` 
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master

Che rimuoverà tutti i file / cartelle che si trovano nel tuo git ignora, salvando devi sceglierli manualmente


Questo sembra aver smesso di funzionare per me, ora faccio:

 git rm -r --cached . 
 git add .
 git commit -m 'Removed all files that are in the .gitignore' 
 git push origin master

4
Grazie, questo mi ha aiutato molto! Se stai usando Windows PowerShell, puoi farloforeach ($i in iex 'git ls-files -i --exclude-from=.gitignore') { git rm --cached $i }
Matteo

10
Ho provato il tuo secondo approccio, ha rimosso tutti i file dal mio git locale!
artnikpro,

2
Penso che dovresti navigare nella sottodirectory e farlo. Correggimi se sbaglio.

Quindi cosa abbiamo imparato oggi, bambini? "Non eseguire codice casuale che trovi su Stack Overflow!"
Jonathan Landrum,

49

Secondo la mia risposta qui: come rimuovere una directory dal repository git?

Per rimuovere la cartella / directory solo dal repository git e non dal locale, provare 3 semplici passaggi.


I passaggi per rimuovere la directory

git rm -r --cached FolderName
git commit -m "Removed folder from repository"
git push origin master

I passaggi per ignorare quella cartella nei prossimi commit

Per ignorare quella cartella dai prossimi commit, crea un file nella radice chiamato .gitignore e inseriscici il nome. Puoi metterne quanti ne vuoi

Il file .gitignore sarà simile a questo

/FolderName

rimuovi directory


1
Questo e 'esattamente quello che stavo cercando. Grazie :)
Rohit Singh,

Sono contento che abbia aiutato @Rohit Singh
eirenaios il

9

La prima risposta di Blundell non ha funzionato per me. Tuttavia mi ha mostrato la strada giusta. Ho fatto la stessa cosa in questo modo:

> for i in `git ls-files -i --exclude-from=.gitignore`; do git rm --cached $i; done
> git commit -m 'Removed all files that are in the .gitignore'
> git push origin master

Ti consiglio di controllare prima i file da cancellare eseguendo la seguente dichiarazione:

git ls-files -i --exclude-from=.gitignore

Stavo usando un file .gitignore predefinito per Visual Studio e ho notato che stava rimuovendo tutte le cartelle di log e bin nel progetto che non era la mia azione prevista.


5

Nota: questa soluzione funziona solo con la GUI di Github Desktop .

Utilizzando la GUI di Github Desktop è molto semplice.

  1. Spostare temporaneamente la cartella in un'altra posizione (fuori dalla cartella del progetto).

  2. Modifica il tuo .gitignorefile e rimuovi la voce della cartella che sarebbe rimuovere il repository principale nella pagina github.

  3. Conferma e sincronizza la cartella del progetto.

  4. Spostare nuovamente la cartella nella cartella del progetto

  5. Modifica nuovamente il .gitignorefile.

È tutto.


5

La risposta di Blundell dovrebbe funzionare, ma per qualche strana ragione non ha funzionato con me. Ho dovuto reindirizzare prima i nomi dei file emessi dal primo comando in un file, quindi scorrere in quel file ed eliminare quel file uno per uno.

git ls-files -i --exclude-from=.gitignore > to_remove.txt
while read line; do `git rm -r --cached "$line"`; done < to_remove.txt
rm to_remove.txt
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master

4

Questo metodo applica il comportamento standard .gitignore e non richiede di specificare manualmente i file che devono essere ignorati .

Non posso usare --exclude-from=.gitignore più: / - Ecco il metodo aggiornato:

Consiglio generale: inizia con un repository pulito - tutto impegnato, nulla in sospeso nella directory o nell'indice di lavoro ed esegui un backup !

#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch
git add .gitignore
git commit -m "Create .gitignore"

#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch
git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached

#optionally add anything to the index that was previously ignored but now shouldn't be:
git add *

#commit again
#optionally use the --amend flag to merge this commit with the previous one instead of creating 2 commits.

git commit -m "re-applied modified .gitignore"

#other devs who pull after this commit is pushed will see the  newly-.gitignored files DELETED

Se è inoltre necessario eliminare i file appena ignorati dalla cronologia di commit del ramo o se non si desidera che i file appena ignorati vengano eliminati da pull futuri , vedere questa risposta .


0

Se lavori da PowerShell, prova quanto segue come singolo comando.

PS MyRepo> git filter-branch --force --index-filter
>> "git rm --cached --ignore-unmatch -r .\\\path\\\to\\\directory"
>> --prune-empty --tag-name-filter cat -- --all

Poi, git push --force --all.

Documentazione: https://git-scm.com/docs/git-filter-branch


In che modo l'utilizzo è git filter-branchdiverso dall'uso git rm? Inizialmente pensavo di dover utilizzare una versione di, git filter-branchma la maggior parte dei commenti qui consiglia di utilizzare git rm. Da quello che ho capito git rmlo rimuove solo dalla directory di lavoro e dall'indice correnti. Ma se viene aggiunto più commit in precedenza, sarà ancora nel repository.
alpha_989,

Giusto. git rmrimuoverà il file dall'ultimo commit in futuro. git filter-branchci consente di rimuoverlo da tutta la cronologia. Vedi anche: help.github.com/articles/…
Shaun Luttin il
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.