La solution présentée comme la plus votée est incorrecte et facilement démontrable.
Commencez par ignorer tout ce qui se trouve dans 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"
Maintenant, désignons le répertoire parent des éléments ignorés, comme indiqué ci-dessus :
echo 'uploads/rubbish/stuff/KEEP_ME/' >> .gitignore
echo 'uploads/rubbish/stuff/KEEP_ME/*' >> .gitignore
git status -u
Ne montre aucun fichier non suivi.
Pour que cela fonctionne, vous devez ignorer tous les fichiers qui se trouvent sous la rubrique uploads/
arbre ( uploads/**/*
et pas seulement au plus haut niveau, uploads/*
) et ajoutez ensuite tous les répertoires parents de l'arbre que vous souhaitez conserver
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
Ce qui donne :
On branch master
...
Untracked files:
(use "git add <file>..." to include in what will be committed)
uploads/rubbish/stuff/KEEP_ME/a
Si nous avions utilisé uploads/*
dans le .gitignore
ci-dessus, tous les fichiers intermédiaires auraient également été inclus. uploads/rubbish/a
apparaîtrait dans la commande d'état ci-dessus.