Як реєструвати файли рекурсивно


106

Я намагаюся уникати наступного шаблону у своєму .gitignoreфайлі.

MyPrject/WebApp/Scripts/special/*.js
MyPrject/WebApp/Scripts/special/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*/*/*.js

Ми намагалися:

MyPrject/WebApp/Scripts/special/**.js
MyPrject/WebApp/Scripts/special/**/*.js

Однак це не спрацювало. Це git для Windows. Чи є більш стислий спосіб зробити це, не повторюючи речі?


Відповіді:


116

Що стосується git 1.8.2, це:

MyPrject/WebApp/Scripts/special/**/*.js

Чи слід працювати відповідно до цієї відповіді . Він також працює для мене в Windows 7, використовуючи Sourcetree 1.6.12.0 та версію git, яку він встановлює (1.8.4-попередній перегляд20130916).

Для рекурсивного перегляду кожного файлу та папки під каталогом:

MyPrject/WebApp/Scripts/special/**

А як щодо git 1,8?
ashes999

1
Якщо ця відповідь не працює (у Windows), додайте символ /на початку. Приклад:/MyProject/WebApp/Scripts/special/**/*.js
batressc

3
Мені бентежить, що моя відповідь продовжує отримувати відгуки, коли це буквально посилання на іншу відповідь.
Сем

1
@puk: .gitignoreв цьому питанні було в корені репо (батьківський каталог /Webapp).
lucid_dreamer

1
Ваша відповідь виглядає добре, але не працювала для мене в Windows 10 з git 1.9.1 для ігнорування всіх файлів, крім js у наступному випадку: (перший рядок) foo/bar/*/*(другий рядок) !foo/bar/**/*.jsВін працював лише для одного рівня підкаталогів, але не рекурсивно.
LLL

19

Наступна сторінка керівництва з gitignore:

[...] git трактує шаблон як глобус оболонки, придатний для споживання за допомогою fnmatch (3) з прапором FNM_PATHNAME: підстановочні символи у шаблоні не збігаються з а / в назви шляху.

Отже, це однозначно означає, що немає можливості вказати певну кількість каталогів між двома рядками, як-от між specialі js.

Тим не менш, ви можете мати .gitignoreфайл у каталозі, тому, можливо, у вашому випадку наступний вміст

*.js

в наступному місці

MyPrject/WebApp/Scripts/special/.gitignore

було б достатньо?


Раніше я мав, MyPrject/WebApp/Scripts/special*.jsі це MyPrject/WebApp/Scripts/specialfile.jsтакож збігалося MyPrject/WebApp/Scripts/special/a/b/c/file.js. Однак чомусь поведінка змінилася, і моє поточне вирішення - перераховувати каталоги індивідуально. Я використовую GitHub для Windows.
orad

1
наприкладfind MyPrject/WebApp/Scripts/special -type d -printf 'echo "*.js" >> %h/.gitignore\n git add %h/.gitignore\n' | sh
jthill

9

Це працює для мене на OSX.

lib64/**/__pycache__/
lib/**/__pycache__/
*.py[cod]
.ipynb_checkpoints/
**/.ipynb_checkpoints/
.DS_Store
**/.DS_Store

0

Спробуйте виконати git rm -r --cached MyPrject/WebApp/Scripts/special/ Ваш згаданий каталог, можливо, був кешований файлом git і відображатиметься у відслідковуваних файлах. Після очищення кеша переконайтеся, що ви про це згадували .gitignore.

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