Почему git ls-files --ignore требуют исключения шаблонов?

Какова логика требования использовать шаблон исключения с помощью команды git ls-files --ignored?

От git help ls-files:

-i, --ignored

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

Ответ 1

Прежде всего позвольте мне убедиться, что вы не путаете --ignored с --other.

--other - это вариант, который вы бы предоставили для списка невоспроизводимых файлов. Из руководства git-ls-files (выделено мной):

-o, --others

Показать другие (т.е. не проверенные) файлы на выходе

Итак, посмотрим, что делает --ignored. Независимо от того, что вы публикуете, независимо от того, отслеживали ли вы файлы, необработанные файлы, измененные файлы и т.д., Вы можете исключить некоторые файлы из вывода. Подумайте об этом как о бесплатном grep -v, автоматически создаваемом на выходе. Например:

git ls-files --other --exclude=*.o

перечислит все несохраненные файлы, которые не соответствуют *.o. Шаблон исключения не имеет ничего общего с .gitignore. Действительно, .gitignore определяет, что будет выводить --other, а --exclude фильтрует выход после завершения записи (или, по крайней мере, это наблюдаемое поведение) 1.

Теперь --ignored просто возвращает результат. Итак, что было исключено exclude=, будет напечатано вместо этого, и то, что не было исключено, будет опущено. Поэтому, например:

git ls-files --other --exclude=*.o --ignored

будет печатать все необработанные файлы, которые делают соответствуют *.o.

1 Не так, --exclude только фильтрует невоспроизводимые файлы, поэтому, если вы отправляете отслеживаемые файлы, --exclude ничего не исключит. Однако с --ignored он будет перечислять файлы, которые должны были быть исключены. Это немного странно.

Заключение: --ignored в основном вернет шаблон исключения, указанный в командной строке. По умолчанию шаблон exclude пуст (вы видите все), поэтому --ignored без каких-либо исключающих шаблонов приводит к тому, что все опущено. Это никогда не бывает полезным и поэтому для работы --ignored требуется шаблон исключения.


Поскольку упоминался --exclude-standard, я хотел бы также рассказать об этом. --exclude-standard добавит игнорируемые шаблоны (например, написанные в .gitignore) как исключающие шаблоны в листинге. Поэтому подумайте о следующей команде:

git ls-files --ignored --exclude-standard

Сначала эта команда выводит список всех отслеживаемых файлов. Затем, учитывая команду --ignored, она будет печатать только те файлы, которые соответствуют шаблону exclude. Учитывая --exclude-standard, будут напечатаны файлы, соответствующие шаблонам в .gitignore. НО это файлы, которые вы не отслеживали. Так эффективно, вы ничего не увидите. Единственный случай, который вы увидите что-то, - это если вы отслеживаете файлы, о которых вы также упоминали, чтобы их игнорировать в .gitignore.

Другими словами, если эта команда выводит что-либо, это означает, что вы сказали git игнорировать определенные файлы, но вы все равно нарушили свои собственные правила и добавили их в репозиторий.


Другими интересными командами могут быть:

git ls-files --other --exclude-standard

Показывает все ненужные файлы, которые вы не указали в .gitignore. Вы также увидите эти файлы в git status.

git ls-files --other --ignored --exclude-standard

Показывает все неископанные файлы, которые вам удалось успешно игнорировать с помощью .gitignore. Другими словами, (если предыдущий запрос пуст, т.е. Нет незарегистрированных файлов без следа), это показывает все файлы, которые находятся в текущем каталоге, которые не принадлежат репозиторию. Это полезно для проверки файлов, которые не должны игнорироваться и должны быть помещены в репозиторий.