Suchen Sie nach Dateien, die sich nicht in .gitignore befinden

Suchen Sie nach Dateien, die sich nicht in .gitignore befinden

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

gitbietetgit-check-ignoreum 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 .gitDateien oder Ordner in Ihrer .gitignoreDatei 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-submodulesauch 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 ignoreDatei 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

verwandte Informationen