Как я могу удалить файлы .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!'

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

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. Обратите внимание, что я думаю, что вы должны использовать абсолютный путь.



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

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 на верхнем уровне каждой рабочей области и зафиксировать его, чтобы каждый, кто клонирует ваше репо, получал выгоду от его использования.


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

3

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

-u

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


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

3

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

(.DS_Store)

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

3

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

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

echo .DS_Store >> ~ / .gitignore_global

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

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


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.


2

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

#Ignore folder mac
.DS_Store

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

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

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


2

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

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

.DS_Store

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.