ГоловнаВсі публікаціїКатегоріїПро проєкт

Як видалити файл .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 .
Пишемо демо-гру Drones vs Zombies (Gosu / Ruby)
12.07.2024 12:17

Пишемо демо-гру Drones vs Zombies (Gosu / Ruby)

meme code
meme code@memecode
Як пофіксити збій Windows викликаний CrowdStrike?
19.07.2024 13:53

Як пофіксити збій Windows викликаний CrowdStrike?

meme code
meme code@memecode
Що означає .map(&:name) в Ruby?
28.07.2024 11:18

Що означає .map(&:name) в Ruby?

meme code
meme code@memecode
Як працює метод map в Ruby? Огляд роботи методу з прикладами
30.07.2024 07:33

Як працює метод map в Ruby? Огляд роботи методу з прикладами

meme code
meme code@memecode
Що означає крапка на початку файлу(.gitignore, .DS_Store, .bashrc тощо)?
02.08.2024 13:15

Що означає крапка на початку файлу(.gitignore, .DS_Store, .bashrc тощо)?

meme code
meme code@memecode
Що таке .gitignore? Для чого потрібен та як використовувати
02.08.2024 14:58

Що таке .gitignore? Для чого потрібен та як використовувати

meme code
meme code@memecode
Що таке ідемпотентний метод?
21.08.2024 20:57

Що таке ідемпотентний метод?

meme code
meme code@memecode
Що таке репозиторій?
21.08.2024 21:25

Що таке репозиторій?

meme code
meme code@memecode
Що таке коміт (commit) у контексті програмування та SCM / Git?
21.08.2024 21:37

Що таке коміт (commit) у контексті програмування та SCM / Git?

meme code
meme code@memecode
Що таке SCM (Source Control Management)?
21.08.2024 21:46

Що таке SCM (Source Control Management)?

meme code
meme code@memecode
Яку ієрархію має DOM (Document Object Model)?
23.08.2024 09:22

Яку ієрархію має DOM (Document Object Model)?

meme code
meme code@memecode
Як працює модель штучного інтелекту?
15.09.2024 16:42

Як працює модель штучного інтелекту?

meme code
meme code@memecode