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

195

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

sites/default/settings.php

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

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

Nick.h
источник
У меня была та же проблема, потом я обнаружил, что вместо этого сохранил свой файл .gitignore на другом диске: face-palm:
Генри Чан
Это очень плохая идея - хранить вещи в своем хранилище и игнорировать их изменения.
Евгений Афанасьев

Ответы:

371

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

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

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

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

совать
источник
Что вы подразумеваете под «корнем рабочего каталога»? Каталог, в котором находится репозиторий .git?
Джонатан Леффлер
Рабочий каталог - это каталог, в котором расположен .gitкаталог, и который сам является корнем хранилища. Например, когда вы клонируете репозиторий, /xy/тогда /xy/ваш рабочий каталог /xy/.git/внутри.
тыкай
3
Иногда вам также нужно сделать git add .после, git rm --cachedчтобы правильно перестроить индекс.
Купер
Идея проверить это в git-статусе была блестящей. Я продолжал проверять это в Git Staging в Eclipse, и путь был неверным. Спасибо!
Уолла
1
Мне нужно было добавить флаг -r (рекурсивный), так как я тоже проверял вложенные папки. В моем случае я перешел в корень своей папки git, а затем выполнил команду git rm --cached -r .vs /, где vs была папка верхнего уровня, которую я хотел удалить из отслеживания.
Devology Ltd
107

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

git update-index --assume-unchanged sites/default/settings.php
Мескалито
источник
5
Это на самом деле ответ, который я искал. Все остальные ответы предполагают, что файл был добавлен с помощью git add, что не всегда так. В Acquia Cloud файл .gitignore должен игнорировать settings.php (например), но этот файл включается в первый коммит. Не открывая файл, просто удаляет его из репозитория, поэтому удаляя его с живого сайта ...
PatrickS
Помог мне тоже - спасибо! Проголосовал. Я подозреваю, что, хотя это применимо только к локальному репозиторию git и не сохранится, если его перенести на удаленный компьютер и клонировать другими разработчиками?
Иван
1
Да, это только местный.
Мескалито
41

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

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

jonescb
источник
спасибо. Но как удалить файл только из индекса, а не из рабочего каталога?
Nick.h
1
git rmдолжен сделать это, но он может попросить вас использовать опцию -f, которая удалит его из рабочего каталога. Я не понял этого, кроме как сделать копию файла, сделать, git rm -fа затем восстановить копию.
Jonescb
То же самое, чувак. Сделайте копию где-нибудь, удалите ее, подтвердите удаленное состояние, добавьте файлы обратно и посмотрите, как они теперь игнорируются.
Евгений Афанасьев
18

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

git rm -rf --cached .
git add .

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

Liqiang
источник
12

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

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

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

Флорис Девриз
источник
Я чувствую себя нубом из-за этого ... черт побери Windows
Coty Embry
Любая идея, почему кодировка файла имеет значение? Может не правильно читать путь?
Chargnn
2

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

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

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

Альпер Эбикоглу
источник
2

Есть примеры, например, файлы конфигурации приложения, которые я хочу отслеживать в 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 представлено отличное объяснение пропуска рабочего дерева и предположения без изменений: игнорирование файлов, уже управляемых с помощью Git локально

J.Leupp
источник
2

Другая возможная причина - несколько экземпляров 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.

Олег Заревенный
источник
1

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

ZackOfAllTrades
источник
0

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

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

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

Johan
источник
Да. Это точно так же, как ваш. Но не работает. Все другие шаблоны работают. Как я уже сказал, проблема, безусловно, связана с папкой settings.php.
Nick.h
Я чувствую, что это очень плохая идея - хранить вещи в вашем хранилище и игнорировать их изменения.
Евгений Афанасьев
@YevgeniyAfanasyev за исключением таких вещей, как вывод компиляции, пользовательские настройки IDE, все другие временные файлы, сгенерированные вашей цепочкой инструментов ...
Крис Ф. Кэрролл
Я имел в виду сохранение коммитов в репозитории, а не только файлов, находящихся в папке проекта. Зачем вам нужны временные файлы в хранилище?
Евгений Афанасьев
0

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

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

*
!/**/
!*.*

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

!*.*
Аласдейр Маклин
источник
0

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

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

Я открыл проект на GitHub Desktop и проигнорировал его, и он заработал.

Данна Капеллан
источник