Entfernen Sie einen Ordner aus dem Git-Tracking

404

Ich muss einen Ordner (Namens-Uploads) vom Tracking ausschließen. Ich habe versucht zu rennen

git rm -r --cached wordpress/wp-content/uploads

und danach habe ich den Pfad zu .gitignore hinzugefügt

/wordpress/wp-content/uploads

aber wenn ich lief, werden git statussie als gelöscht angezeigt. Wenn ich versuche, die Änderungen zu übernehmen, werden die Dateien gelöscht und nicht nur aus der Nachverfolgung entfernt.

Was mache ich falsch?

Ich habe es auch versucht

git update-index --assume-unchanged <file>

Dies scheint jedoch nur Dateien zu entfernen. Ich muss jedoch einen ganzen Ordner (einschließlich Unterordner) aus der Verfolgung entfernen.

Stefan Diabo
quelle
Gelöscht bedeutet nicht, dass Git Ihre Dateien löschen wird. Wenn Sie jedoch verwenden reset --hard, wird es.
Keltar
2
Wie @keltar erwähnt, werden Ihre Dateien beim Festschreiben nicht gelöscht. Sie werden von Git gelöscht , aber Ihre Arbeitskopie enthält sie weiterhin. Aber wenn man pulldie woanders diese Dateien begehen werden von dem neuen System gelöscht.
Chris

Antworten:

867

Ich bin auf diese Frage gestoßen, als ich nach "git Ordner aus Tracking entfernen" gegoogelt habe. Die Frage des OP führte mich zur Antwort. Ich fasse es hier für zukünftige Generationen zusammen.

Frage

Wie entferne ich einen Ordner aus meinem Git-Repository, ohne ihn von meinem lokalen Computer (dh der Entwicklungsumgebung) zu löschen?

Antworten

Schritt 1. Fügen Sie den Ordnerpfad zur Stammdatei Ihres Repos hinzu .gitignore.

path_to_your_folder/

Schritt 2. Entfernen Sie den Ordner aus Ihrem lokalen Git-Tracking, aber behalten Sie ihn auf Ihrer Festplatte.

git rm -r --cached path_to_your_folder/

Schritt 3. Übertragen Sie Ihre Änderungen auf Ihr Git-Repo.

Der Ordner wird aus Git-Sicht als "gelöscht" betrachtet (dh er befindet sich in der Vergangenheit, aber nicht im letzten Commit, und Personen, die aus diesem Repo ziehen, erhalten die Dateien aus ihren Bäumen entfernt), bleiben jedoch in Ihrem Arbeitsverzeichnis weil du benutzt hast --cached.

Tod Birdsall
quelle
2
Kurze Frage, muss der Ordnerpfad der vollständige Pfad sein? oder nur der Pfad mit dem Git-Repository als Basis?
HMSCelestia
Ich glaube, es ist der volle Weg, aber ich erinnere mich nicht sicher.
Tod Birdsall
7
"Und Leute, die aus diesem Repo ziehen, werden die Dateien von ihren Bäumen entfernen." Kann ich das verhindern?
Leo Gasparrini
Dadurch wurden meine Dateien korrekt aus der Verfolgung in einem Zweig entfernt, aber nach einer Zusammenführung gelöscht!
Harold
1
für mich bleibt noch. Außerdem - sollte ich beim Festschreiben die Auswahl der Dateien aufheben, die sich im Ordner befinden? Ich habe es in beide Richtungen versucht. Wenn die Auswahl aufgehoben wird, kann kein Push ausgeführt werden, aber dann habe ich ein Zeichen in einer anderen Datei geändert, die verfolgt werden soll.
Hilft
44

Das funktioniert bei mir:

git rm -r --cached --ignore-unmatch folder_name

--ignore-unmatch ist hier wichtig, ohne diese Option wird git mit einem Fehler in der ersten Datei beendet, die nicht im Index enthalten ist.

qed
quelle
unknown option 'ignore unmatched'
Inigo
Dies ist ein wichtiges Flag, wenn das Verzeichnis leer ist. Danke!
MNN
Sehr nützlich, wenn Sie nur bestimmte Dateierweiterungen aus einem Verzeichnis entfernen möchten:git rm -r --cached --ignore-unmatch .idea/*.xml
takanuva15
14

Um das Verzeichnis rekursiv zu vergessen, fügen Sie /*/*es dem Pfad hinzu:

git update-index --assume-unchanged wordpress/wp-content/uploads/*/*

Die Verwendung git rm --cachedist nicht gut für die Zusammenarbeit. Weitere Details hier: Wie kann ich das Tracking beenden und Änderungen an einer Datei in Git ignorieren?

Vitalets
quelle
1
Dies ist eine sehr elegante Lösung! Der rekursive Pfadtrick hat mir den Tag gerettet. Vielen Dank!
Aziz Alto
8

Ich weiß, dass dies ein alter Thread ist, aber ich wollte nur ein wenig hinzufügen, da die markierte Lösung das Problem für mich nicht gelöst hat (obwohl ich es oft versucht habe).

Die einzige Möglichkeit, die Verfolgung des Ordners durch Git-Formulare zu stoppen, bestand darin, Folgendes zu tun:

  1. Erstellen Sie eine Sicherungskopie des lokalen Ordners und bewahren Sie diese an einem sicheren Ort auf.
  2. Löschen Sie den Ordner aus Ihrem lokalen Repo
  3. Stellen Sie sicher, dass der Cache geleert ist git rm -r --cached your_folder/
  4. In your_folder/.gitignore
  5. Änderungen festschreiben
  6. Fügen Sie das Backup wieder Ihrem Repo hinzu

Sie sollten jetzt sehen, dass der Ordner nicht mehr verfolgt wird.

Fragen Sie mich nicht, warum das Löschen des Caches bei mir nicht funktioniert hat. Ich bin kein Git-Super-Assistent, aber so habe ich das Problem gelöst.

lukehillonline
quelle
Vielen Dank!!! Git hat mich verrückt gemacht, ohne den Eclipse-Metadatenordner zu ignorieren. Befolgen Sie Ihre Schritte mit dem Ordner "Eclipse .metadata", und es hat endlich funktioniert.
MasterN8
5

Aus der Git-Dokumentation:

Eine weitere nützliche Sache, die Sie möglicherweise tun möchten, ist, die Datei in Ihrem Arbeitsbaum zu belassen, sie jedoch aus Ihrem Staging-Bereich zu entfernen. Mit anderen Worten, Sie möchten die Datei möglicherweise auf Ihrer Festplatte behalten, aber Git lässt sie nicht mehr verfolgen. Dies ist besonders nützlich, wenn Sie vergessen haben, Ihrer .gitignore-Datei etwas hinzuzufügen und diese versehentlich bereitgestellt haben, z. B. eine große Protokolldatei oder eine Reihe kompilierter .a-Dateien. Verwenden Sie dazu die Option --cached:

$ git rm --cached readme.txt

Also vielleicht nicht das "-r" einschließen?

user3750325
quelle
1
Das OP hat es bereits versucht --cached. Die -rOption ist für "rekursiv", was in dieser Instanz enthalten sein sollte.
Chris
Ich fand das nützlich. Ich habe nach einer Vorgehensweise in einem Ordner gesucht und dann nach einer Vorgehensweise in einer Datei gesucht. Ich markiere diesen Kommentar.
Licht