.gitignore все файлы .DS_Store в каждой папке и подпапке

561

Я добавил .DS_Store в файл .gitignore, но кажется, что он игнорирует только .DS_Store в корневом каталоге, а не в каждой папке и подпапке.

Как я могу это исправить?

vickyqiu
источник
Как именно вы добавили его в .gitignore? Это должно работать во всех каталогах (делает для меня).
Тило
Это работает и для меня. Я также попытался, когда он был в конце файла, если вам нужно было (новую строку для конкретной платформы), но это не изменило, что каталоги .DS_Store в какой-либо части иерархии все еще игнорировались.
enorl76
Насколько я понимаю, вопрос заключался в следующем: как легко игнорировать все вхождения .DS_Store во всех подкаталогах, не делая этого вручную в каждом подкаталоге. У меня такая же проблема. Ниже ответ показывает, как ее решить (последние 2 абзаца).
Петрсын

Ответы:

648

Думаю, проблема в том, что в какой-то более ранний коммит вы случайно добавили .DS_Storeфайлы в репозиторий. Конечно, как только файл отслеживается в вашем хранилище, он будет продолжать отслеживаться, даже если он соответствует записи в соответствующем файле .gitignore.

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

git rm --cached .DS_Store

После удаления git должен игнорировать это. Вы должны только следующая строка в корневом .gitignoreфайле: .DS_Store. Не забывайте период!

git rm --cached .DS_Store

удаляет только .DS_Storeиз текущего каталога. Ты можешь использовать

find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch

удалить все .DS_Storesиз хранилища.

Совет: поскольку вы, вероятно, никогда не захотите включать .DS_Storeфайлы, создайте глобальное правило. Сначала создайте глобальный .gitignoreфайл где-нибудь, например

echo .DS_Store >> ~/.gitignore_global

Теперь скажите git использовать его для всех репозиториев:

git config --global core.excludesfile ~/.gitignore_global

Эта страница помогла мне ответить на ваш вопрос.

Эдвард Ньюэлл
источник
41
Последние 2 абзаца отвечают на этот вопрос. Спасибо.
Петрсын
70
´´git rm --cached .DS_Store´´ удаляет только один .DS_Store из текущего каталога. Используйте «поиск». имя .DS_Store -print0 | xargs -0 git rm --ignore-unmatch´´, чтобы удалить все .DS_Stores из
репозитория
4
Список других распространенных файлов, которые можно игнорировать, может быть
полезен
14
Плохая идея использовать глобальное правило IMO: Попытка поддерживать глобальные конфигурации для нескольких пользователей / машин никогда не работает - вам нужны правила, управляющие вашим репо в самом репо. Согласитесь с этим
Ярин
15
Я не согласен с тобой. (Несмотря на то, что я одобрил ваш комментарий, так как считаю его проницательным.) Если мы делаем глобальные изменения, то каждый пользователь Mac должен сделать это, но только один раз. Если мы делаем широкий репозиторий, то нам нужно делать это для каждого репозитория. Я не знаю о вас, но я делаю новые репо все время. Делая это глобально, человек решает проблему раз и навсегда.
Эдвард Ньюэлл
356

Добавить **/.DS_Storeв .gitignoreподкаталог


Если .DS_Storeуже совершено:

find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch

Чтобы игнорировать их во всех хранилищах: (иногда его называют ._.DS_Store)

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
ronald8192
источник
все еще загружены в мой репо?
Фредди Сидаурук,
@FreddySidauruk использовать git rm --cached your_fileпервым
ronald8192
@FreddySidauruk Должен быть find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatchот: stackoverflow.com/questions/18393498/…
ronald8192
1
Кажется, что добавление -fнеобходимо, если у вас есть открытые файлы в соответствующих папках:find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch
Мехмет Каплан
158

Если .DS_Store никогда не добавлялся в ваш репозиторий git, просто добавьте его в свой файл .gitignore.

Если у вас его нет, создайте файл с именем

.gitignore

В корневом каталоге вашего приложения и просто напишите

**/.DS_Store

В этом. Это никогда не позволит файлу .DS_Store проникнуть в ваш git.

Но, если он уже есть, напишите в своем терминале:

find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

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

git commit -m "Remove .DS_Store from everywhere"

git push origin master

А теперь добавьте .DS_Store в ваш файл .gitignore, а затем снова подтвердите и отправьте 2 последних фрагмента кода (git commit ..., git push ...)

drjorgepolanco
источник
3
Почему двойная звездочка? Что это обозначает?
MilanG
1
@MilanG - это ключевое слово, которое в основном означает «поиск в этом каталоге и во всех его подкаталогах».
lachie_h
1
Не уверен, что это идеальное объяснение того, что означает двойная звездочка. Это подстановочный знак. Может *или **зависит от того, чего вы хотите достичь. Это способ указать оболочке, как перемещаться по каталогам. Этот ответ stackoverflow объясняет это полностью stackoverflow.com/a/28199633/4092170
El'Magnifico
** никогда не
Джонатан
это на самом деле работает ... должен быть помечен как ответ
ichimaru
85

Ваш файл .gitignore должен выглядеть так:

# Ignore Mac DS_Store files
.DS_Store

Пока вы не включите косую черту, она сопоставляется с именем файла во всех каталогах. ( отсюда )

Ярина
источник
это все еще загружено в репо
Фредди Сидаурук
@FreddySidauruk тогда вы должны бежатьgit rm --cached path/to/file/here
Sgnl
23

Шаг 1, удалите все *.DS_storeфайлы. Можно бежать

git rm -f *.DS_Store

но знайте, что это rm -fможет быть немного опасно, если у вас есть опечатка! Шаг второй: добавить

*.DS_Store
.DS_Store

к .gitignore. Это сработало для меня!

travelingbones
источник
13

Добавьте *.DS_Storeв свой файл .gitignore. Это работает для меня отлично

Иаков
источник
11

Вы также можете добавить --cachedфлаг к ответу auco, чтобы сохранить локальные файлы .DS_store, как упомянул Эдвард Ньюэлл в своем первоначальном ответе. Модифицированная команда выглядит следующим образом: find . -name .DS_Store -print0 | xargs -0 git rm --cached --ignore-unmatch..cheers и спасибо!

Эндрю Вильгельм
источник
5

Шаг: 1) Удалите существующие файлы с помощью этой команды

найти . имя .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

Шаг: 2) Добавьте .DS_Store в ваш файл .gitignore

Шаг: 3) Зафиксируйте изменения в .gitignore git add .gitignore git commit -m "Удалено .DS_Store"

Вишну
источник
3
  1. $ git rm ./*.DS_Store удалить все .DS_Store из Git
  2. $ echo \.DS_Store >> .gitignore - игнорировать .DS_Store в будущем

совершить и подтолкнуть

mate.gwozdz
источник