git rm - fatal: pathspec non corrisponde ad alcun file


87

Ho aggiunto per sbaglio oltre 9000 foto alla cartella del mio progetto. E li ha commessi. Quindi cancellati dal disco. Impegnati.

Ora provo a inviare le modifiche al server git. Ma impiega troppo tempo e tenta di inviare 12 GB di dati.

Ho controllato la dimensione dei file sul disco e ho visto che la .gitcartella occupa davvero 12 GB.

Come eliminare le foto da lì? Ho provato git rm, ma non riesce:

❯ git rm public/photos
fatal: pathspec 'public/photos' did not match any files

Perché li ho già cancellati dal disco, ma sono ancora nella .gitcartella.

Ho provato ad aggiungere public/photosa .gitignore:

public/photos/
*.zip

Ma nessun risultato. Certo che potevo hard reset headnel momento in cui non avevo così tante foto spazzatura nel mio progetto. Ma da quel momento mi sono impegnato molte volte e ho apportato molte modifiche al codice.

Risposte:


88

Nel tuo caso, usa git filter-branchinvece di git rm.

git rm cancellerà i file nel senso che non verranno più tracciati da git, ma ciò non rimuoverà i vecchi oggetti commit corrispondenti a quelle immagini, e quindi sarai ancora bloccato con il push dei commit precedenti che corrispondono a 12 GB di immagini.

La git filter-branch, d'altra parte, può rimuovere i file da tutti i commit precedenti così, eliminando quindi la necessità di spingere nessuno di loro.

  1. Usa il comando

    git filter-branch --force --index-filter \
      'git rm -r --cached --ignore-unmatch public/photos' \
      --prune-empty --tag-name-filter cat -- --all
    
  2. Dopo aver completato il ramo del filtro, verificare che nessun file non intenzionale sia stato perso.

  3. Ora aggiungi una regola .gitignore

    echo public/photos >> .gitignore
    git add .gitignore && git commit -m "ignore rule for photos"
    
  4. Ora fai una spinta

    git push -f origin branch
    

Controlla questo , questo e questo per ulteriore aiuto. Solo per essere più sicuri, ti suggerirei di creare una copia di backup del repository sul tuo sistema prima di procedere con queste istruzioni.

Per quanto riguarda il tuo messaggio di errore originale, sta accadendo perché non li hai già tracciati utilizzando git rm, e quindi git si lamenta perché non può rimuovere un file che non sta monitorando. Leggi di più su questo qui .


2
Ehi, ho lo stesso problema ma quando digito il comando al passaggio 1, ricevo un errore: fatal: bad revision '--prune-empty'. Qualche indizio?
kevin

@kevin scusa, ho perso questo commento. Puoi eseguirlo senza quella bandiera. Lo sfoltimento avrebbe rimosso qualsiasi oggetto di commit vuoto.
mu 無

1
Questa riga non dovrebbe git add .gitignore && commit -m "ignore rule for photos"esseregit add .gitignore && git commit -m "ignore rule for photos"
Clone

@Clone sì, avrei dovuto farlo, ora l'ho corretto :)
mu 無

1
Questa è una risposta follemente fantastica. Risolto un problema che ho riscontrato con il mio repository per diversi anni. Grazie!
Moshe

18

Una risposta molto semplice è.

Passo 1:

Innanzitutto aggiungi i file non tracciati a cui desideri eliminare:

utilizzando git add .o git add <filename>.

Passo 2:

Quindi cancellali facilmente usando il comando git rm -f <filename>qui rm = rimuovi e -f = forzatamente.


questo non farà ciò che vuole l'OP, ovvero rimuovere i file presenti nei commit precedenti. È necessario utilizzare git filter-branchcome menzionato altrove.
Simon Stevens

9

Passo 1

Aggiungi i nomi dei file al tuo .gitignorefile.

Passo 2

git filter-branch --force --index-filter \
    'git rm -r --cached --ignore-unmatch YOURFILE' \
    --prune-empty --tag-name-filter cat -- --all

Passaggio 3

git push -f origin branch

Un grande grazie a @mu.


7
... ho sempre pensato che git fosse più difficile di quanto dovrebbe essere questo lo dimostra. Non c'è modo che qualcuno possa ricordare l'esistenza della maggior parte dei comandi git per non parlare delle loro bandiere e stranezze. Il modello Git ha senso e funziona finché non segui il flusso semplice e non appena ti blocchi, rimani bloccato.
Muhammad Umer

2
Questa è la soluzione che funziona per me, avevo bisogno del--ignore-unmatch
guhur


1

Queste catene funzionano nel mio caso:

  1. git rm -r WebApplication/packages

C'era una finestra di dialogo git di conferma. Dovresti scegliere l'opzione "y".

  1. git commit -m "blabla"
  2. git push -f origin <ur_branch>

0
git stash 

ha fatto il lavoro, ha ripristinato i file che avevo cancellato usando rminvece digit rm .

Ho fatto prima un checkout dell'ultimo hash, ma non credo sia necessario.


0

Per rimuovere il file tracciato e il vecchio file commit da git è possibile utilizzare il comando seguente. Qui nel mio caso, voglio annullare il tracciamento e rimuovere tutto il file dalla distdirectory.

git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch dist' --tag-name-filter cat -- --all

Quindi, devi aggiungerlo al tuo in .gitignoremodo che non venga monitorato ulteriormente.


-1

Avevo una directory duplicata (~ web / web) e ha rimosso il duplicato nidificato quando ho eseguito rm -rf webmentre ero all'interno della prima cartella web.


Scusate! Devo aver letto male la domanda. Pensavo fosse questo l'obiettivo
ccsinsf
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.