Как я могу удалить файлы .DS_Store из Git-репозитория?

1257

Как я могу удалить эти раздражающие .DS_Storeфайлы Mac OS X из репозитория Git?

Джон Топли
источник
Думаю, это то же самое во многих версиях MacOS, не только в Mac OS X.
Джим Ахо
Проверьте https://github.com/xiaozhuai/odourless , я сделал инструмент для предотвращения .DS_Store.
xiaozhuai

Ответы:

2433

Удалить существующие файлы из хранилища:

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

Добавьте строку

.DS_Store

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

echo .DS_Store >> .gitignore

затем

git add .gitignore
git commit -m '.DS_Store banished!'
benzado
источник
13
Это действительно тривиально, но использование -execзапускается git-rmодин раз для каждого файла .DS_Store, а xargsвсе пути помещаются в одну командную строку. В основном я предпочитаю, xargsпотому что мне не нужно беспокоиться о том, чтобы избежать множества специальных символов.
Бензадо
8
Для этого следует использовать .git / info / exclude, а не .gitignore. См. Stackoverflow.com/questions/1753070/… для объяснения различий между ними.
Эндрю Гримм
106
@ Андрей: я не согласен. Регистрация файла .DS_Store никогда не будет полезна, поэтому имеет больше смысла как настройка для всего хранилища, предназначенная для всех пользователей, а не как то, что каждый пользователь Mac должен помнить, чтобы установить на своем компьютере.
Бензадо
51
Есть ли добавление .DS_Storeк .gitignoreработе рекурсивно? То есть он будет игнорировать some/level/of/folders/.DS_Store?
Чарли Шлиссер
71
@CharlieS Да, если шаблон не содержит косую черту, он сопоставляется с именем файла во всех каталогах.
Бензадо
239

Комбинируя ответы benzado и webmat, обновляя их git rm, не сбивая найденные файлы, которые не находятся в репо, и делая его универсально вставляемым для любого пользователя:

# remove any existing files from the repo, skipping over ones not in repo
find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch
# specify a global exclusion list
git config --global core.excludesfile ~/.gitignore
# adding .DS_Store to that list
echo .DS_Store >> ~/.gitignore
Turadg
источник
2
Я обнаружил, что при использовании git-репо в моем домашнем каталоге (AKA-репозиторий "dotfiles") наличие ~/.gitignoreфайла глобальных исключений является проблемой . Есть файлы, которые я хочу исключить из моего домашнего каталога, которые я не хочу игнорировать глобально. Я использую ~/.gitexcludesвместо этого через ту же директиву:core.excludesfile
AL X X
156

Лучшее решение этой проблемы - глобально игнорировать эти файлы из всех репозиториев git в вашей системе. Это можно сделать, создав глобальный файл gitignore, например:

vi ~/.gitignore_global

Добавление правил для игнорирования файлов, таких как:

# Compiled source #
###################
*.com
*.class
*.dll
*.exe
*.o
*.so

# Packages #
############
# it's better to unpack these files and commit the raw source
# git has its own built in compression methods
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.zip

# Logs and databases #
######################
*.log
*.sql
*.sqlite

# OS generated files #
######################
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

Теперь добавьте этот файл в вашу глобальную конфигурацию git:

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

Редактировать:

Удалены значки, так как они могут потребоваться в качестве активов приложения.

нерв
источник
Вы также можете добавить вышеуказанные правила в свой репозиторий .gitignore. Это позволит сохранить эти файлы на уровне репо, если в вашем проекте есть несколько участников. Однако в таких случаях .gitignore должен иметь дело с конкретными файлами каждой ОС и т. Д., Если разные разработчики используют разные ОС. Как и правила для Linux, OSX и т. Д.
Нерв
Я бы порекомендовал каждому разработчику иметь дело со своими ос-определенными файлами в своем собственном .global_ignore, таким образом, проект .gitignore зависит от конкретного проекта.
МакФедр
должен выполнить: git add .gitignore_global, чтобы другие программисты тоже имели этот файл в своей локальной среде?
стекав
58

В некоторых ситуациях вы также можете игнорировать некоторые файлы глобально. Для меня .DS_Store является одним из них. Вот как:

git config --global core.excludesfile /Users/mat/.gitignore

(Или любой файл на ваш выбор)

Затем отредактируйте файл так же, как в репозитории .gitignore. Обратите внимание, что я думаю, что вы должны использовать абсолютный путь.

webmat
источник
26

Если вы не можете удалить файлы из-за их поэтапного использования:

git rm --cached -f *.DS_Store
Реджи Пинкхем
источник
19

