2012-11-24 4 views
167

Ich habe einige Dateien in meinem Repository, die ignoriert werden sollten, ich habe sie zum .gitignore hinzugefügt, aber sie werden natürlich nicht aus meinem Repository entfernt.Wie werden Dateien entfernt, die im .gitignore aufgelistet sind, aber immer noch im Repository?

Also meine Frage ist, gibt es einen magischen Befehl oder ein Skript mit Filter-Zweig, der meine Geschichte neu schreiben und alle diese Dateien leicht entfernen kann? Oder einfach ein Befehl, der ein Commit erstellt, das sie entfernt?

+3

Duplikat (http://stackoverflow.com/questions/1139762/gitignore-file-not-ignoring) –

+0

Ähnlich http://stackoverflow.com/questions/1274057/ [.gitignore nicht ignorieren Datei] Making-Git-vergessen-über-eine-Datei-das-war-verfolgt-aber-ist-jetzt-in-gitignore – testing

+0

Mögliche Duplikate von [Wie Git "vergessen" über eine Datei, die verfolgt wurde, aber jetzt ist. gitignore?] (https://stackoverflow.com/questions/1274057/how-to-make-git-forget-about-a-file-that-was-tracked-but-is-now-in-gitignore) –

Antwort

260

Sie können sie aus dem Repository manuell entfernen:

git rm --cached file1 file2 dir/file3 

Oder, wenn Sie viele Dateien haben:

git rm --cached `git ls-files -i --exclude-from=.gitignore` 

Aber dies scheint nicht in Git Bash unter Windows zu arbeiten . Es erzeugt eine Fehlermeldung. Die folgenden Werke besser:

git ls-files -i --exclude-from=.gitignore | xargs git rm --cached 

In Bezug auf die ganze Geschichte ohne diese Dateien umzuschreiben, ich bezweifle stark, es gibt eine automatische Weg, es zu tun.
Und wir alle wissen, dass das Umschreiben der Geschichte schlecht ist, oder? :)

+1

Leider funktioniert der Befehl Git Bash unter Windows nicht mit Pfaden, die Leerzeichen enthalten. –

+0

@NateBundy Wenn Sie sich auf die Tatsache beziehen, dass 'xargs' nicht mit Leerzeichen funktioniert, umgehen die meisten Befehlszeilen-Dienstprogramme dies mithilfe spezieller Flags so dass Leerzeichen keine Rolle spielen. Ich erinnere mich nicht mehr, was die Flags für "git ls-files" und "xargs" sind (ich denke, es könnte "-0" für "xargs" sein), aber Sie können sie nachschlagen. –

+10

@Cupcake danke. 'git ls-files -i -z --exclude-from = .gitignore | xargs -0 git rm --cached scheint den Trick zu tun –

-1

Der Git ignoriert die Dateien, die mit dem .gitignore-Muster übereinstimmen, nachdem Sie ihn zu .gitignore hinzugefügt haben.

Aber die Dateien bereits im Repository vorhanden sein wird noch in.

Verwendung git rm files_ignored; git commit -m 'rm no use files' ignoriert Dateien zu löschen.

+1

Dort sind viele von ihnen, gibt es eine Möglichkeit, sie zu löschen, ohne ihre Namen angeben zu müssen? – Intrepidd

197

Eine einfachere Art und Weise, die auf jedem Betriebssystem funktioniert, ist

git rm -r --cached . 
git add . 
git commit -m "Removing all files in .gitignore" 

Sie im Grunde readd alle Dateien zu tun, außer denen, die in dem .gitignore

+0

Wie wirkt sich dies auf andere Benutzer im Repo aus, die einen * Pull * ausführen - wie ich den Ordner lese, den wir nicht wollen zu verfolgen ist mehr gelöscht ??? Wie können wir das verhindern - wir wollen nur aufheben –

68

Da die Dateien in .gitignore werden Wenn Sie nicht verfolgt werden, können Sie den Befehl git clean verwenden, um Dateien rekursiv zu entfernen, die nicht unter Versionskontrolle stehen.

Verwenden Sie git clean -xdn, um einen Trockenlauf durchzuführen und zu sehen, was entfernt wird.
Verwenden Sie dann git clean -xdf, um es auszuführen.

Grundsätzlich git clean -h oder man git-clean (in Unix) wird Ihnen helfen.

Beachten Sie, dass dieser Befehl auch neue Dateien entfernt, die nicht im Bereitstellungsbereich sind.

Ich hoffe, es hilft.

+1

Dies sollte die akzeptierte Antwort sein.Es funktioniert tatsächlich (die akzeptierte Antwort funktionierte nicht für mich, auf macOS), und es ist Weg sauberer. –

+9

Diese Antwort ist nicht zutreffend - das OP sagt, dass die Dateien in '.gitignore' * * verfolgt werden –

+0

ACHTUNG! Das löscht alle nicht gekerbten Dateien, anstatt nur aus der Verzweigung zu entfernen – Emmanuel

3

habe ich eine sehr einfache Lösung, die durch die Ausgabe der .gitignore Anweisung mit sed manipulieren:

cat .gitignore | sed '/^#.*/ d' | sed '/^\s*$/ d' | sed 's/^/git rm -r /' | bash

Erläuterung:

  1. Druck des.gitignore Datei
  2. alle Kommentare aus dem
  3. Druck entfernen
  4. löschen Sie alle leeren Zeilen
  5. hinzufügen ‚git rm -r‘ an den Anfang der Zeile
  6. jede Zeile auszuführen.