Как рекурсивно преобразовывать файлы .gitignore

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. Есть ли более краткий способ сделать это, не повторяя вещи?

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

Ответы:

118

Начиная с git 1.8.2, это:

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

Должен работать в соответствии с этим ответом . Это также работает для меня в Windows 7 с использованием Sourcetree 1.6.12.0 и версии git, которую он устанавливает (1.8.4-preview20130916).

Чтобы рекурсивно gitignore каждый файл и папку в каталоге:

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
egfind MyPrject/WebApp/Scripts/special -type d -printf 'echo "*.js" >> %h/.gitignore\n git add %h/.gitignore\n' | sh
jthill
10

Это работает для меня в OSX.

lib64/**/__pycache__/
lib/**/__pycache__/
*.py[cod]
.ipynb_checkpoints/
**/.ipynb_checkpoints/
.DS_Store
**/.DS_Store
Джонатан
источник
1

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

Прадипта Шарма
источник