Рішення, представлене як найбільш прихильна відповідь, є неправильним і легко демонструється як таке.
Почніть з ігнорування всього у завантаженнях / *:
mkdir -p uploads/rubbish/stuff/KEEP_ME
touch uploads/a uploads/rubbish/a uploads/rubbish/stuff/a uploads/rubbish/stuff/KEEP_ME/a
echo '/uploads/*' >> .gitignore
git init
git add .
git commit -m "Initial commit"
Тепер ігноруйте батьківський каталог ігнорованих речей, як зазначено вище:
echo 'uploads/rubbish/stuff/KEEP_ME/' >> .gitignore
echo 'uploads/rubbish/stuff/KEEP_ME/*' >> .gitignore
git status -u
Не відображає файлів без відстеження.
Щоб змусити його працювати, потрібно ігнорувати всі файли під uploads/деревом (а uploads/**/*не лише верхній рівень uploads/*), а потім додати всі батьківські каталоги дерева, яке потрібно зберегти
echo '/uploads/**/*' > .gitignore
echo '!/uploads/rubbish/' >> .gitignore
echo '!/uploads/rubbish/stuff' >> .gitignore
echo '!/uploads/rubbish/stuff/KEEP_ME' >> .gitignore
echo '!/uploads/rubbish/stuff/KEEP_ME/*' >> .gitignore
git status -u
Що дає:
On branch master
...
Untracked files:
(use "git add <file>..." to include in what will be committed)
uploads/rubbish/stuff/KEEP_ME/a
Якби ми використовували uploads/*в .gitignoreвище, то всі проміжні файли були б включені, так що , наприклад , uploads/rubbish/aбуде відображатися в команді статус вище.