Как игнорировать файлы, находящиеся в репозитории?

96

У меня есть файл (config.php), который уже зафиксирован в репозитории Git, но я хочу игнорировать локально, т.е. я хочу, чтобы этот файл оставался в репозитории, но заставлял Git игнорировать любые изменения в нем.

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

Prcaen
источник
пожалуйста, добавьте свой .gitignore-файл - так мы можем увидеть какие-либо проблемы с ним.
Ларс

Ответы:

192

Если файл все еще отображается в статусе, даже если он находится в .gitignore, убедитесь, что он еще не отслеживается.

git rm --cached config.php

Если вы просто хотите игнорировать его локально, вы также можете игнорировать его с помощью git status:

git update-index --assume-unchanged config.php
VonC
источник
1
Хорошо, спасибо ! Если я объединю свою ветку с другой, может ли этот файл вызвать проблемы?
prcaen
1
@ Nimbus147: это не должно быть проблемой, и любые изменения в этом файле все равно будут игнорироваться (т.е. не добавлены / не зафиксированы).
VonC
если вы используете SmartGit, вы должны использовать для этого remove.
Omid-RH
1
Есть ли способ принудительно update-index --assume-unchangedвключить удаленную ветку? Я хотел бы сохранить файл в репо, но не иметь возможности изменять его другими, но, тем более, недоступен для стадии.
p014k
1
@ p014k Не знаю. Для этого типа файла я сохраняю его версию под другим именем, а затем использую драйвер фильтра содержимого для автоматической генерации нужного файла (частного), когда это необходимо. Например, этот фильтр не будет активен на сцене. См. Stackoverflow.com/a/54454356/6309 и связанную с ним ссылку.
VonC
6

Игнорировать отмеченный файл:

git update-index --assume-unchanged file

Вернуться

git update-index --no-assume-unchanged file

Вернуть все

git update-index --really-refresh 
Шива Кумар
источник
Полезно. Восстановление одного файла сработало, но вернуть все - нет.
Адем Тепе
4

Если файл уже находится в репозитории и, следовательно, в области индекса / промежуточной обработки, то обновление до .gitignore не изменит эту ситуацию - оно будет продолжать фиксироваться.

Чтобы удалить файл из области индекса / подготовки, используйте git rm <file>.

Филип Окли
источник
Что делать, если файл находится в репозитории, но еще не поставлен? Я пытаюсь игнорировать файлы * .log, но все равно вижу их в разделе «Изменения». Я хочу игнорировать все, что мне делать?
Sandra K
@SandraK, если более старая версия этого файла (путь к файлу / имя) уже есть в репо при последней фиксации, то она считается отслеживаемой - в `` индексе '' этот файл будет в своих записях, и поэтому он statusбудет продолжать сообщать вам об этих изменениях. Если вы хотите игнорировать файлы * .log как для ранее закрепленных, так и для не отслеживаемых в настоящее время файлов, вам необходимо выполнить оба git rm *.logфайла и обновить файл .gitignore. Сначала проверьте, действительно ли какие-то файлы журналов важны ... Легко забыть этот особенный ;-)
Филип Окли
-3

После того, как файл указан в .gitignore, вы не сможете его изменить.

Таким образом, вы можете удалить файл из списка в одной фиксации, зафиксировать изменения в следующей, а затем повторно добавить файл в список игнорирования в третьей фиксации.

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

Эриквольд
источник
1
« Как только файл указан в .gitignore, вы не можете его изменить » - не могли бы вы пояснить, что вы имеете в виду? У меня много файлов во многих моих файлах,.gitignore и я постоянно их меняю! Я впервые слышу, как кто-то говорит, что, добавив файл .gitignore, я не могу его изменить.
Trejder 01
1
Он действительно ошибается. Вы можете их изменить. Git просто не загружает их и даже не дает вам возможность загрузить их.
Дэвид