Ich habe einen Suchbefehl, der Dateien in meinem Projekt anzeigt:
find . -type f -not -path './node_modules*' -a -not -path '*.git*' \
-a -not -path './coverage*' -a -not -path './bower_components*' \
-a -not -name '*~'
Wie kann ich die Dateien filtern, sodass die in .gitignore enthaltenen nicht angezeigt werden?
Ich dachte, ich verwende:
while read file; do
grep $file .gitignore > /dev/null && echo $file;
done
aber .gitignore-Dateien können Glob-Muster enthalten (außerdem funktioniert es nicht mit Pfaden, wenn die Datei im .gitignore-Format vorliegt). Wie kann ich Dateien basierend auf Mustern filtern, die möglicherweise Globs enthalten?
Antwort1
git
bietetgit-check-ignore
um zu prüfen, ob eine Datei von ausgeschlossen ist .gitignore
.
Sie könnten also Folgendes verwenden:
find . -type f -not -path './node_modules*' \
-a -not -path '*.git*' \
-a -not -path './coverage*' \
-a -not -path './bower_components*' \
-a -not -name '*~' \
-exec sh -c '
for f do
git check-ignore -q "$f" ||
printf '%s\n' "$f"
done
' find-sh {} +
Beachten Sie, dass Ihnen hierfür hohe Kosten entstehen, da die Prüfung für jede Datei durchgeführt wird.
Antwort2
Um Dateien anzuzeigen, die sich in Ihrem Checkout befinden und von Git verfolgt werden, verwenden Sie
$ git ls-files
Dieser Befehl bietet eine Reihe von Optionen zum Anzeigen von z. B. zwischengespeicherten Dateien, nicht verfolgten Dateien, geänderten Dateien, ignorierten Dateien usw. Siehe git ls-files --help
.
Antwort3
Es gibt einen Git-Befehl, der genau dies tut: zB
my_git_repo % git grep --line-number TODO
desktop/includes/controllers/user_applications.sh:126: # TODO try running this without sudo
desktop/includes/controllers/web_tools.sh:52: TODO: detail the actual steps here:
desktop/includes/controllers/web_tools.sh:57: TODO: check if, at this point, the menurc file exists. i.e. it was created
Wie Sie sagten, wird ein grundlegendes Grep mit den meisten normalen Grep-Optionen ausgeführt, es werden jedoch keine .git
Dateien oder Ordner in Ihrer .gitignore
Datei durchsucht.
Weitere Einzelheiten finden Sie unterman git-grep
Untermodule:
Wenn Sie andere Git-Repos in diesem Git-Repo haben (sie sollten in Untermodulen sein), können Sie das Flag --recurse-submodules
auch verwenden, um in den Untermodulen zu suchen
Antwort4
Sie können ein Array verwenden, in dem Bash Glob ausgeführt wird.
Dateien wie diese haben:
touch file1 file2 file3 some more file here
Und eine ignore
Datei wie diese zu haben
cat <<EOF >ignore
file*
here
EOF
Verwenden von
arr=($(cat ignore));declare -p arr
Wird zu folgendem Ergebnis führen:
declare -a arr='([0]="file" [1]="file1" [2]="file2" [3]="file3" [4]="here")'
Sie können diese Daten dann mit jeder beliebigen Technik bearbeiten.
Mir persönlich gefällt so etwas besser:
awk 'NR==FNR{a[$1];next}(!($1 in a))' <(printf '%s\n' "${arr[@]}") <(find . -type f -printf %f\\n)
#Output
some
more
ignore