Глиф Учебники

Как удалить файл из репозитория, но оставить на диске

Справочник · Git · 2 минуты чтения

Терминал
$ 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:

Bash
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 дописан, а отслеживаемых лишних файлов много:

Bash
git rm -r --cached .
git add .
git commit -m "Применены правила .gitignore"

Первая команда убирает из индекса всё (файлы на диске остаются), вторая добавляет обратно только то, что не исключено .gitignore. Перед коммитом посмотрите git status: в списке deleted должны быть только лишние файлы.

Делайте это на чистой рабочей папке (git status — nothing to commit): иначе в тот же коммит попадут и все текущие правки.

Подводные камни