Wie erhält man eine Liste der Dateien, die einer Regel in der Gitignore-Datei entsprechen, aber in der Vergangenheit bereitgestellt oder festgeschrieben wurden?
git ls-files -i --exclude-standardoder möglicherweise eine Variation davon.
Wie erhält man eine Liste der Dateien, die einer Regel in der Gitignore-Datei entsprechen, aber in der Vergangenheit bereitgestellt oder festgeschrieben wurden?
git ls-files -i --exclude-standardoder möglicherweise eine Variation davon.
Antworten:
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.
git ls-filesLeider 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.)
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)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.${untracked_list}.grep, wodurch die Dateien herausgefiltert werden, in die geschrieben wurde ${untracked_list}.${untracked_list}.Nachteile dieses Ansatzes:
.gitVerzeichnis erstellt.grep.Es leidet auch unter dem gleichen Fehler wie der frühere Alias.
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.
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.
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.
Diese Frage wurde von https://stackoverflow.com/a/467053 gut beantwortet . Grundsätzlich sagt Ihnen git clean -ndX, was sicher ignoriert werden kann.
d, werden nicht verfolgte Dateien zusammen mit inszenierten und festgeschriebenen Dateien aufgelistet. Meiner Meinung nach beantwortet es die Frage nicht wirklich.