Ответ 1
Это не ошибка (или, по крайней мере, разработчики git не считают ее одним).
Содержимое .gitignore
- это не "файлы, которые следует игнорировать" или "имена путей, которые не следует трогать"; вместо этого они являются "путями, которые автоматически не добавляются, и их подавляют, пока они не отображаются как неотображенные" (что делает .gitignore
бедным именем).
Как только вы перенесли файл или даже добавили его в индекс, он больше не игнорируется, независимо от того, указан ли он в .gitignore
.
Для некоторых файлов вы можете использовать git update-index --assume-unchanged
или (лучше) git update-index --skip-worktree
, но в общем случае, если вы случайно сделали файл, которого не должны иметь, и вы хотите его игнорировать, вы должны "переписать историю", чтобы полностью избавиться от хранилища, чтобы получить хорошее поведение. Это не слишком сложно, если вы ничего не толкнули и не имеете никаких коммитов, содержащих нежелательный файл, но намного сложнее, если вы нажали или имели много таких коммитов.
См. также Git - Разница между "предполагать-без изменений" и "skip-worktree" .
[Текст добавлен в декабре 2016 года]
Технические данные
Для Git существует краткое, простое и сладкое определение отслеживаемого файла: Файл отслеживается тогда и только тогда, когда в нем есть запись.
"Принимать без изменений" и "пропускать рабочую строку" - это флаги, которые вы можете вручную установить или очистить в индексе. Они являются отдельными флагами и могут устанавливаться индивидуально, хотя неясно, что значит устанавливать оба. Цель "принять без изменений" состоит в том, чтобы просто сделать git быстрее, разрешив предположить, что файл не изменен и, следовательно, не нужно обновлять с помощью git add
, в то время как флаг "skip worktree" состоит в том, чтобы сказать git "руки": не просто принимайте его без изменений, старайтесь не менять его. Это сложнее, чем может показаться на первый взгляд; более подробно об этом см. выше ссылка.
Чтобы установить эти флаги, файл должен иметь индексную запись, поэтому ее необходимо отслеживать.
Если файл не отслеживается, его можно игнорировать и не игнорировать. Для них существует множество источников: не только верхний уровень .gitignore
, который содержит список (по одному на строку) варианта git pathspec, который ограничен сопоставлением и отрицанием glob, но также и .gitignore
файлов внутри каждый подкаталог в репозитории, файл $GIT_DIR/info/exclude
, если он существует, и файл с именем core.excludesFile
, если эта запись конфигурации существует. Чтобы узнать, проигнорирован ли файл и почему он игнорируется, используйте git check-ignore
, доступный с git версии 1.8.2. Опция -v
сообщает, какой файл управления помечен как файл игнорируется.
К сожалению, как и в вопросе, на который этот ответ, "игнорируется" имеет два значения. Хотя совпадение пути игнорирования сохраняет git тихую информацию о том, что файл не отслеживается, он также делает git свободным, чтобы сжать файл.