La soluzione presentata come la risposta più votata è sbagliata e facilmente dimostrabile come tale.
Inizia ignorando tutto nei caricamenti / *:
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"
Ora annulla la directory principale delle cose ignorate come sopra:
echo 'uploads/rubbish/stuff/KEEP_ME/' >> .gitignore
echo 'uploads/rubbish/stuff/KEEP_ME/*' >> .gitignore
git status -u
Non mostra file non tracciati.
Affinché funzioni, è necessario ignorare tutti i file sotto l' uploads/
albero ( uploads/**/*
, non solo il livello superiore uploads/*
) e quindi aggiungere tutte le directory padre dell'albero che si desidera mantenere
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
Che dà:
On branch master
...
Untracked files:
(use "git add <file>..." to include in what will be committed)
uploads/rubbish/stuff/KEEP_ME/a
Se avessimo usato uploads/*
quanto .gitignore
sopra, allora sarebbero stati inclusi anche tutti i file intermedi, quindi ad esempio uploads/rubbish/a
verrebbero visualizzati nel comando di stato sopra.