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


192

Чи є спосіб ігнорувати всі файли типу в каталозі?

** виглядає безглуздо, щоб це не було, тому це не працює:

/public/static/**/*.js

Ідея полягає в узгодженні довільних вкладених папок.


Відповіді:


123

Ніколи не пробував, але git help ignoreприпускає , що якщо ви поставите .gitignoreз *.jsв /public/static, він буде робити те , що ви хочете.

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


19
Це не обов'язково найкраще рішення. Потенційно людям потрібно буде викопати різні файли .gitignore, щоб знайти, чому їх файл ігнорується. Деякі вважають за краще всю цю інформацію мати в одному .gitignore-файлі, що зберігається в кореневому каталозі repo.
Харен

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" тощо.

  • Інші поспіль зірочки вважаються недійсними.


1
в чому різниця між xxx/**і xxx/?
thuzhf

9
xxx/**націлює всі файли та каталоги всередині, xxxтоді як xxx/націлює на xxxкаталог безпосередньо. Це дійсно має значення лише при запереченні шаблонів з !"Неможливо повторно включити файл, якщо батьківський каталог цього файлу виключений.", Тому використання xxx/*або xxx/**було б необхідне в такому випадку.
joeyhoer

4
Всі файли із закінченням .meta повинні ігноруватися git. Як це працює? **.js?
Чорний

"Інші поспіль зірочки вважаються недійсними." підсумовує все
imrok

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не відповідатиме, оскільки візерунок містить a /.
joeyhoer

@JoeyHoer спасибі за підказку, я відповідно оновив свою відповідь.
Адам Шарп

9

Щоб ігнорувати відслідковувані файли, просто перейдіть до .git / info / виключити. Виключити - це файл зі списком ігнорованих розширень або файлів.


2
Це не переноситься на інші клони сховища на зразок .gitignore (звичайно після завершення).
jpmc26

3

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

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

Я виявив, що вирізання ./на початку часто потрібно, щоб git зрозумів, яких файлів уникати. Тому cut -c 3-.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.