Обкладинка нотатки: Як видалити файл .DS_Store з Git репозиторію?

Як видалити файл .DS_Store з Git репозиторію?

В цьому дописі ми розглянемо, як додати .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
Додав test.txt
Зверніть увагу, що Git бачить зміни лише нового файлу (створив за допомогою VSCode і зберіг в теці цього репо). Це пов'язано з тим, що наразі Finder не має якихось кастомних налаштувань для цього файлу та теки загалом. Відкриємо теку в Finder, змінемо позицію файлу (іконки) в режимі плитки і побимо, що новий .DS_Store додався до списку змін у Git:
Додався .DS_Store
Додався .DS_Store
Уявіть, що ви зробили коміт, додавши .DS_Store до репозиторію проєкту, над яким працює багато людей. По-перше, нікому не потрібні конфіги вашого Finder'у у репо проєкту. По-друге, ці файли засмічують історію комітів та репо в цілому. 

Як запобігти додаванню .DS_Store до репо?

Все просто - ігноруйте його. Я маю на увазі - додайте його до файлу .gitignore.
Просто додайте цю строку:
.DS_Store
Якщо файлу .gitignore ще не існує - створіть його (за допомогою редактору коду або через термінал).
Через термінал можна створити цей файл за допомогою touch:
touch .gitignore
Ну і додати текст '.DS_Store' до файлу .gitignore можна за допомогою echo:
echo .DS_Store >> .gitignore
Створений .gitignore
Створений .gitignore
Після цього кроку зазвичай люди пробують створити нову теку, додати туди новий файл і змінити позицію файлу у Finder, щоб перевірити чи справді ігноруються .DS_Store.
І скоріш за все - нові .DS_Store будуть з'являтись і не будуть ігноруватись. Але чому?

Чому .gitignore не працює та не ігнорує .DS_Store? 

Запустимо наступні команди в терміналі, щоб отримати потрібний результат (ігнорування .DS_Store):
find . -name '.DS_Store' -type f -delete
git rm -r --cached .
git add .
git commit -m "Remove .DS_Store files"
Після цього ми отримаємо новий коміт з видаленими .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 .
🤖 Категорії підібрані ШІ: Програмне забезпеченняВеб-розробка

🔗 Цитувати допис: "Як видалити файл .DS_Store з Git репозиторію?"

Якщо ви хочете процитувати цей допис у своїй роботі, статті, блозі, використовуйте наведену нижче інформацію.

Розгорнути деталі


🙌 Підтримати блог @memecode

Ви можете поширити цей допис у соцмережах, чим допоможете платформі цейво розвиватись (* ^ ω ^)

📝 Більше публікацій:
Обкладинка нотатки: Пишемо демо-гру Drones vs Zombies (Gosu / Ruby)
Обкладинка нотатки: Як пофіксити збій Windows викликаний CrowdStrike?
Обкладинка нотатки: Що означає .map(&:name) в Ruby?
Обкладинка нотатки: Як працює метод map в Ruby? Огляд роботи методу з прикладами
Обкладинка нотатки: Що означає крапка на початку файлу(.gitignore, .DS_Store, .bashrc тощо)?
Обкладинка нотатки: Що таке .gitignore? Для чого потрібен та як використовувати
Обкладинка нотатки: Що таке ідемпотентний метод?
Обкладинка нотатки: Що таке репозиторій?
Обкладинка нотатки: Що таке коміт (commit) у контексті програмування та SCM / Git?
Обкладинка нотатки: Що таке SCM (Source Control Management)?
Обкладинка нотатки: Яку ієрархію має DOM (Document Object Model)?
Обкладинка нотатки: Як працює модель штучного інтелекту?
Дисклеймер

Інформація на сайті tseivo.com є суб'єктивною та відображає особисті погляди та досвід авторів та авторок блогів.

Використовуйте цей ресурс як одне з декількох джерел інформації під час своїх досліджень та прийняття рішень. Завжди застосовуйте критичне мислення. Людина сама несе відповідальність за свої рішення та дії.