Как перечислить все текстовые (небинные) файлы в репозитории git?

У меня есть репозиторий с большим количеством автогенерированных исходных файлов, которые я обозначил как "двоичный" в .gitattributes (они проверены, потому что не все имеют доступ к средствам генератора). Кроме того, у репо есть много исходных файлов в игнорируемых каталогах (опять же, сгенерировано как часть процессов сборки) и несколько реальных двоичных файлов (например, небольшие файлы ресурсов, такие как значки).

Теперь я хотел бы найти все неавтоматизированные и не проигнорированные файлы в репо. Я думал, что просто сделаю это с помощью find и кучей исключений, но теперь у меня есть ужасающий оператор find с дюжиной статей (и он все еще не выполняет эту работу). git ls-files работает, но показывает мне все двоичные файлы без дифференцирования, которые я должен отфильтровать.

Итак, мне интересно: есть ли простая команда, которую я могу запустить, которая перечисляет каждый файл, зарегистрированный в репо, и который git считает "текстовым" файлом?

Ответ 1

git grep --cached -Il ''

перечисляет все непустые регулярные (без символических ссылок) текстовые файлы:

  • -I: не соответствуют шаблону в двоичных файлах
  • -l: показывать только совпадающие имена файлов, а не соответствующие строки
  • '': пустая строка заставляет git grep соответствовать любому непустому файлу
  • --cached: также найти файлы, добавленные с добавлением git add но еще не выполненными (необязательно)

Или вы можете использовать Как определить, обрабатывает ли Git файл как двоичный или как текст? в цикле for с git ls-files.

TODO пустые файлы.

Найти все двоичные файлы: Найти все двоичные файлы в git HEAD

Протестировано на Git 2.16.1 с помощью этого тестового репо.

Ответ 2

Умный взлом для этого: перечисление всех не двоичных файлов, содержащих возврат каретки

$ git grep --cached -I -l -e $'\r'

В моем случае пустая строка работает лучше:

$ git grep --cached -I -l -e $''

Взял его из git список двоичных и/или недвоичных файлов?.

Ответ 3

Стандартный метод для перечисления не проигнорированных файлов:

git ls-files --exclude-standard --cached

Но, как вы видели, в нем перечислены все файлы с версиями.

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

git ls-files --exclude-standard --cached \
--exclude-from=/path/to/`exclude_binaries`

Это будет менее сложным find, но он не предоставляет полностью автоматизированный способ отображения недвоичных файлов: вам все равно придется идентифицировать и перечислить их в отдельном файле шаблонов.