Geänderte (aber nicht festgeschriebene) Dateien in Git ignorieren?

181

Kann ich git anweisen, Dateien zu ignorieren, die geändert (gelöscht) wurden, aber nicht festgeschrieben werden sollten?

Die Situation ist, dass ich im Repo ein Unterverzeichnis habe, das Dinge enthält, an denen ich überhaupt nicht interessiert bin. Deshalb habe ich es gelöscht, um zu verhindern, dass es in automatischen Vervollständigungen und dergleichen (in der IDE) angezeigt wird.

Aber jetzt, wenn ich diesen Ordner zu .gitignore hinzufüge, ändert sich einfach nichts. Das gesamte Material wird durch den Git-Status als gelöscht angezeigt.

Gibt es eine Möglichkeit, Git dazu zu bringen, es so oder so zu ignorieren?

(Wenn ich git-svn verwende, kann ich alternativ die Änderungen an das lokale git übergeben und sicherstellen, dass sie nicht an das svn-Repo weitergegeben werden?)

Sam
quelle
Anstatt sie nur im Repo-Index als unverändert zu markieren, möchten Sie sie möglicherweise vollständig aus dem Index entfernen. Während Sie die Datei also noch in Ihrem Arbeitsverzeichnis haben, kann der Repo-Index vollständig gelöscht werden, und Git wird ihn nicht einmal als überhaupt vorhanden ansehen. Bitte beachten Sie den Link in meiner Antwort unten.
MaurerPower

Antworten:

274

Besuche die aus git-update-Index - man - Seite und den --assume-Bit unverändert und bezogen.

Wenn ich dein Problem habe, mache ich das

git update-index --assume-unchanged dir-im-removing/

oder eine bestimmte Datei

git update-index --assume-unchanged config/database.yml
csmosx
quelle
3
Können Sie alle Ihre ignorierten Dateien irgendwie auflisten?
Zitrax
21
Sie können die Dateien mitgit update-index --no-assume-unchanged config/database.yml
Denis Kniazhev
1
In der Antwort von Dave L unten finden Sie eine neuere Lösung ohne einige der Mängel von --assume-unchanged.
Ben Challenor
2
Ist es möglich, dies zur Repository-Konfigurationsdatei hinzuzufügen, anstatt diesen Befehl jedes Mal manuell auszuführen?
Tim Boland
1
Wird es für das nächste Commit als geändert angezeigt? Ich möchte nicht, dass es für immer unverändert angenommen wird.
Pranav Nandan
41

Eine neuere und bessere Option ist eine, git update-index --skip-worktreedie bei einem Hard-Reset oder einer neuen Änderung durch Ziehen nicht verloren geht.

Siehe die Manpage unter http://schacon.github.com/git/git-update-index.html

Und ein Vergleich unter http://fallengamer.livejournal.com/93321.html

Dave L.
quelle
9
Ein Nachteil ist, dass skip-worktreees etwas umständlich ist, diese Dateien zu finden , sobald die Änderungen einer Datei ausgeblendet wurden . Der einzige Weg, den ich kenne, ist git ls-files -v |grep -v '^H'. Außerdem kennen viele GUI-Tools diese Funktion nicht und können lustige Fehler verursachen, wenn z. B. ein Fehler checkoutaufgrund "versteckter" geänderter Dateien auftritt.
Sleske
Ich habe noch nie eine der Git-Doc-Dateien verstanden. Das ist also keine große Hilfe. (Jede Dokumentdatei setzt voraus, dass Sie die Feinheiten jeder anderen Dokumentdatei verstehen!)
Scott Biggs
7

Verwenden Sie diesen Code

git update-index --assume-unchanged file-name
Sujiraj R.
quelle
1
Wirklich interessant. Ich muss ein Passwort in meinem Maven-Projekt verwenden, möchte es aber nicht in einem Git-Repository veröffentlichen. Deshalb habe ich einen Platzhalter ohne Wert in die lokalen Eigenschaften eingefügt, es festgeschrieben, dann das Kennwort eingefügt, aber das markiert Datei unverändert mit Ihrem vorgeschlagenen Befehl. Das Passwort wird also nicht veröffentlicht.
Stefano Scarpanti
6

Verfolgte Dateien können nicht ignoriert werden, daher müssen Sie sie zuerst aus Ihrem Index entfernen. Fügen Sie ein hinzu .gitignore, das die nicht gewünschten Verzeichnisse ignoriert, löschen Sie sie und entfernen Sie alle Nachzügler mit git rm --cached.

John Feminella
quelle
1
Hm, ich versuche das, aber dann habe ich alle Dateien als gelöscht aufgelistet. Sollte ich das festschreiben und das --cached wird dazu führen, dass es nicht auf Fernbedienungen übertragen wird? Oder habe ich etw bekommen? falsch? Das Wichtigste für mich ist, das Remote-Repo (SVN) nicht zu beschädigen.
1
Sie können nichts festschreiben, was nicht in Ihrem Index beginnt. git rm - hat alles zwischengespeichert, was Sie nicht festschreiben möchten, und dann lokal eine .gitignore-Datei hinzugefügt, die "*" enthält. Egal wie viel Sie hinzufügen, Sie werden diese Dateien nie wieder in Ihrem Index sehen.
John Feminella
Ah, ich glaube ich verstehe - jetzt zwischengespeichert. Es entfernt nur das Zeug aus dem Index und lässt den Arbeitsbaum in Ruhe. Ich bin nicht sicher, ob mir etwas fehlt, aber AFAIS, ich suche das Gegenteil Entfernen Sie es aus dem Arbeitsbaum, ohne den Index zu berühren. Oder kann ich es irgendwie dafür verwenden?
6

Was ich normalerweise mache ist

git stash

git was auch immer - sonst

Git Stash anwenden

git stash klar

Walter
quelle
10
fwiw Sie können auch 'git stash pop' verwenden, um die letzten beiden auf einmal zu erledigen (obwohl 'git stash clear' ALLE Stash-Einträge löscht, wenn Sie das möchten).
Groxx