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