Як я можу видалити .DS_Store файли з сховища Git?


1257

Як я можу видалити такі дратівливі .DS_Storeфайли Mac OS X із сховища Git?



Подумайте, що це те саме в багатьох версіях MacOS, не тільки в Mac OS X.
Джим Ахо

Перевірте https://github.com/xiaozhuai/odourless , я зробив інструмент для запобігання .DS_Store.
Xiaozhuai

Відповіді:


2426

Видаліть наявні файли із сховища:

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 / виключити, а не .gitignore. Дивіться stackoverflow.com/questions/1753070/… для пояснення різниці між ними.
Ендрю Грімм

106
@Andrew: Я не згоден. Ніколи не було б корисним для перевірки файлу .DS_Store, тому це має більше сенсу як налаштування для всіх користувачів сховища, а не те, що потрібно пам’ятати кожному користувачеві Mac, щоб встановити його на власній машині.
бензадо

51
Чи додавання .DS_Storeдо .gitignoreроботи рекурсивно? Тобто, це буде ігнорувати some/level/of/folders/.DS_Store?
Чарлі Шліссер

70
@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 repo в моєму домашньому каталозі (AKA "dotfiles" repo), ~/.gitignoreоскільки мій глобальний файл виключає біль. Є файли, які я хочу виключити зі свого домашнього каталогу, які я не хочу ігнорувати в усьому світі. Я використовую ~/.gitexcludesнатомість через ту саму директиву:core.excludesfile
AL X X

155

Найкраще рішення для вирішення цього питання - глобально ігнорувати ці файли з усіх git repos у вашій системі. Це можна зробити, створивши глобальний файл 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 тощо
Nerve

Я рекомендую, щоб кожен розробник мав справу зі своїми специфічними файлами для ОС.
mcfedr

необхідно запустити: git add .gitignore_global, щоб інші програмісти також мали цей файл у своєму локальному середовищі?
stackdave

58

У деяких ситуаціях ви також можете ігнорувати деякі файли в усьому світі. Для мене .DS_Store - одна з них. Ось як:

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

(Або будь-який файл на ваш вибір)

Потім відредагуйте файл так само, як репортаж .gitignore. Зауважте, що я думаю, вам доведеться використовувати абсолютний шлях.


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. Введіть "y"

  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

Нано приємно, оскільки містить інструкції, як з нього вийти. ( 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щоб зупинити їх додавання знову. Ви також можете використовувати блакитний урожай, щоб зупинити їх створення всі разом


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.
MutantMahesh

3
@MutantMahesh. У такому випадку вам потрібно "*.DS_Store", щоб зірочка передалася findоболонці, а не розширювалася.
TRiG

4

Чомусь ніхто з перерахованого вище не працював на моєму комп'ютері.

Моє рішення з термінального запуску:

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
Що робити, якщо хтось інший створив репо, а ОП лише синхронізує його?
jww

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

2

Для вирішення цієї проблеми існує декілька рішень. Щоб уникнути створення .DS_Store файлів, не використовуйте Finder OS X для перегляду папок. Альтернативний спосіб перегляду папок - використання командного рядка UNIX. Для видалення файлів .DS_Store може бути використаний сторонній продукт, який називається DS_Store Terminator. Для видалення .DS_Store файлів з усієї системи можна використовувати команду оболонки UNIX. Запустити термінал із додатків: Утиліти У запиті оболонки 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 repo.


2

Найкращий спосіб позбутися цього файлу назавжди і більше ніколи про нього не турбуватися - це

створити глобальний файл .gitignore:

echo .DS_Store >> ~ / .gitignore_global

І нехай git знає, що ви хочете використовувати цей файл для всіх своїх сховищ:

git config --global core.excludesfile ~ / .gitignore_global І це все! .DS_Store не в дорозі.


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.