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