Как удалить файл из репозитория, но оставить на диске
$ git rm --cached config.ini
rm 'config.ini'
$ echo "config.ini" >> .gitignore
$ git add .gitignore
$ git commit -m "config.ini больше не отслеживается"git rm --cached убирает файл из индекса, то есть из следующего коммита, а сам файл на диске не трогает. Строка в .gitignore нужна, чтобы файл не вернулся при следующем git add ..
Для папки — с ключом -r:
git rm -r --cached node_modulesПосле коммита отправьте изменения как обычно: git push.
Чем отличается от git rm
| Команда | Из репозитория | С диска |
|---|---|---|
git rm файл | удаляет | удаляет |
git rm --cached файл | удаляет | оставляет |
Удалить файл в Проводнике или rm | удалит после git add и коммита | удаляет |
Не перепутайте: git rm без --cached удаляет файл и с диска. Если это случилось, а коммита ещё нет, верните его: git restore --staged файл, затем git restore файл.
Что произойдёт у других
Для остальных участников проекта коммит выглядит как удаление файла. Когда они заберут его через git pull, Git удалит этот файл с их дисков — ведь в репозитории его больше нет. Если файл нужен всем на месте (например, общие настройки), предупредите их заранее, чтобы они сохранили копию, или положите в репозиторий образец (config.example.ini), из которого каждый сделает свой файл.
Файл остаётся в истории
git rm --cached убирает файл только из новых коммитов. В прошлых он остался, и любой, у кого есть копия репозитория, может его посмотреть, например через git log -- config.ini.
Если в файле был пароль, ключ или токен и коммит уже отправлен, считайте секрет раскрытым — смените его. Как убрать файл и из истории, — в справке Как убрать пароль из истории Git.
Убрать из индекса сразу всё, что попадает под .gitignore
Если .gitignore дописан, а отслеживаемых лишних файлов много:
git rm -r --cached .
git add .
git commit -m "Применены правила .gitignore"Первая команда убирает из индекса всё (файлы на диске остаются), вторая добавляет обратно только то, что не исключено .gitignore. Перед коммитом посмотрите git status: в списке deleted должны быть только лишние файлы.
Делайте это на чистой рабочей папке (git status — nothing to commit): иначе в тот же коммит попадут и все текущие правки.
Подводные камни
fatal: pathspec 'файл' did not match any files— такой файл не отслеживается (возможно, он уже исключён или путь набран с ошибкой). Пути — относительно текущей папки, регистр букв важен..gitignoreсам по себе отслеживаемые файлы не скрывает — поэтому и нуженgit rm --cached.