Почему Git не игнорирует указанный файл?

Я добавил следующую строку в .gitignore:

sites/default/settings.php

но когда я набираю git status, он показывает файл как неустановленный файл.

В чем проблема? Все остальные шаблоны работают хорошо.


person Nick.h    schedule 30.09.2010    source источник
comment
comment
У меня была та же проблема, но я обнаружил, что вместо этого сохранил файл .gitignore на другом диске :face-palm:   -  person Henry    schedule 24.08.2017
comment
Хранить что-то в своем репозитории и игнорировать изменения в нем — очень плохая идея.   -  person Yevgeniy Afanasyev    schedule 29.08.2017
comment
Убедитесь, что репозиторий инициализирован   -  person Dan    schedule 28.05.2021


Ответы (13)


Убедитесь, что ваш .gitignore находится в корне рабочего каталога, и в этом каталоге запустите git status и скопируйте путь к файлу из вывода состояния и вставьте его в .gitignore.

Если это не сработает, скорее всего, ваш файл уже отслеживается Git. Вы можете подтвердить это через вывод git status. Если файл не указан в разделе Неотслеживаемые файлы, он уже отслеживается Git и игнорирует правило из файла .gitignore.

Причина игнорирования файлов в Git заключается в том, что они не будут добавлены в репозиторий. Если вы ранее добавили файл, который хотите игнорировать, он будет отслеживаться Git, и соответствующие ему правила игнорирования будут пропущены. Git делает это, поскольку файл уже является частью репозитория.

Чтобы на самом деле проигнорировать файл, вы должны отменить его отслеживание и удалить из репозитория. Вы можете сделать это, используя git rm --cached sites/default/settings.php. Это удаляет файл из репозитория без физического удаления файла (это то, что делает --cached). После внесения этого изменения файл будет удален из репозитория, и его игнорирование должно работать правильно.

person poke    schedule 30.09.2010
comment
Что вы подразумеваете под «корнем рабочего каталога»? Каталог, в котором находится репозиторий .git? - person Jonathan Leffler; 30.09.2010
comment
Рабочий каталог — это каталог, в котором находится каталог .git и который сам является корнем репозитория. Например, когда вы клонируете репозиторий в /xy/, тогда /xy/ является вашим рабочим каталогом с /xy/.git/ внутри. - person poke; 30.09.2010
comment
Иногда вам также потребуется выполнить git add . после git rm --cached, чтобы правильно перестроить индекс. - person Cooper; 05.01.2014
comment
Идея проверить это в статусе git была блестящей. Я продолжал проверять это в Git Staging в Eclipse, и путь был неправильным. Спасибо! - person walla; 14.04.2016
comment
Хорошее объяснение. Спасибо. - person Pulathisi Bandara; 17.04.2019
comment
Мне нужно было добавить флаг -r (рекурсивный), так как у меня также были зарегистрированы вложенные папки. В моем случае я перешел в корень моей папки git, а затем выполнил команду git rm --cached -r .vs/ Где vs была папкой верхнего уровня, которую я хотел удалить из отслеживания. - person Devology Ltd; 23.04.2019

Я сталкиваюсь с этим, это старый вопрос, но я хочу, чтобы этот файл отслеживался, но не отслеживался на определенных рабочих копиях, для этого вы можете запустить

git update-index --assume-unchanged sites/default/settings.php
person Mescalito    schedule 14.08.2011
comment
Это на самом деле ответ, который я искал. Все остальные ответы предполагают, что файл был добавлен с помощью git add, что не всегда так. В Acquia Cloud файл .gitignore должен игнорировать settings.php (например), но этот файл включается в первую фиксацию. Отмена отслеживания файла просто удаляет его из репозитория, поэтому удаляет его с живого сайта... - person PatrickS; 05.11.2013
comment
Мне тоже помогло - спасибо! Проголосовал. Я подозреваю, что это относится только к локальному репозиторию git и не будет сохраняться после того, как оно будет удалено и клонировано другими разработчиками? - person Ivan; 31.08.2016
comment
Да, только локально. - person Mescalito; 14.11.2016
comment
Этот ответ привел меня к функции git, в которой я лично нуждался, чтобы избежать отслеживания моих локальных изменений в файле настроек, хранящемся в удаленном репозитории. Команда, которую я использовал, была git update-index --skip-worktree filename - person dwllama; 10.09.2020

