Решение, представленное как ответ, получившее наибольшее количество голосов, неверно и легко демонстрируется как таковое.
Начните с игнорирования всего в uploads / *:
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будет отображаться в команде статус выше.