gitignore все файлы расширения в каталоге

192

Есть ли способ игнорировать все файлы типа в каталоге?

** Git, по-видимому, бессмысленно, так что это не работает:

/public/static/**/*.js

Идея состоит в том, чтобы соответствовать произвольным вложенным папкам.

Гарри
источник

Ответы:

123

Никогда не пробовал, но git help ignoreпредполагает , что если вы поставите .gitignoreс *.jsв /public/static, он будет делать то , что вы хотите.

Примечание: обязательно ознакомьтесь с ответом Джои ниже: если вы хотите игнорировать файлы в определенном подкаталоге, то локальное .gitignore - правильное решение (локальность хорошая). Однако если вам нужен один и тот же шаблон для применения ко всему репо, тогда ** решение лучше.

ptyx
источник
19
Это не обязательно лучшее решение. Потенциально люди должны будут копаться в разных файлах .gitignore, чтобы выяснить, почему их файл игнорируется. Некоторые предпочитают хранить всю эту информацию в одном файле .gitignore, хранящемся в корневом каталоге репо.
Haren
1
@haren это не единственное решение - ответ Джои, безусловно, также действителен. Выберите то, что работает лучше для вас. Я бы сказал, что правила игнорирования, локальные для каталога, должны находиться в этом каталоге, и что глобальные правила должны быть глобальными. (Кроме того, этот ответ древний, и я не думаю, что ** был поддержан в то время).
ptyx,
211

Похоже, что **синтаксис поддерживается с gitверсии в 1.8.2.1соответствии с документацией .

Две последовательные звездочки (" **") в шаблонах, сопоставленных с полным путем, могут иметь особое значение:

  • Ведущий " **", за которым следует косая черта, означает совпадение во всех каталогах. Например, " **/foo" соответствует файлу или каталогу " foo" где угодно, так же, как шаблон " foo". " **/foo/bar" соответствует файлу или каталогу " bar" в любом месте, которое находится непосредственно в каталоге " foo".

  • Трейлинг " /**" соответствует всему внутри. Например, " abc/**" соответствует всем файлам в каталоге " abc", относительно расположения .gitignoreфайла, с бесконечной глубиной.

  • Косая черта, за которой следуют две последовательные звездочки, затем косая черта соответствует нулю или нескольким каталогам. Например, " a/**/b" соответствует " a/b," a/x/b"," a/x/y/b"и так далее.

  • Другие последовательные звездочки считаются недействительными.

joeyhoer
источник
1
какая разница между xxx/**а xxx/?
thuzhf
9
xxx/**предназначается для всех файлов и каталогов внутри, xxxтогда как xxx/предназначается для xxxкаталога непосредственно. Это действительно имеет значение только при отрицании шаблонов с помощью !«Невозможно повторно включить файл, если исключен родительский каталог этого файла». Поэтому в этом случае необходимо использовать xxx/*или xxx/**будет необходимо.
Joeyhoer
4
Все файлы с окончанием .meta должны игнорироваться git. Как это работает? **.js?
черный
«Другие последовательные звездочки считаются недействительными». подводит
итоги
68

ОБНОВЛЕНИЕ: взгляните на ответ @ Joey : Git теперь поддерживает **синтаксис в шаблонах. Оба подхода должны работать нормально.


Страница руководства gitignore (5) гласит:

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

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

Образец вы предоставили

/public/static/**/*.js

не совсем правильно, во-первых, потому что (как вы правильно заметили) **синтаксис не используется Git. Кроме того, ведущие /привязывают этот шаблон к началу пути. (Таким образом, /public/static/*.jsбудет совпадать, /public/static/foo.jsно нет /public/static/foo/bar.js .) Удаление лидирующих /также не будет работать, сопоставляя пути, такие как public/static/foo.jsи foo/public/static/bar.js. РЕДАКТИРОВАТЬ: Простое удаление начального слеша также не сработает - поскольку шаблон по-прежнему содержит слеш, он обрабатывается Git как простой нерекурсивный глобус оболочки (спасибо @Joey Hoer за указание на это).

Как и предположил @ptyx, вам нужно создать файл <repo>/public/static/.gitignoreи включить только этот шаблон:

*.js

Ведущий отсутствует /, поэтому он будет совпадать с любой частью пути, и этот шаблон будет применяться только к файлам в /public/staticкаталоге и его подкаталогах.

Адам Шарп
источник
2
Это не совсем верно - в частности, часть «Удаление ведущих /также не будет работать, сопоставляя пути, такие как public/static/foo.jsи foo/public/static/bar.js». ложно Цитируем документацию: «Если шаблон не содержит косую черту /, Git обрабатывает его как шаблон оболочки и проверяет совпадение с именем пути относительно местоположения файла .gitignore (относительно верхнего уровня рабочего дерева, если не из файла .gitignore). " foo/public/static/bar.jsне будет соответствовать, потому что шаблон содержит /.
Joeyhoer
@JoeyHoer спасибо за подсказку, я обновил свой ответ соответственно.
Адам Шарп
9

Чтобы игнорировать неотслеживаемые файлы, просто перейдите в .git / info / exclude. Исключить - это файл со списком игнорируемых расширений или файлов.

Тьяго Рамос
источник
2
Это не переносится на другие клоны хранилища, как .gitignore (конечно, после фиксации).
jpmc26
3

Я считаю, что самым простым решением было бы использовать find. Мне не нравится, когда .gitignoreв подкаталогах много раз, и я предпочитаю управлять уникальным верхним уровнем .gitignore. Для этого вы можете просто добавить найденные файлы в свой .gitignore. Предположив , что /public/static/ваш проект / мерзавец домой , я хотел бы использовать что - то вроде:

find . -type f -name *.js | cut -c 3- >> .gitignore

Я обнаружил, что вырезание ./в начале часто необходимо, чтобы git понимал, каких файлов следует избегать. Поэтому cut -c 3-.

Garini
источник