.gitignore будет игнорировать только те файлы, которые вы еще не добавили в свой репозиторий.

Если вы сделали git add ., и файл был добавлен в индекс, .gitignore вам не поможет. Вам нужно будет сделать git rm sites/default/settings.php, чтобы удалить его, и тогда он будет проигнорирован.

person jonescb    schedule 30.09.2010
comment
спасибо. но как удалить файл только из индекса, а не из рабочего каталога? - person Nick.h; 30.09.2010
comment
git rm должен сделать это, но он может попросить вас использовать опцию -f, которая удалит его из рабочего каталога. Я не понял этого, кроме как сделать копию файла, сделать git rm -f, а затем восстановить копию. - person jonescb; 01.10.2010
comment
То же самое, чувак. Сделайте копию где-нибудь, удалите ее, зафиксируйте удаленное состояние, добавьте файлы обратно и посмотрите, как они теперь игнорируются. - person Yevgeniy Afanasyev; 29.08.2017

Пожалуйста, используйте эту команду

git rm -rf --cached .
git add .

Иногда файлы .gitignore не работают, даже если они правильные. Причина, по которой Git игнорирует файлы, заключается в том, что они не добавляются в репозиторий. Если вы ранее добавили файл, который хотите игнорировать, он будет отслеживаться Git, и любые пропущенные правила сопоставления будут пропущены. Git делает это, потому что файл уже является частью репозитория.

person ExpertWeblancer    schedule 05.03.2020

У меня такая же проблема. Файлы, определенные в .gitingore, перечислены как неотслеживаемые файлы при запуске git status.

Причина была в том, что файл .gitignore был сохранен в кодировке UTF-16LE, а не в кодировке UTF8.

После изменения кодировки файла .gitignore на UTF8 у меня все заработало.

person Floris Devreese    schedule 10.01.2018
comment
Я чувствую себя нубом из-за этого... черт возьми, Windows - person Coty Embry; 12.09.2018
comment
Любая идея, почему кодировка файла имеет значение? Может быть, неправильно читаете путь? - person Chargnn; 02.12.2019

Есть экземпляры, например. Файлы конфигурации приложения, которые я хочу отслеживать в git (поэтому .gitignore не будет работать), но которые мне нужно изменить для локальных настроек. Я не хочу, чтобы git управлял этими файлами или показывал их как измененные. Для этого я использую skip-worktree:

git update-index --skip-worktree path/to/file

Вы можете подтвердить, что файлы пропущены, перечислив файлы и проверив строки, начинающиеся с S для пропущенных.

git ls-files -v | grep ^S

Если в будущем вы захотите, чтобы git снова управлял файлом локально, просто запустите:

 git update-index --no-skip-worktree path/to/file

У Мескалито выше был отличный ответ, который привел меня по правильному пути, но

git update-index --assume-неизменный файл/to/ignore.php

Имеет контракт с git, в котором: пользователь обещает не изменять файл и позволяет Git предположить, что рабочий файл дерева соответствует тому, что записано в индексе.

Однако я меняю содержимое файлов, поэтому в моем случае --skip-worktree лучше.

На веб-сайте Тошихару Нисина представлено отличное объяснение пропущенного рабочего дерева и предположенного без изменений: Игнорировать файлы, которые уже управляются с помощью Git локально

person J.Leupp    schedule 08.04.2019

Что я сделал, чтобы успешно игнорировать файл settings.php:

  1. git rm --кэшированные сайты/по умолчанию/settings.php
  2. совершить (до сих пор не работало)
  3. вручную удалил сайты/default/settings.php (это помогло)
  4. git добавить .
  5. совершить (успешно проигнорировано)

Я думаю, что если в Git есть зафиксированный файл, то игнорирование не работает должным образом. Просто удалите файл и зафиксируйте. Потом будет игнорировать.

person Alper Ebicoglu    schedule 29.06.2018

