Полное руководство по рекурсивному игнорированию .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 в любом каталоге или подпапке, независимо от их глубины в структуре папок.
Содержание
- Понимание проблемы
- Решение с двойной звёздочкой
- Глобальная vs. репозиторная конфигурация
- Пошаговая реализация
- Дополнительные рекомендации
Понимание проблемы
Когда вы добавляете .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 вашего репозитория в корневом каталоге:
# Игнорировать файлы .DS_Store рекурсивно
**/.DS_Store
**/._.DS_Store
Глобальная .gitignore (рекомендуется)
Настройте глобальный файл .gitignore, который будет применяться ко всем вашим репозиториям:
# Создайте или отредактируйте глобальный 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».
Пошаговая реализация
Для репозиторного решения:
- Откройте файл
.gitignoreв корне репозитория - Добавьте следующие шаблоны:gitignore
**/.DS_Store **/._.DS_Store
- Сохраните файл и зафиксируйте его в репозитории
Для глобального решения:
- Создайте или отредактируйте глобальный файл gitignore:bash
nano ~/.gitignore_global
- Добавьте эти шаблоны (по одному в строке):
.DS_Store ._DS_Store **/.DS_Store **/._.DS_Store - Настройте Git использовать этот файл глобально:bash
git config --global core.excludesfile ~/.gitignore_global
- Сохраните файл и закройте редактор
Обработка уже отслеживаемых файлов .DS_Store:
Если в репозитории уже есть отслеживаемые файлы .DS_Store, их нужно удалить:
# Удалить существующие файлы .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 рассмотрите добавление следующих шаблонов:
# 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:
# Проверить, игнорируется ли конкретный файл
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 не перечисляет исключённые каталоги по соображениям производительности, поэтому любые шаблоны на содержащих файлах не применяются, если родительский каталог исключён. Поэтому нужно явно сопоставлять шаблоны файлов, а не исключать целые каталоги.
Источники
- Stack Overflow – gitignore all the .DS_Store files in every folder and subfolder
- ConSol Labs – Using .gitignore the Right Way
- Git Official Documentation – gitignore
- Roy’s Blog – How to git-ignore Cached Code files and all Hidden Directories Recursively
- Stack Overflow – How to .gitignore files recursively
Заключение
Чтобы успешно игнорировать файлы .DS_Store по всему репозиторию, используйте шаблон **/.DS_Store в файле .gitignore. Эта двойная звёздочка обеспечивает рекурсивное сопоставление независимо от глубины каталога.
Ключевые выводы:
- Базовый шаблон
.DS_Storeсопоставляет только файлы в текущем каталоге **/.DS_Storeсопоставляет файлы.DS_Storeв любом месте репозитория- Рассмотрите возможность использования глобального
.gitignoreдля единообразного поведения во всех проектах - Не забудьте удалить уже отслеживаемые файлы
.DS_Storeпосле обновления.gitignore - Добавьте
**/._.DS_Store, чтобы игнорировать файлы ресурсного ветвления
Внедрив эти шаблоны, вы сохраните репозитории чистыми от ненужных системных файлов и улучшите совместную работу с коллегами, использующими разные платформы.