Обидва приклади в питанні насправді є дуже поганими прикладами, які можуть призвести до втрати даних!
Моя порада: ніколи не додайте /*
до каталогів файли .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/
середніх різних речей?