Рішення, представлене як найбільш прихильна відповідь, є неправильним і легко демонструється як таке.
Почніть з ігнорування всього у завантаженнях / *:
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
буде відображатися в команді статус вище.