2017-05-18 1 views
0

Ich habe eine Datei "npz, spezies_coex.npz", die irrtümlich zu meinem Git-Repository hinzugefügt wurde. Nachdem ich meinen Fehler erkannt hatte, entfernte ich ihn mit git rm. Jetzt habe ich herausgefunden, dass der Gitarist immer noch davon weiß (was normalerweise gut ist, aber ich möchte, dass git es komplett vergisst, als ob es nie an erster Stelle hinzugefügt worden wäre).Eine Datei dauerhaft aus einem Repository entfernen, git

Ich habe über den Filter-Zweig-Befehl gelesen, aber möchte es nicht verwenden, wegen all der Warnungen darüber, wenn dies nicht möglich ist, sagen Sie es mir.

ich this gelesen haben, sie empfehlen:

$ git filter-branch --tree-filter 'rm -f "npz, species_coex.npz" ' HEAD 

ich den Fehler:

fatal: ambiguous argument 'npz, species_coex.npz': unknown revision or path not in the working tree 

Ich bin nicht sicher, warum dieses Problem, weil der Leerraum auftritt (die Ich vermute nicht, wie ich es in Anführungszeichen gesetzt habe) oder weil die Datei nicht im aktuellen Kopf ist? Wie kann ich ihm sagen, wo diese Datei gefunden wird?

Und gibt es einen Weg, wie ich das ohne Filterzweig machen kann? Ich habe nur die Datei einmal hinzugefügt und dann entfernt, so ist es Geschichte ist ganz einfach

+1

Der '--tree-Filter' ist extrem langsam, aber die zitierte Empfehlung sollte funktionieren. Es scheint, dass Sie 'git rm' und nicht nur' rm' in Ihrem 'filter-branch' verwendet haben.Verwenden Sie "BFG" (suchen Sie nach dem Namen), um unerwünschte Dateien viel schneller zu entfernen. Beachten Sie jedoch, dass es das gleiche Problem wie bei einem Filterzweig hat: Sie müssen das Repository oder zumindest alle Teile an und nach der "schlechten" Datei in neue Commits kopieren, die nicht mehr mit den ursprünglichen Commits kompatibel sind, und * alle * muss sich dann ändern, um dies zu berücksichtigen. – torek

Antwort

2

Das "Problem" mit filter-branch ist das gleiche wie mit jedem Befehl, der die Geschichte der bereits gedrückten Commits ändert. Wenn jemand anderes diesen Commit bereits hat und eine Verzweigung darauf basiert, muss er seinen Verlauf (d. H. Alle anderen manuell) manuell korrigieren, wie in der Hilfe von git rebase unter der Überschrift RECOVERING FROM UPSTREAM REBASE beschrieben.

Wenn Sie die Datei aus dem Verlauf löschen möchten, weil es e. G. enthält vertrauliche Informationen wie Passwörter, Sie haben keine andere Chance als den Verlauf zu ändern, egal welches Werkzeug Sie dafür verwenden, sei es git rebase -i, git filter-branch oder das Tool BFG.

Mit filter-branch sollten Sie die --tree-filter nicht verwenden, da sie für jeden Commit einen vollständigen Arbeitsbaum benötigt. Dies ist notwendig, wenn Sie einige Dateien hinzufügen oder ändern möchten. Wenn es nur darum geht, Dateien zu löschen, sollten Sie stattdessen --index-filter verwenden und nur auf dem Index und nicht auf dem Arbeitsbaum arbeiten, der nicht verfügbar ist. Ihr Filterbefehl wird dann etwa so aussehen: --index-filter 'git rm --cached --ignore-unmatch "npz, species_coex.npz"'.

Der Fehler, den Sie mit Ihrem Versuch bekam bedeutet, dass Sie nicht rm ... verwendet haben aber git rm ... in Ihrem Filter Befehl, aber ohne die --ignore-unmatch die git sagt, es zu ignorieren, wenn Sie versuchen, eine nicht vorhandene Datei, ähnlich wie -f was zu löschen unter anderem für das normale rm Dienstprogramm.

Wenn Sie die Datei ein paar Commits hinzugefügt haben, könnte es einfacher und schneller sein, eine interaktive Rebase zu verwenden. Tun Sie einfach git rebase -i <the commit before the one that added the file>, dann im Editor ändern Sie die Zeilengruppe zu edit für das Commit, das die Datei hinzugefügt und den Editor beendet. Wenn Git aufhört, löschen Sie die Datei aus dem aktuellen Commit wie git rm 'npz, species_coex.npz' && git commit --amend -C HEAD und setzen Sie die Neuausrichtung mit git rebase --continue fort. Nachdem Git beendet ist, sollten Sie eine neue Version Ihres Verlaufs ohne die Datei haben.

+0

Danke für die Hilfe, aber nichts hat wirklich geholfen: wenn ich git filter-branch eingib --index-filter 'git rm ...' sagt er fatal: mehrdeutiges Argument 'rm': unbekannte Revision oder Pfad nicht im Arbeitsbaum . Also habe ich versucht mit dem normalen rm, aber dann sagt er nur die Verwendung: git filter-branch ... Und erklärt, wie man den filter branch Befehl verwendet. Die zweite Option, die Sie verwenden, funktioniert nicht/ich weiß nicht, was zu tun ist, weil es das erste Commit ist, das diese Datei hinzugefügt hat, also war ich nicht sicher, was ich auschecken sollte. –

+0

Danke, jetzt hat alles geklappt (nur git rebase --root) –

+0

Ja, wenn es das erste Commit ist, das geändert werden soll, dann braucht 'rebase'' root' anstelle eines Upstream-Commits. Aber 'filter-branch' hätte auch funktionieren sollen. Natürlich nicht mit 'rm', da es in einem' --index-filter' keinen worktree gibt, also kann man die Datei nicht mit 'rm' löschen, wie ich in der Antwort erklärt habe. Aber mit 'git rm --cached --ignore-unmatch" npz, spezies_coex.npz "' hätte es funktionieren sollen. Ich müsste den vollen Befehl sehen, um dir zu sagen, was du falsch gemacht hast. – Vampire

Verwandte Themen