Rozwiązanie przedstawiane jako odpowiedź, która uzyskała najwięcej głosów, jest niepoprawne i jako takie łatwe do udowodnienia.
Zacznij od ignorowania wszystkiego w przesyłanych plikach / *:
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"
Teraz zignoruj katalog nadrzędny ignorowanych rzeczy, jak powyżej:
echo 'uploads/rubbish/stuff/KEEP_ME/' >> .gitignore
echo 'uploads/rubbish/stuff/KEEP_ME/*' >> .gitignore
git status -u
Pokazuje nieśledzone pliki.
Aby to działało, musisz zignorować wszystkie pliki w uploads/
drzewie ( uploads/**/*
nie tylko najwyższy poziom uploads/*
), a następnie dodać wszystkie katalogi nadrzędne drzewa, które chcesz zachować
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
Co daje:
On branch master
...
Untracked files:
(use "git add <file>..." to include in what will be committed)
uploads/rubbish/stuff/KEEP_ME/a
Gdybyśmy wykorzystywane uploads/*
w .gitignore
powyżej, a następnie wszystkie pliki pośrednie zostałyby uwzględnione, tak więc na przykład uploads/rubbish/a
by pokazać się w komendzie stanu powyżej.