git rm - fatal: pathspec hat keine Dateien gefunden


87

Ich habe versehentlich über 9000 Fotos zu meinem Projektordner hinzugefügt. Und sie verpflichtet. Dann löschte sie von der Festplatte. Engagiert sein.

Jetzt versuche ich, Änderungen auf den Git-Server zu übertragen. Es dauert jedoch zu lange und versucht, 12 GB Daten zu senden.

Ich habe die Dateigröße auf der Festplatte überprüft und festgestellt, dass der .gitOrdner wirklich 12 GB benötigt.

Wie lösche ich Fotos von dort? Ich habe es versucht git rm, aber es schlägt fehl:

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

Weil ich sie bereits von der Festplatte gelöscht habe, sie sich aber noch im .gitOrdner befinden.

Ich habe versucht , hinzuzufügen , public/photoszu .gitignore:

public/photos/
*.zip

Aber kein Ergebnis. Natürlich konnte ich hard reset headzu einem Moment, als ich nicht so viele Junk-Fotos in meinem Projekt hatte. Aber seitdem habe ich mich viele Male verpflichtet und viele Änderungen am Code vorgenommen.

Antworten:


88

Verwenden Sie in Ihrem Fall git filter-branchanstelle von git rm.

git rm löscht die Dateien in dem Sinne, dass sie nicht mehr von git verfolgt werden, aber die alten Commit-Objekte, die diesen Bildern entsprechen, werden nicht entfernt, sodass Sie weiterhin die früheren Commits verschieben müssen, die 12 GB Bildern entsprechen.

Die git filter-branch, auf der anderen Seite, kann auch diese Dateien von allen vorherigen Commits entfernen, wodurch die Notwendigkeit zu tun weg jede von ihnen zu schieben.

  1. Verwenden Sie den Befehl

    git filter-branch --force --index-filter \
      'git rm -r --cached --ignore-unmatch public/photos' \
      --prune-empty --tag-name-filter cat -- --all
    
  2. Stellen Sie nach Abschluss des Filterzweigs sicher, dass keine unbeabsichtigte Datei verloren gegangen ist.

  3. Fügen Sie nun eine .gitignore-Regel hinzu

    echo public/photos >> .gitignore
    git add .gitignore && git commit -m "ignore rule for photos"
    
  4. Jetzt mach einen Push

    git push -f origin branch
    

Überprüfen Sie dies , dies und das für weitere Hilfe. Um auf der sicheren Seite zu sein, würde ich vorschlagen, dass Sie eine Sicherungskopie des Repos auf Ihrem System erstellen, bevor Sie mit diesen Anweisungen fortfahren.

Ihre ursprüngliche Fehlermeldung geschieht, weil Sie sie bereits mit nicht mehr verfolgt haben git rm, und daher beschwert sich git, weil es eine Datei, die nicht verfolgt wird, nicht entfernen kann. Lesen Sie hier mehr darüber .


2
Hey, ich habe das gleiche Problem, aber wenn ich den Befehl in Schritt 1 eingebe, wird eine Fehlermeldung angezeigt: fatal: schlechte Revision '--prune-empty'. Irgendeine Ahnung?
Kevin

@ Kevin Entschuldigung, habe diesen Kommentar verpasst. Sie können es ohne dieses Flag ausführen. Das Beschneiden hätte jedes leere Festschreibungsobjekt entfernt.
mu

1
Sollte diese Zeile nicht git add .gitignore && commit -m "ignore rule for photos"seingit add .gitignore && git commit -m "ignore rule for photos"
Clone

@Clone ja, hätte das sein sollen, habe es jetzt korrigiert :)
mu 無

1
Dies ist eine wahnsinnig tolle Antwort. Es wurde ein Problem behoben, das ich seit mehreren Jahren mit meinem Repo habe. Vielen Dank!
Moshe

18

Eine sehr einfache Antwort ist.

Schritt 1:

Fügen Sie zunächst Ihre nicht verfolgten Dateien hinzu, zu denen Sie löschen möchten:

mit git add .oder git add <filename>.

Schritt 2:

Dann löschen Sie sie leicht Befehl git rm -f <filename>hier rm = entfernen und f = forcely.


Dies wird nicht das tun, was das OP will, nämlich Dateien zu entfernen, die in früheren Commits vorhanden waren. Sie müssen git filter-branchwie an anderer Stelle erwähnt verwenden.
Simon Stevens

9

Schritt 1

Fügen Sie der Datei die .gitignoreDateinamen hinzu.

Schritt 2

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

Schritt 3

git push -f origin branch

Ein großes Dankeschön an @mu.


7
... ich dachte immer, git sei schwieriger als es sein sollte, das beweist es. Es gibt keine Möglichkeit, sich an die Existenz der meisten Git-Befehle zu erinnern, geschweige denn an ihre Flaggen und Macken. Das Git-Modell ist sinnvoll und funktioniert so lange, bis Sie dem einfachen Ablauf folgen. Sobald Sie stecken bleiben, bleiben Sie hart stecken.
Muhammad Umer

2
Dies ist die Lösung, die für mich funktioniert, ich brauchte die--ignore-unmatch
guhur


1

Diese Ketten funktionieren in meinem Fall:

  1. git rm -r WebApplication/packages

Es gab einen Bestätigungs-Git-Dialog. Sie sollten die Option "y" wählen.

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

0
git stash 

hat den Job gemacht, es hat die Dateien wiederhergestellt, die ich mit rmanstatt gelöscht hatte git rm.

Ich habe zuerst den letzten Hash ausgecheckt, aber ich glaube nicht, dass dies erforderlich ist.


0

Verwenden Sie den folgenden Befehl, um die verfolgte und alte festgeschriebene Datei aus git zu entfernen. Hier in meinem Fall möchte ich die gesamte Datei entfernen und aus dem distVerzeichnis entfernen .

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

Dann müssen Sie es zu Ihrem hinzufügen, .gitignoredamit es nicht weiter verfolgt wird.


-1

Ich hatte ein doppeltes Verzeichnis (~ web / web) und es entfernte das verschachtelte Duplikat, als ich es rm -rf webim ersten Webordner ausführte.


Es tut uns leid! Ich muss die Frage falsch verstanden haben. Ich dachte, das war das Ziel
ccsinsf
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.