Wie liste ich Dateien auf, die von git ignoriert werden und derzeit bereitgestellt oder festgeschrieben sind?
76
Wie erhält man eine Liste der Dateien, die einer Regel in der Gitignore-Datei entsprechen, aber in der Vergangenheit bereitgestellt oder festgeschrieben wurden?
Von den Antworten auf die andere Frage ist die gesuchte git ls-files -i --exclude-standardoder möglicherweise eine Variation davon.
Cascabel
10
Soweit ich weiß, ist dies KEIN Duplikat von ignorierten Dateien in Git . In dieser Frage wird gefragt, wie nicht verfolgte Dateien aufgelistet werden sollen, die ignoriert werden. In dieser Frage wird gefragt, wie Dateien aufgelistet werden sollen, die nachverfolgt werden (und daher von den Ignorierregeln ausgenommen sind), aber ignoriert werden, wenn sie nicht nachverfolgt werden.
Richard Hansen
Antworten:
100
Die Dokumentation zu ls-filesist nicht genau klar geschrieben, aber es scheint, dass der folgende einfache Alias die Arbeit erledigt:
Der obige Befehl erstellt einen Alias namens showtrackedignored. Führen Sie zur Verwendung Folgendes aus:
git showtrackedignored
und es werden alle Dateien im aktuellen Verzeichnis und in den Unterverzeichnissen aufgelistet, die verfolgt werden, aber ignoriert würden, wenn sie nicht verfolgt würden.
Bug in git ls-files
Leider funktioniert dies nicht 100% zuverlässig. Anscheinend hat Git einen guten Job - Dateien zu finden, sollte nicht außer Acht gelassen werden, aber wenn die Suche nach Dateien , die sind (die ignoriert -iOption git ls-files), spielt es keine Liste ignoriert Dateien in einem Verzeichnis , wenn es das Verzeichnis ist , dass die Regeln ignorieren übereinstimmt.
Um diesen Fehler zu umgehen, versuchen Sie, Ihre Ignorierregeln so zu konvertieren, dass nur Dateien und keine Verzeichnisse übereinstimmen (dies ist nicht immer möglich).
(Vielen Dank an Christoph, dass er diesen Fehler entdeckt und an die Git-Mailingliste gemeldet hat ! Bearbeiten: Ein Patch ist derzeit in Arbeit und wird in Git 1.7.11.2 oder höher aufgenommen.)
Alternativer Ansatz
Hier ist ein anderer Ansatz. Es ist weitaus komplizierter und hat möglicherweise kaputte Eckfälle.
cdzurück zu dem Verzeichnis, von dem git showtrackedignoredaus ausgeführt wurde (Git führt Shell-basierte Aliase aus dem Verzeichnis der obersten Ebene aus, nicht aus dem aktuellen Verzeichnis; siehe Abschnitt in alias.*in git help config)
Definieren Sie eine Variable namens untracked_list. Diese Variable enthält den Pfad zu einer temporären Datei, die die Liste der derzeit ignorierten Dateien enthält. Diese temporäre Datei befindet sich im .gitVerzeichnis.
Schreiben Sie die Liste der ignorierten Dateien in ${untracked_list}.
Sagen Sie Git, er soll so tun, als wäre der Index leer, und alle ignorierten Dateien auflisten.
Leiten Sie diese Ausgabe an weiter grep, wodurch die Dateien herausgefiltert werden, in die geschrieben wurde ${untracked_list}.
Löschen Sie die temporäre Datei ${untracked_list}.
Nachteile dieses Ansatzes:
Es wird eine temporäre Datei in Ihrem .gitVerzeichnis erstellt.
Es wird davon ausgegangen, dass Sie eine POSIX-kompatible Shell haben.
Es wird davon ausgegangen, dass Sie eine POSIX-kompatible Implementierung von haben grep.
Es leidet auch unter dem gleichen Fehler wie der frühere Alias.
Gab es in letzter Zeit Änderungen an Git, die dieses Skript beschädigen? Es hat ziemlich gut funktioniert, seit ich es gefunden habe, aber ich habe kürzlich festgestellt, dass nicht alle Dateien / Ordner (oder vielleicht nur Ordner) erkannt werden, die festgeschrieben wurden, aber einem Ignoriermuster entsprechen. Ich bin auf Git 1.7.9.5. Irgendwelche Ideen?
Christoph
1
@Christoph: Funktioniert für mich mit 1.7.10 unter Linux (Ubuntu). Versuchen Sie, jeden Befehl einzeln manuell auszuführen, um festzustellen, welcher Teil des Skripts sich schlecht verhält. Wenn Sie das Problem finden, lassen Sie es mich wissen und ich werde meine Antwort aktualisieren. Lassen Sie mich auch wissen, ob Sie ein Beispiel-Repository erstellen können, das das Problem aufweist. Vielen Dank!
Richard Hansen
1
@Christoph: git help ignoresagt " foo/wird mit einem Verzeichnis foound Pfaden darunter übereinstimmen ". Anscheinend funktioniert der Teil "Pfade darunter", wenn Git versucht, die Dateien zu identifizieren, die nicht ignoriert werden. Er ist jedoch fehlerhaft, wenn Git versucht, die Dateien zu identifizieren, die ignoriert werden.
Richard Hansen
2
Heutzutage git ls-files -i --exclude-standardist wirklich der sauberere und richtig funktionierende Ansatz. Ich habe hier ein Repo, in dem der herkömmliche Alias falsche Ergebnisse liefert.
Christoph
1
@Christoph: Danke, ich habe die Antwort bearbeitet, um den einfacheren Ansatz an die Spitze zu setzen und dem komplexen Ansatz eine Warnung hinzuzufügen.
Richard Hansen
19
Ich werde diesen hier einfach lassen, basierend auf Richards Antwort:
Dadurch werden nicht verfolgte Dateien und Verzeichnisse aufgelistet. Wenn Sie die löschen d, werden nicht verfolgte Dateien zusammen mit inszenierten und festgeschriebenen Dateien aufgelistet. Meiner Meinung nach beantwortet es die Frage nicht wirklich.
Igel
@ Hedgehog: Es ist ein Duplikat, aber Seth hat die falsche Antwort daraus ausgewählt.
Cascabel
Ich bestreite nicht, dass sie sich in derselben Nachbarschaft befinden, aber dass es sich nicht um doppelte Fragen handelt, scheint aus der Beobachtung klar zu sein, dass nicht klar ist, welche dieser Antworten genau dies tut, wenn überhaupt. Die Frage in Ignorierte Dateien in Git anzeigen lautet "Liste der Dateien, die ignoriert werden"
git ls-files -i --exclude-standard
oder möglicherweise eine Variation davon.Antworten:
Die Dokumentation zu
ls-files
ist nicht genau klar geschrieben, aber es scheint, dass der folgende einfache Alias die Arbeit erledigt:Der obige Befehl erstellt einen Alias namens
showtrackedignored
. Führen Sie zur Verwendung Folgendes aus:und es werden alle Dateien im aktuellen Verzeichnis und in den Unterverzeichnissen aufgelistet, die verfolgt werden, aber ignoriert würden, wenn sie nicht verfolgt würden.
Bug in
git ls-files
Leider funktioniert dies nicht 100% zuverlässig. Anscheinend hat Git einen guten Job - Dateien zu finden, sollte nicht außer Acht gelassen werden, aber wenn die Suche nach Dateien , die sind (die ignoriert
-i
Optiongit ls-files
), spielt es keine Liste ignoriert Dateien in einem Verzeichnis , wenn es das Verzeichnis ist , dass die Regeln ignorieren übereinstimmt.Um diesen Fehler zu umgehen, versuchen Sie, Ihre Ignorierregeln so zu konvertieren, dass nur Dateien und keine Verzeichnisse übereinstimmen (dies ist nicht immer möglich).
(Vielen Dank an Christoph, dass er diesen Fehler entdeckt und an die Git-Mailingliste gemeldet hat ! Bearbeiten: Ein Patch ist derzeit in Arbeit und wird in Git 1.7.11.2 oder höher aufgenommen.)
Alternativer Ansatz
Hier ist ein anderer Ansatz. Es ist weitaus komplizierter und hat möglicherweise kaputte Eckfälle.
Der Alias führt Folgendes aus:
cd
zurück zu dem Verzeichnis, von demgit showtrackedignored
aus ausgeführt wurde (Git führt Shell-basierte Aliase aus dem Verzeichnis der obersten Ebene aus, nicht aus dem aktuellen Verzeichnis; siehe Abschnitt inalias.*
ingit help config
)untracked_list
. Diese Variable enthält den Pfad zu einer temporären Datei, die die Liste der derzeit ignorierten Dateien enthält. Diese temporäre Datei befindet sich im.git
Verzeichnis.${untracked_list}
.grep
, wodurch die Dateien herausgefiltert werden, in die geschrieben wurde${untracked_list}
.${untracked_list}
.Nachteile dieses Ansatzes:
.git
Verzeichnis erstellt.grep
.Es leidet auch unter dem gleichen Fehler wie der frühere Alias.
quelle
git help ignore
sagt "foo/
wird mit einem Verzeichnisfoo
und Pfaden darunter übereinstimmen ". Anscheinend funktioniert der Teil "Pfade darunter", wenn Git versucht, die Dateien zu identifizieren, die nicht ignoriert werden. Er ist jedoch fehlerhaft, wenn Git versucht, die Dateien zu identifizieren, die ignoriert werden.git ls-files -i --exclude-standard
ist wirklich der sauberere und richtig funktionierende Ansatz. Ich habe hier ein Repo, in dem der herkömmliche Alias falsche Ergebnisse liefert.Ich werde diesen hier einfach lassen, basierend auf Richards Antwort:
git ls-files -i --exclude-standard | xargs git rm --cached
Dadurch wird jede verfolgte Datei gelöscht, die von ignoriert wird
.gitignore
.quelle
Diese Frage wurde von https://stackoverflow.com/a/467053 gut beantwortet . Grundsätzlich sagt Ihnen git clean -ndX, was sicher ignoriert werden kann.
quelle
d
, werden nicht verfolgte Dateien zusammen mit inszenierten und festgeschriebenen Dateien aufgelistet. Meiner Meinung nach beantwortet es die Frage nicht wirklich.