.gitignore діє лише на невідстежувані файли. Якщо файл уже закомічено, Git продовжує відстежувати його зміни, хоч би що було написано в .gitignore.
Типова ситуація: .env чи .idea/ випадково потрапили в репозиторій, потім їх додали в .gitignore - а git status все одно показує зміни.
Рішення - прибрати файл з індексу, не видаляючи з диска:
git rm --cached .env
git rm -r --cached .idea/
git commit -m "Stop tracking local environment files"
--cachedвидаляє файл лише з індексу - на диску він лишається;- після коміту файл стає невідстежуваним, і тепер
.gitignoreна нього діє.
Пастка для команди: у колег після git pull цей файл буде видалено з диска, бо для Git коміт означає «файл видалено». Їхній локальний .env зникне. Попередьте команду або попросіть зберегти копію перед оновленням.
Чим відрізняються варіанти:
| Команда | Індекс | Диск |
|---|---|---|
git rm file |
видаляє | видаляє |
git rm --cached file |
видаляє | залишає |
rm file |
залишає (до git add) |
видаляє |
Масово привести репозиторій у відповідність з .gitignore:
git rm -r --cached .
git add .
git commit -m "Apply .gitignore"
Перед комітом обов'язково перегляньте git status - так можна випадково прибрати потрібні файли.
Перейменування - git mv:
git mv app/Helpers.php app/Support/Helpers.php
Це те саме, що mv + git rm старого + git add нового. Git не зберігає факт перейменування - він визначає його при порівнянні за схожістю вмісту.
Якщо файл містив секрет - git rm --cached прибирає його лише з наступних комітів. В історії він лишається, і секрет треба вважати скомпрометованим: змінити ключі, а історію чистити окремими інструментами.