La solution présentée comme la réponse la plus votée est incorrecte et facilement démontrable en tant que telle.
Commencez par ignorer tout dans les téléchargements / *:
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"
Désignorez maintenant le répertoire parent des éléments ignorés comme ci-dessus:
echo 'uploads/rubbish/stuff/KEEP_ME/' >> .gitignore
echo 'uploads/rubbish/stuff/KEEP_ME/*' >> .gitignore
git status -u
N'affiche aucun fichier non suivi.
Pour que cela fonctionne, vous devez ignorer tous les fichiers sous l' uploads/
arborescence ( uploads/**/*
et pas seulement le niveau supérieur uploads/*
), puis ajouter tous les répertoires parents de l'arborescence 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
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/*
ce qui .gitignore
précède, tous les fichiers intermédiaires auraient également été inclus, donc par exemple uploads/rubbish/a
apparaîtraient dans la commande d'état ci-dessus.