Как я могу исключить файлы из git ls файлов?

Как мне перечислить все, кроме файлов разметки? Я попробовал, как показано в приведенном ниже коде, запустить ls файлы с флагом -exclude, но исключенные файлы все еще отображаются на выходе.

Моя версия git - 2.6.4 (Apple Git -63)

$ git ls-files
ChromeExt/read-coffee
Node/README.md
Node/web-scraping
README.md

$ git ls-files --exclude *.md
ChromeExt/read-coffee
Node/README.md
Node/web-scraping
README.md

Ответ 1

Git имеет свой собственный способ расширения шаблонов глобуса, в том числе способ исключения файлов, которые соответствуют одному шаблону, но не другому. Например, следующее перечислит все пути, не заканчивающиеся на .md:

git ls-files -- . ':!:*.md'

Важно процитировать шаблон, потому что вы хотите, чтобы git анализировал его, а не оболочку.

И сопоставить все файлы, заканчивающиеся на .js, кроме тех, которые заканчиваются на .min.js:

git ls-files -- '*.js' ':!:*.min.js'

Вы также можете использовать это с другими командами, такими как git grep:

git grep -w funcname -- '*.js' ':!:*.min.js'

Этот синтаксис объясняется в pathspec в gitglossary (или git help glossary или man gitglossary)

Ответ 2

Это уже обсуждалось в 2010 году:

На странице руководства нет указания, что -x не относится к -c.

Отсюда сложение:

Начиная с b5227d8, -x / --exclude не применяется к кэшированным файлам.
Это легко пропустить, если вы не прочитаете обсуждение в разделе EXCLUDE PATTERNS. Уточнить, что параметр применяется к файлам неотслеживаемых и направить читателя к EXCLUDE PATTERNS.

Страница git ls-files упоминает:

-x <pattern>
--exclude=<pattern>

Пропустить неотслеживаемые файлы, соответствующие шаблону

Если ваш Readme.md отслеживается, шаблон исключения не применяется.

Ответ 3

Вам не нужно использовать параметр -exclude потому что этот ключ используется только для пропусков файлов без следа:

$ man git-ls-files

-x <pattern>, --exclude=<pattern>
       Skip untracked files matching pattern. Note that pattern is a shell wildcard pattern. See EXCLUDE PATTERNS below for more information.

Вы должны просто использовать маску для требуемых файлов

В вашем случае (исключая файлы *.md):

$ git ls-files
example1.txt
example2.pdf
readme.md

$ git ls-files *[^.md]
example1.txt
example2.pdf