Откройте терминал и введите «cd <ProjectPath>»

  1. Удалить существующие файлы: find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

  2. nano .gitignore

  3. Добавь это .DS_Store

  4. введите "Ctrl + X"

  5. Тип "у"

  6. Войдите, чтобы сохранить файл

  7. git add .gitignore

  8. git commit -m '.DS_Store removed.'

Картик Вадивел
источник
nano .gitignoreсоздает файл, если его нет, эта команда должна быть выполнена из корневой папки проекта
Saif
17

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

Создайте файл .gitignore

Чтобы создать файл .gitignore, вы можете просто touchфайл, который создает пустой файл с указанным именем. Мы хотим создать файл с именем .gitignore, чтобы мы могли использовать команду:

touch .gitignore

Игнорировать файлы

Теперь вам нужно добавить строку, которая говорит git игнорировать файлы DS Store в вашем .gitignore. Вы можете использовать нано-редактор, чтобы сделать это.

nano .gitignore

Nano хорош тем, что содержит инструкции о том, как из него выбраться. ( Ctrl- Oсохранить, Ctrl- Xвыйти)

Скопируйте и вставьте некоторые идеи из этого списка Github, в котором перечислены некоторые общие файлы, которые следует игнорировать. Наиболее важными, чтобы ответить на этот вопрос, были бы:

# OS generated files #
######################
.DS_Store
.DS_Store?

# Являются комментариями и помогут вам организовать ваш файл по мере его роста.

Эта статья на Github также имеет некоторые общие идеи и рекомендации.

Удалите файлы, уже добавленные в git

Наконец, вам нужно удалить эти файлы из DS Store из вашего каталога.

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

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

Нажмите .gitignore до Github

Последний шаг, вам нужно зафиксировать ваш файл .gitignore.

git status

git add .gitignore

git commit -m '.DS_Store banished!'

Джошуа Дэнс
источник
3
команда touch в ваших действиях не нужна ... nano создаст файл для вас.
Кори Голдберг
1
Я нашел свой ответ через 2 года и использовал его. Хорошая работа мимо меня. :)
Джошуа Дэнс
Работал отлично !! Спасибо
iUser
15

Мне пришлось изменить git-rm на git-rm в приведенном выше, чтобы заставить его работать:

find . -depth -name '.DS_Store' -exec git rm --cached '{}' \; -print
Дэвид Кан
источник
10

удалите их с помощью git-rm, а затем добавьте .DS_Store, .gitignoreчтобы остановить их добавление снова. Вы также можете использовать blueharvest, чтобы они не создавались вместе.

Натан
источник
9

Если вы хотите удалить файлы DS_Store в каждую папку и подпапку:


В случае уже совершенного DS_Store:

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

Проигнорируйте их:

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

источник
8

Следующее работает лучше всего для меня. Обрабатываются несопоставленные файлы и файлы с локальными изменениями. Для справки, это было в системе Mac 10.7 под управлением git 1.7.4.4.

Найти и удалить:

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

Я также глобально игнорирую .DS_Store во всех репозиториях, устанавливая глобальный core.excludesfile.

Сначала создайте файл (если он еще не существует):

touch ~/.gitignore

Затем добавьте следующую строку и сохраните:

.DS_Store

Теперь сконфигурируйте git так, чтобы уважать файл глобально:

git config --global core.excludesfile ~/.gitignore
jordantbro
источник
8

Используйте эту команду для удаления существующих файлов:

find . -name '*.DS_Store' -type f -delete

Затем добавьте .DS_Storeк.gitignore

Солнечный
источник
6

Я обнаружил, что следующая строка из snipplr лучше всего удаляет все .DS_Store, включая строку с локальными изменениями.

find . -depth -name '.DS_Store' -exec git-rm --cached '{}' \; -print

--cachedвариант, сохраняет ваш локальный, .DS_Storeтак как он все равно будет воспроизводиться.

И, как уже упоминалось выше, добавьте .DS_Storeв файл .gitignore в корне вашего проекта. Тогда это больше не будет в ваших глазах (репо).

манатов
источник
5

Я немного опоздал на вечеринку, но у меня есть хороший ответ. Чтобы удалить файлы .DS_Store, используйте следующие команды из окна терминала, но будьте очень осторожны, удаляя файлы с помощью команды «find». Использование определенного имени с параметром -name является одним из более безопасных способов его использования:

cd directory/above/affected/workareas
find . -name .DS_Store -delete

Вы можете отменить «-delete», если вы хотите просто перечислить их до и после. Это убедит вас, что они ушли.

Что касается совета ~ / .gitignore_global: будьте осторожны здесь. Вы хотите поместить этот красивый файл в .gitignore на верхнем уровне каждой рабочей области и зафиксировать его, чтобы каждый, кто клонирует ваше репо, получал выгоду от его использования.

zeozod
источник
4

Это будет работать:

