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?

Igel
quelle
Mögliches Duplikat von Ignorierte Dateien anzeigen in git
Cascabel
1
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:

git config --global alias.showtrackedignored "ls-files -i --exclude-standard"

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.

git config --global alias.showtrackedignored '!
cd "${GIT_PREFIX}" &&
untracked_list=$(git rev-parse --git-dir)/ignored-untracked.txt &&
git ls-files -o -i --exclude-standard >"${untracked_list}" &&
GIT_INDEX_FILE="" git ls-files -o -i --exclude-standard | grep -Fvxf "${untracked_list}" &&
rm -rf "${untracked_list}"'

Der Alias ​​führt Folgendes aus:

  • 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.

Richard Hansen
quelle
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:

git ls-files -i --exclude-standard | xargs git rm --cached

Dadurch wird jede verfolgte Datei gelöscht, die von ignoriert wird .gitignore.

Timon de Groot
quelle
-3

Diese Frage wurde von https://stackoverflow.com/a/467053 gut beantwortet . Grundsätzlich sagt Ihnen git clean -ndX, was sicher ignoriert werden kann.

Seth
quelle
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"
Hedgehog