La solución presentada como la respuesta más votada a favor es incorrecta y fácilmente demostrable como tal.
Comience ignorando todo en las cargas / *:
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"
Ahora deje de ignorar el directorio principal de las cosas ignoradas como arriba:
echo 'uploads/rubbish/stuff/KEEP_ME/' >> .gitignore
echo 'uploads/rubbish/stuff/KEEP_ME/*' >> .gitignore
git status -u
No muestra archivos sin seguimiento.
Para que funcione, debe ignorar todos los archivos debajo del uploads/
árbol ( uploads/**/*
no solo el nivel superior uploads/*
) y luego agregar todos los directorios principales del árbol que desea conservar
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
Lo que da:
On branch master
...
Untracked files:
(use "git add <file>..." to include in what will be committed)
uploads/rubbish/stuff/KEEP_ME/a
Si hubiéramos utilizado uploads/*
lo .gitignore
anterior, entonces todos los archivos intermedios también se habrían incluido, por lo que, por ejemplo uploads/rubbish/a
, aparecerían en el comando de estado anterior.