Найти файлы, которые не находятся в .gitignore

У меня есть команда, отображающая файлы в моем проекте:

find . -type f -not -path './node_modules*' -a -not -path '*.git*' \ -a -not -path './coverage*' -a -not -path './bower_components*' \ -a -not -name '*~' 

Как фильтровать файлы, чтобы они не отображали те, которые находятся в .gitignore?

Я думал, что использую:

 while read file; do grep $file .gitignore > /dev/null && echo $file; done 

но файл .gitignore может иметь шаблоны glob (также он не будет работать с путями, если файл находится в .gitignore). Как фильтровать файлы на основе шаблонов, которые могут иметь globs?

4 Solutions collect form web for “Найти файлы, которые не находятся в .gitignore”

git обеспечивает git-check-ignore чтобы проверить, исключен ли файл .gitignore .

Таким образом, вы можете использовать:

 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 {} + 

Обратите внимание, что вы заплатили бы за это большую плату, потому что проверка была выполнена для каждого файла.

Чтобы показать файлы, находящиеся в вашем контроле, и которые отслеживаются Git, используйте

 $ git ls-files 

Эта команда имеет несколько параметров для показа, например, кешированные файлы, необработанные файлы, измененные файлы, проигнорированные файлы и т. Д. См. git ls-files --help .

есть команда git для выполнения именно этого: например

 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. ie it was created 

Как вы заявили, он будет делать основной grep будет большинство стандартных параметров grep, но он не будет искать .git или любые файлы или папки в вашем файле .gitignore .
Для получения дополнительной информации см. man git-grep

подмодули:

Если у вас есть другие репозитории git внутри этого git-репо (они должны быть в подмодулях), вы можете использовать флага --recurse-submodules для поиска в подмодулях, а также

Вы можете использовать массив, в котором будет выполняться шайба bash.

Имея такие файлы:

 touch file1 file2 file3 some more file here 

И имея файл ignore подобный этому

 cat <<EOF >ignore file* here EOF 

С помощью

 arr=($(cat ignore));declare -p arr 

Это приведет к следующему:

 declare -a arr='([0]="file" [1]="file1" [2]="file2" [3]="file3" [4]="here")' 

Затем вы можете использовать любую технику для управления этими данными.

Я лично предпочитаю что-то вроде этого:

 awk 'NR==FNR{a[$1];next}(!($1 in a))' <(printf '%s\n' "${arr[@]}") <(find . -type f -printf %f\\n) #Output some more ignore 
  • mv жалуется на стандартный ввод в конвейере, который фильтрует имя файла с помощью grep
  • Определите подкаталоги, которые не содержат определенную строку в определенном файле
  • Распечатайте строку только в том случае, если следующая строка НЕ ​​содержит определенное совпадение
  • Получить имя и использование файловой системы с помощью `df -h`
  • Выход grep cdrecord
  • Сравните два файла и сопоставленную строку для отправки в новый файл
  • ps | grep показывает плохой результат в подоболочке с заданиями, работающими в фоновом режиме
  • Тарные файлы, начинающиеся с того же шаблона
  • извлечение строк из большого текстового файла
  • Извлечение строки через утверждения grep regex
  • Измените текст в теге, но только тег содержится в определенном блоке XML
  • Linux и Unix - лучшая ОС в мире.