find . -name "*.DS_Store" -type f -exec git-rm {} \;

Удаляет все файлы, имена которых заканчиваются .DS_Store, в том числе ._.DS_Store.

Джон Топли
источник
3
Звездочка не должна быть там.
Аристотель Пагальцис
3
Звездочка должна быть там, потому что я нашел файлы .DS_Store и ._. DS_Store в моей системе Mac.
МутантМахеш
3
@MutantMahesh. В этом случае вам нужно "*.DS_Store", чтобы звездочка передавалась, findа не расширялась оболочкой.
TRiG
4

По какой-то причине ничего из вышеперечисленного не работает на моем Mac.

Мое решение от терминала запустить:

rm .DS_Store

Затем выполните следующую команду:

git pull origin master
непобедимый
источник
3
$ git commit -m "filter-branch --index-filter 'git rm --cached --ignore-unmatch .DS_Store"
$ git push origin master --force
JZ.
источник
3

При инициализации вашего хранилища пропустите команду git, которая содержит

-u

и это не должно быть проблемой.

dav1dhunt
источник
1
Что, если кто-то еще создал репо, а OP только синхронизируется с ним?
2011 года
3

Это сработало для меня, комбинируя два ответа сверху:

  • $ git rm --cached -f * .DS_Store
  • $ git commit -m "filter-branch --index-filter 'git rm --cached --ignore-unmatch .DS_Store"
  • $ git push origin master --force
JLunceford
источник
3

Удалить игнорируемые файлы:

(.DS_Store)

$ find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch
Cubiczx
источник
3

Лучший способ избавиться от этого файла навсегда и больше никогда не беспокоиться об этом

создайте глобальный файл .gitignore:

echo .DS_Store >> ~ / .gitignore_global

И дайте git знать, что вы хотите использовать этот файл для всех ваших репозиториев:

git config --global core.excludesfile ~ / .gitignore_global И это все! .DS_Store вне вашего пути.

Kasem007
источник
2

Есть несколько решений для решения этой проблемы. Чтобы избежать создания файлов .DS_Store, не используйте OS X Finder для просмотра папок. Альтернативный способ просмотра папок - использование командной строки UNIX. Для удаления файлов .DS_Store можно использовать сторонний продукт под названием DS_Store Terminator. Чтобы удалить файлы .DS_Store из всей системы, можно использовать команду оболочки UNIX. Запустите Terminal из Applications: Utilities. В командной строке UNIX введите следующую команду UNIX: sudo find / -name ".DS_Store" -depth -exec rm {} \; При запросе пароля введите пароль администратора Mac OS X.

Эта команда предназначена для поиска и удаления всех экземпляров .DS_Store, начиная с корня (/) файловой системы через всю машину. Чтобы настроить эту команду для запуска в качестве запланированной задачи, выполните следующие действия: Запустите терминал из приложений: Утилиты. В командной строке UNIX введите следующую команду UNIX:

sudo crontab -e При появлении запроса на ввод пароля введите пароль администратора Mac OS X. Однажды в редакторе vi нажмите букву I на клавиатуре один раз и введите следующее:

15 1 * * * root find / -name ".DS_Store" -depth -exec rm {} \;

Это называется записью crontab, которая имеет следующий формат:

Минутный час DayOfMonth Month DayOfWeek Пользовательская команда.

Запись crontab означает, что команда будет автоматически выполняться системой в 1:15 каждый день под учетной записью root.

Команда начинается с поиска до. Если система не работает, эта команда не будет выполнена.

Чтобы сохранить запись, нажмите клавишу Esc один раз, затем одновременно нажмите Shift + z + z.

Примечание. Информация на шаге 4 предназначена только для редактора vi.

Vinny
источник
2

добавьте это в ваш файл .gitignore

#Ignore folder mac
.DS_Store

сохранить это и сделать коммит

git add -A
git commit -m "ignore .DS_Store"

и теперь вы игнорируете это для всех ваших коммитов

Иезекииль Гарсия
источник
2

создать .gitignoreфайл с помощью командыtouch .gitignore

и добавьте в него следующие строки

.DS_Store

сохраните .gitignoreфайл, а затем вставьте его в git-репозиторий.

2rahulsk
источник
1

Нет необходимости удалять .DS_STORE локально

Просто добавьте его в .gitignoreфайл

Файл .gitignore - это просто текстовый файл, который сообщает Git, какие файлы или папки следует игнорировать в проекте.

команды

  • nano .gitignore
  • Написать .DS_StoreЗатем нажмитеCTRL+X > y > Hit Return
  • git status Чтобы в последний раз взглянуть на ваши изменения
  • git add .gitignore
  • git commit -m 'YOUR COMMIT MESSAGE'
  • git push origin master
Ваэль Ассаф
источник