Еще одна возможная причина — несколько экземпляров git-клиентов, запущенных одновременно. Например, «git shell» + «GitHub Desktop» и т. д.


Это случилось со мной, я использовал «GitHub Desktop» в качестве основного клиента, и он игнорировал некоторые новые настройки .gitignore: фиксация после фиксации:

  1. Вы совершаете что-то.
  2. Затем зафиксируйте: он игнорирует настройки .gitignore. Commit включает множество временных файлов, упомянутых в .gitignore.
  3. Очистить кеш git; проверьте, является ли .gitignore UTF8; удалить файлы -> зафиксировать -> переместить файлы обратно; пропустить 1 коммит — ничего не помогло.

Причина: редактор Visual Studio Code работал в фоновом режиме с тем же открытым репозиторием. VS Code имеет встроенный элемент управления git, и это создает некоторые конфликты.

Решение: перепроверьте несколько скрытых клиентов git и используйте только один клиент git одновременно, особенно при очистке кеша git.

person Oleg Zarevennyi    schedule 23.05.2019

Убедитесь, что у .gitignore нет расширения!! Это не может быть .gitignore.txt, в Windows просто назовите файл .gitignore. и это будет работать.

person ZackOfAllTrades    schedule 12.10.2017

Я попробовал большинство команд выше на терминале VS Code и получил такие ошибки, как:

fatal: pathspec '[dir]/[file]' did not match any files

Я открыл проект на GitHub Desktop и проигнорировал оттуда, и это сработало.

person Danna Capellan    schedule 06.11.2019

Я только что попробовал это с git 1.7.3.1 и получил такую ​​​​структуру:

repo/.git/
repo/.gitignore
repo/sites/default/settings.php

где repo таким образом это "корень" упомянутый выше (я бы назвал его корнем вашего рабочего дерева), а .gitignore содержит только sites/default/settings.php, у меня работает игнор (и не важно добавлен .gitignore в репо или нет) . Соответствует ли это вашему макету репо? Если нет, то чем отличается?

person Johan    schedule 30.09.2010
comment
Да, это точно так же, как у вас, но не работает. Все остальные шаблоны работают. Как я уже сказал, проблема, безусловно, связана с папкой settings.php. - person Nick.h; 30.09.2010
comment
Я считаю, что это очень плохая идея - хранить что-то в своем репозитории и игнорировать изменения в нем. - person Yevgeniy Afanasyev; 29.08.2017
comment
@YevgeniyAfanasyev, за исключением таких вещей, как выходные данные компиляции, пользовательские настройки IDE, все другие временные файлы, созданные вашей набором инструментов… - person Chris F Carroll; 03.01.2018
comment
Я имел в виду сохранение фиксации в репозитории, а не только файлы, находящиеся в папке проекта. Зачем вам временные файлы в репозитории? - person Yevgeniy Afanasyev; 05.01.2018

На всякий случай, если у кого-то в будущем возникнет та же проблема, что и у меня:

Если вы используете

*
!/**/
!*.*

трюк для удаления двоичных файлов без расширения, убедитесь, что ВСЕ остальные строки gitignore находятся НИЖЕ. Git будет читать из .gitignore сверху, поэтому, хотя у меня был «test.go» в моем gitignore, он был первым в файле и стал «неигнорируемым» после

!*.*
person Alasdair Mclean    schedule 13.02.2018

Одна вещь, которую, я думаю, упустили в превосходных ответах здесь, - это существование if another *.gitignore* or multiple of them.

В одном случае я клонировал репозиторий и не мог понять, почему игнорируемый файл снова добавляется при запуске git add. Выяснилось, что в подпапке был другой .gitignore, и он переопределял файл в корневой папке.

/.gitignore
/some-folder/.gitignore
/some-folder/this-file-keeps-getting-staged

То

корень /.gitignore

игнорировал этот-файл-продолжает-постановку

То

/какая-то папка/.gitignore

не имеет спецификации игнорировать этот файл, который продолжает получать промежуточный файл.

Отсюда и проблема.

Одним из способов является простой поиск нескольких файлов .gitignore в иерархии. И выяснить правила, как они применяются.

person Khanna111    schedule 22.09.2020