Обидва приклади в питанні насправді є дуже поганими прикладами, які можуть призвести до втрати даних!
Моя порада: ніколи не додайте /*до каталогів файли .gitignore, якщо у вас немає вагомих причин!
Вагомою причиною може бути, наприклад, те, що написав Джефромі: "якщо ви згодом хочете щось ігнорувати в каталозі" .
Причина, чому цього інакше не слід робити, полягає в тому, що додавання /*до каталогів працює, з одного боку, таким чином, щоб воно правильно ігнорувало весь вміст каталогу, але з іншого - це має небезпечний побічний ефект:
Якщо ви виконаєте git stash -u(тимчасово git clean -dfзберігати відстежені та відслідковувані файли) або (видалити відслідковувані, але ігнорувати файли) у вашому сховищі, всі каталоги, які ігноруються доданими, /*будуть безповоротно видалені !
Якесь тло
Мені довелося навчитися цьому важким шляхом. Хтось із моєї команди /*приєднувався до деяких каталогів у нашому .gitignore. З часом у мене були випадки, коли певні каталоги раптом зникали. Довідники з гігабайти локальних даних, необхідні нашій програмі. Ніхто не міг це пояснити, і я завжди хочу повторно завантажити всі дані. Через деякий час у мене з’явилося поняття, що це, можливо, стосується git stash. Одного разу я хотів очистити місцеве репо (зберігаючи ігноровані файли), і я використовував, git clean -dfі знову мої дані не було. Цього разу мені було достатньо і досліджено проблему. Я нарешті зрозумів, що причина - додається /*.
Я припускаю, що це можна якось пояснити тим, що directory/* він ігнорує весь вміст каталогу, але не сам каталог. Таким чином, він ні вважається відстеженим, ні ігнорується, коли речі видаляються. Хоча git statusі git status --ignoredдайте трохи іншу картину на ньому.
Як відтворювати
Ось як відтворити поведінку. Зараз я використовую Git 2.8.4.
Каталог, званий localdata/із манекеновим файлом у ньому ( important.dat), буде створений у локальному сховищі git, а вміст буде проігноровано, помістивши /localdata/*у .gitignoreфайл. Коли одна з двох згаданих команд git виконується зараз, каталог буде (несподівано) втрачено.
mkdir test
cd test
git init
echo "/localdata/*" >.gitignore
git add .gitignore
git commit -m "Add .gitignore."
mkdir localdata
echo "Important data" >localdata/important.dat
touch untracked-file
Якщо ви git status --ignoredтут зробите , ви отримаєте:
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
untracked-file
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
localdata/
Тепер або робити
git stash -u
git stash pop
або
git clean -df
В обох випадках каталог нібито ігнорується localdata не буде!
Не впевнений, чи можна це вважати помилкою, але я думаю, що це принаймні особливість, яка нікому не потрібна.
Я повідомлю про це до списку розвитку git і побачу, що вони думають про це.
.gitignoreрозрізняє файли та каталоги, які він ігнорує? наприклад, неdataпротиdata/середніх різних речей?