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

Я добавил следующую строку в .gitignore но когда я .gitignore git status он показывает файл как неподготовленный файл. В чем проблема? Все остальные шаблоны работают хорошо.

.gitignore файла .gitignore:

sites/default/settings.php

Ответ 1

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

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

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

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

Ответ 2

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

git update-index --assume-unchanged sites/default/settings.php

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

Ответ 6

Я просто попробовал это с помощью git 1.7.3.1 и задал такую ​​структуру, как:

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

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

Ответ 7

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

Ответ 8

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

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

*
!/**/
!*.*

Хитрость для удаления двоичных файлов без расширения, убедитесь, что все остальные строки gitignore находятся ниже. Git будет читать из .gitignore сверху, поэтому, несмотря на то, что у меня в gitignore было "test.go", оно было первым в файле и стало "игнорируемым" после

!*.*

Ответ 9

Есть примеры, например, файлы конфигурации приложения, которые я хочу отслеживать в 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 - лучший вариант.

Сайт Toshiharu Nishina предоставил отличное объяснение skip-worktree против предположения без изменений: игнорировать файлы, уже управляемые с помощью Git локально

Ответ 10

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


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

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

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

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