В цьому дописі ми розглянемо, як додати .DS_Store до файлу .gitignore, та видалимо вже додані файли з нашого репозиторію. Але спочатку треба розібратись в тому, що таке .DS_Store, для чого потрібен, чому потрапляє в Git та як видалити.
Що таке .DS_Store?
.DS_Store (Desktop Services Store) — це прихований системний файл, створений macOS для збереження інформації про відображення тек у Finder, таких як позиції іконок, розміри вікон, фонові кольори і т.д.
Якщо ви відкриваєте теку у Finder та міняєте позицію іконки - Finder збереже інформацію про позицію у .DS_Store. За замовчуванням цей файл прихований, але його можна побачити в терміналі. Навіть якщо в Finder ввімкнути показ прихованих файлів - .DS_Store буде ховатись від вас. Більш детально про приховані файли почитайте у попередньому дописі - Що означає крапка на початку файлу(.gitignore, .DS_Store, .bashrc тощо)?
Чому .DS_Store потрапляє в Git?
Коли ви працюєте над проєктом на macOS і використовуєте Git для контролю версій, файли .DS_Store можуть потрапляти в ваш репозиторій разом з іншими файлами цілком випадково. Це відбувається тому, що за замовчуванням Git не ігнорує ці файли, і вони можуть бути випадково додані до індексу. Розглянемо приклад. Я використовую GitHub Desktop для роботи з Git і клоную новий репозиторій собі на локальну машину. Перше що я роблю - створюю файл test.txt:
Додав test.txt
Зверніть увагу, що Git бачить зміни лише нового файлу (створив за допомогою VSCode і зберіг в теці цього репо). Це пов'язано з тим, що наразі Finder не має якихось кастомних налаштувань для цього файлу та теки загалом. Відкриємо теку в Finder, змінемо позицію файлу (іконки) в режимі плитки і побимо, що новий .DS_Store додався до списку змін у Git:
Додався .DS_Store
Уявіть, що ви зробили коміт, додавши .DS_Store до репозиторію проєкту, над яким працює багато людей. По-перше, нікому не потрібні конфіги вашого Finder'у у репо проєкту. По-друге, ці файли засмічують історію комітів та репо в цілому.
Як запобігти додаванню .DS_Store до репо?
Все просто - ігноруйте його. Я маю на увазі - додайте його до файлу .gitignore.
Просто додайте цю строку:
.DS_Store
Якщо файлу .gitignore ще не існує - створіть його (за допомогою редактору коду або через термінал).
Через термінал можна створити цей файл за допомогою touch:
touch .gitignore
Ну і додати текст '.DS_Store' до файлу .gitignore можна за допомогою echo:
echo .DS_Store >> .gitignore
Створений .gitignore
Після цього кроку зазвичай люди пробують створити нову теку, додати туди новий файл і змінити позицію файлу у Finder, щоб перевірити чи справді ігноруються .DS_Store.
І скоріш за все - нові .DS_Store будуть з'являтись і не будуть ігноруватись. Але чому?
Чому .gitignore не працює та не ігнорує .DS_Store?
Запустимо наступні команди в терміналі, щоб отримати потрібний результат (ігнорування .DS_Store):
Після цього ми отримаємо новий коміт з видаленими .DS_Store файлами, а нові будуть ігноруватись і не додаватись до індексу файлів.
Коміт з видаленим .DS_Store
Але давайте розберемо, що ми там запустили у терміналі:
Спочатку ви видаляєте всі файли .DS_Store з файлової системи за допомогою команди find ... -delete.
Потім ви видаляєте всі файли з індексу Git (не з файлової системи) за допомогою команди git rm --cached.
Додаєте всі файли до індексу знову, щоб переконатися, що файли .DS_Store не потраплять у новий коміт, тому що вони тепер ігноруються .gitignore.
Створюєте новий коміт з повідомленням, яке описує зроблені зміни.
Насправді все діло у кеші. Тож ми його почистили. Звісно, можна запустити чистку кешу вибірково для одного файлу:
git rm --cached `.DS_Store`
Але мене більш влаштовує рекурсивна чистка всього кешу (це більш універсальний шлях):
git rm -r --cached .
Поширити цей допис
Цитувати допис
Оберіть та скопіюйте потрібний стандарт цитування: