Другое

Полное руководство по рекурсивному игнорированию .DS_Store

Узнайте, как рекурсивно игнорировать файлы .DS_Store во всех папках с помощью шаблона **/.DS_Store в .gitignore. Руководство с настройкой и лучшими практиками.

Как игнорировать файлы .DS_Store во всех папках и подпапках с помощью .gitignore?
Я добавил .DS_Store в файл .gitignore, но он игнорирует только файлы .DS_Store в корневом каталоге, а не во всех папках и подпапках. Как изменить конфигурацию .gitignore, чтобы игнорировать файлы .DS_Store рекурсивно по всему репозиторию?

Двойная звёздочка **/.DS_Store — это решение, позволяющее игнорировать файлы .DS_Store рекурсивно во всём репозитории. Этот шаблон сообщает Git находить файлы .DS_Store в любом каталоге или подпапке, независимо от их глубины в структуре папок.

Содержание


Понимание проблемы

Когда вы добавляете .DS_Store в файл .gitignore без специального синтаксиса, Git сопоставляет файлы только в текущем каталоге, где находится .gitignore. Поэтому вы видите, что файлы .DS_Store игнорируются в корне, но не в подпапках.

Файл .DS_Store — это системный файл macOS, который хранит пользовательские атрибуты папок, такие как позиции иконок и настройки вида. Хотя он необходим для работы macOS, обычно он не нужен в системе контроля версий и может засорять репозиторий.

Ключевой вывод: шаблоны .gitignore работают относительно местоположения самого файла .gitignore, и без специального синтаксиса они не применяются к подпапкам автоматически.


Решение с двойной звёздочкой

Шаблон двойной звёздочки (**) — это встроенный механизм Git для рекурсивного сопоставления. При использовании в шаблонах .gitignore ** представляет ноль или более каталогов, позволяя находить файлы на любой глубине в структуре репозитория.

Разбор синтаксиса шаблона

Шаблон Описание Пример
.DS_Store Сопоставляет только в текущем каталоге .DS_Store
**/.DS_Store Сопоставляет в любом месте репозитория **/.DS_Store
*/.DS_Store Сопоставляет только на один уровень глубины */.DS_Store
**/._.DS_Store Сопоставляет файлы ресурсного ветвления **/._.DS_Store

Согласно официальной документации Git, «Слэш, за которым следуют две подряд идущие звёздочки и слэш, соответствует нулю или более каталогам». Это делает **/.DS_Store идеальным шаблоном для ваших нужд.


Глобальная vs. репозиторная конфигурация

У вас есть два основных подхода к реализации решения:

Репозиторная .gitignore

Добавьте **/.DS_Store в файл .gitignore вашего репозитория в корневом каталоге:

gitignore
# Игнорировать файлы .DS_Store рекурсивно
**/.DS_Store
**/._.DS_Store

Глобальная .gitignore (рекомендуется)

Настройте глобальный файл .gitignore, который будет применяться ко всем вашим репозиториям:

bash
# Создайте или отредактируйте глобальный gitignore
echo ".DS_Store" >> ~/.gitignore_global
echo "._.DS_Store" >> ~/.gitignore_global
echo "**/.DS_Store" >> ~/.gitignore_global
echo "**/._.DS_Store" >> ~/.gitignore_global

# Установите глобальный файл исключений
git config --global core.excludesfile ~/.gitignore_global

Глобальный подход особенно полезен, поскольку, как отмечено в руководстве ConSol Labs, «каждое правило, записанное в этом файле, применяется ко всем репозиториям Git в вашей учётной записи. Это особенно удобно для файлов ОС, таких как .DS_Store на MacOS».


Пошаговая реализация

Для репозиторного решения:

  1. Откройте файл .gitignore в корне репозитория
  2. Добавьте следующие шаблоны:
    gitignore
    **/.DS_Store
    **/._.DS_Store
    
  3. Сохраните файл и зафиксируйте его в репозитории

Для глобального решения:

  1. Создайте или отредактируйте глобальный файл gitignore:
    bash
    nano ~/.gitignore_global
    
  2. Добавьте эти шаблоны (по одному в строке):
    .DS_Store
    ._DS_Store
    **/.DS_Store
    **/._.DS_Store
    
  3. Настройте Git использовать этот файл глобально:
    bash
    git config --global core.excludesfile ~/.gitignore_global
    
  4. Сохраните файл и закройте редактор

Обработка уже отслеживаемых файлов .DS_Store:

Если в репозитории уже есть отслеживаемые файлы .DS_Store, их нужно удалить:

bash
# Удалить существующие файлы .DS_Store из всех каталогов
find . -name ".DS_Store" -type f -delete
find . -name "._DS_Store" -type f -delete

# Удалить из отслеживания Git
git rm -r --cached .DS_Store
git rm -r --cached ._DS_Store

Дополнительные рекомендации

Полные шаблоны macOS для .gitignore

Для более полного исключения файлов macOS рассмотрите добавление следующих шаблонов:

gitignore
# macOS
.DS_Store
.AppleDouble
.LSOverride

# Иконка должна заканчиваться двумя \r
Icon

# Миниатюры
._*

# Файлы, которые могут появиться в корне тома
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Каталоги, потенциально созданные на удалённом AFP‑шаре
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

Проверка

Чтобы убедиться, что ваши шаблоны работают корректно, используйте команду git check-ignore:

bash
# Проверить, игнорируется ли конкретный файл
git check-ignore .DS_Store
git check-ignore some-folder/.DS_Store

# Вывести все игнорируемые файлы, соответствующие шаблону
git ls-files -i --exclude-standard -o | grep DS_Store

Важно: Как отмечено в обсуждениях Stack Overflow, Git не перечисляет исключённые каталоги по соображениям производительности, поэтому любые шаблоны на содержащих файлах не применяются, если родительский каталог исключён. Поэтому нужно явно сопоставлять шаблоны файлов, а не исключать целые каталоги.


Источники

  1. Stack Overflow – gitignore all the .DS_Store files in every folder and subfolder
  2. ConSol Labs – Using .gitignore the Right Way
  3. Git Official Documentation – gitignore
  4. Roy’s Blog – How to git-ignore Cached Code files and all Hidden Directories Recursively
  5. Stack Overflow – How to .gitignore files recursively

Заключение

Чтобы успешно игнорировать файлы .DS_Store по всему репозиторию, используйте шаблон **/.DS_Store в файле .gitignore. Эта двойная звёздочка обеспечивает рекурсивное сопоставление независимо от глубины каталога.

Ключевые выводы:

  • Базовый шаблон .DS_Store сопоставляет только файлы в текущем каталоге
  • **/.DS_Store сопоставляет файлы .DS_Store в любом месте репозитория
  • Рассмотрите возможность использования глобального .gitignore для единообразного поведения во всех проектах
  • Не забудьте удалить уже отслеживаемые файлы .DS_Store после обновления .gitignore
  • Добавьте **/._.DS_Store, чтобы игнорировать файлы ресурсного ветвления

Внедрив эти шаблоны, вы сохраните репозитории чистыми от ненужных системных файлов и улучшите совместную работу с коллегами, использующими разные платформы.

Авторы
Проверено модерацией
Модерация