Làm cách nào tôi có thể xóa các tệp .DS_Store khỏi kho Git?


1257

Làm cách nào tôi có thể xóa các .DS_Storetệp Mac OS X gây phiền nhiễu đó khỏi kho Git?



Hãy nghĩ rằng điều này giống nhau trong nhiều phiên bản MacOS, không chỉ Mac OS X.
Jim Aho

Kiểm tra https://github.com/xiaozhuai/odourless , tôi đã tạo một công cụ để ngăn chặn .DS_Store.
xiaozhuai

Câu trả lời:


2428

Xóa các tệp hiện có khỏi kho lưu trữ:

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

Thêm dòng

.DS_Store

vào tệp .gitignore, có thể được tìm thấy ở cấp cao nhất của kho lưu trữ của bạn (hoặc được tạo nếu chưa có). Bạn có thể làm điều này dễ dàng với lệnh này trong thư mục trên cùng

echo .DS_Store >> .gitignore

Sau đó

git add .gitignore
git commit -m '.DS_Store banished!'

13
Điều đó thực sự không quan trọng, nhưng việc sử dụng -execsẽ khởi chạy git-rmmột lần cho mỗi tệp .DS_Store, trong khi xargssẽ đặt tất cả các đường dẫn trên một dòng lệnh. Chủ yếu tôi thích xargsvì tôi không phải lo lắng về việc thoát khỏi nhiều nhân vật đặc biệt.
benzado

8
Điều này nên sử dụng .git / thông tin / loại trừ, không phải .gitignore. Xem stackoverflow.com/questions/1753070/ trên để biết giải thích về sự khác biệt giữa hai loại này.
Andrew Grimm

106
@Andrew: Tôi không đồng ý. Sẽ không bao giờ hữu ích khi tệp .DS_Store được kiểm tra, do đó, nó có ý nghĩa hơn khi cài đặt toàn bộ kho lưu trữ, cho tất cả người dùng, thay vì một thứ mà mỗi người dùng Mac cần nhớ để đặt trên máy của mình.
benzado

51
Có thêm .DS_Stoređể .gitignorelàm việc đệ quy? Đó là, nó sẽ bỏ qua some/level/of/folders/.DS_Storelà tốt?
Charlie Schliesser

70
@CharlieS Có, nếu mẫu không chứa dấu gạch chéo, nó được khớp với tên tệp trong tất cả các thư mục.
benzado

239

Kết hợp các câu trả lời của benzado và webmat, cập nhật với git rm, không thất bại trên các tệp được tìm thấy không có trong repo và làm cho nó có thể dán chung cho bất kỳ người dùng nào:

# 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
Tôi thấy rằng khi sử dụng repo git trong thư mục nhà của tôi (AKA một repo "dotfiles"), việc có ~/.gitignoretập tin loại trừ toàn cầu của tôi là một nỗi đau. Có những tệp mà tôi muốn loại trừ khỏi thư mục nhà của tôi mà tôi không muốn bỏ qua trên toàn cầu. Tôi sử dụng ~/.gitexcludesthay vì thông qua cùng một chỉ thị:core.excludesfile
AL the X

156

Giải pháp tốt nhất để giải quyết vấn đề này là Globally bỏ qua các tệp này khỏi tất cả các repos git trên hệ thống của bạn. Điều này có thể được thực hiện bằng cách tạo một tệp gitignore toàn cầu như:

vi ~/.gitignore_global

Thêm quy tắc để bỏ qua các tệp như:

# 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

Bây giờ, thêm tệp này vào cấu hình git toàn cầu của bạn:

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

Biên tập:

Các biểu tượng đã bị xóa vì chúng có thể cần phải được cam kết là tài sản ứng dụng.


Bạn cũng có thể thêm các quy tắc trên vào .gitignore của kho lưu trữ của bạn. Điều này sẽ tránh xa các tệp này ở cấp repo nếu có nhiều người đóng góp cho dự án của bạn. Tuy nhiên, trong những trường hợp như vậy, .gitignore nên xử lý các tệp cụ thể của mọi HĐH, v.v nếu các nhà phát triển khác nhau đang sử dụng các HĐH khác nhau. Giống như các quy tắc cho linux, OSX, v.v.
Nerve

Tôi sẽ đề nghị mỗi nhà phát triển xử lý các tệp cụ thể os của mình trong .global_ignore của riêng mình, theo cách đó, dự án .gitignore là dự án cụ thể.
mcfedr

phải chạy: git add .gitignore_global, để các lập trình viên khác có tập tin đó trong môi trường cục bộ của anh ta?
stackdave

58

Trong một số tình huống, bạn cũng có thể muốn bỏ qua một số tệp trên toàn cầu. Đối với tôi, .DS_Store là một trong số đó. Đây là cách thực hiện:

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

(Hoặc bất kỳ tập tin nào bạn chọn)

Sau đó chỉnh sửa tệp giống như .gitignore của repo. Lưu ý rằng tôi nghĩ bạn phải sử dụng một đường dẫn tuyệt đối.


26

Nếu bạn không thể xóa các tệp vì chúng có các thay đổi được sử dụng theo giai đoạn:

git rm --cached -f *.DS_Store

19

Mở terminal và gõ "cd <ProjectPath>"

  1. Xóa các tệp hiện có: find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

  2. nano .gitignore

  3. Thêm điều này .DS_Store

  4. gõ "ctrl + x"

  5. Nhập "y"

  6. Nhập để lưu tệp

  7. git add .gitignore

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


nano .gitignoretạo tập tin nếu không có, lệnh này sẽ được thực thi từ thư mục gốc của dự án
Saif

17

Câu trả lời được bình chọn hàng đầu là tuyệt vời, nhưng giúp đỡ những tân binh như tôi, đây là cách tạo tệp .gitignore, chỉnh sửa, lưu nó, xóa các tệp bạn có thể đã thêm vào git, sau đó đẩy tệp lên Github.

Tạo tệp .gitignore

Để tạo tệp .gitignore, bạn chỉ có thể touchtạo tệp tạo tệp trống có tên được chỉ định. Chúng tôi muốn tạo tệp có tên .gitignore để có thể sử dụng lệnh:

touch .gitignore

Bỏ qua các tập tin

Bây giờ bạn phải thêm dòng thông báo cho git bỏ qua các tệp DS Store vào .gitignore của bạn. Bạn có thể sử dụng trình soạn thảo nano để làm điều này.

nano .gitignore

Nano rất hay vì nó bao gồm các hướng dẫn về cách thoát khỏi nó. ( Ctrl- Ođể lưu, Ctrl- Xđể thoát)

Sao chép và dán một số ý tưởng từ ý chính Github này liệt kê một số tệp phổ biến cần bỏ qua. Những câu hỏi quan trọng nhất, để trả lời câu hỏi này, sẽ là:

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

# Là các bình luận và sẽ giúp bạn sắp xếp tệp của mình khi nó phát triển.

Bài viết này của Github cũng có một số ý tưởng và hướng dẫn chung.

Xóa các tệp đã được thêm vào git

Cuối cùng, bạn cần thực sự xóa các tệp DS Store khỏi thư mục của mình.

Sử dụng lệnh tuyệt vời này từ câu trả lời bỏ phiếu hàng đầu. Điều này sẽ đi qua tất cả các thư mục trong thư mục của bạn và xóa các tệp đó khỏi git.

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

Đẩy .gitignore lên đến Github

Bước cuối cùng, bạn cần thực sự cam kết tệp .gitignore của mình.

git status

git add .gitignore

git commit -m '.DS_Store banished!'


3
lệnh cảm ứng trong các bước của bạn không cần thiết ... nano sẽ tạo tệp cho bạn.
Corey Goldberg

1
Tôi tìm thấy câu trả lời của riêng mình 2 năm sau và sử dụng nó. Tốt công việc qua tôi. :)
Vũ điệu Joshua

Làm việc hoàn hảo !! Cảm ơn
Người dùng

15

Tôi đã phải thay đổi git-rm thành git rm ở trên để làm cho nó hoạt động:

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

10

xóa chúng bằng cách sử dụng git-rmvà sau đó thêm .DS_Store .gitignoređể ngăn chúng được thêm lại. Bạn cũng có thể sử dụng blueharvest để ngăn chặn chúng được tạo ra cùng nhau


9

Trong trường hợp bạn muốn xóa các tệp DS_Store vào mọi thư mục và thư mục con:


Trong trường hợp DS_Store đã cam kết:

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

Bỏ qua chúng bằng cách:

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

Sau đây làm việc tốt nhất cho tôi. Xử lý các tệp chưa từng có và các tệp có sửa đổi cục bộ. Để tham khảo, đây là trên hệ thống Mac 10.7 chạy git 1.7.4.4.

Tìm và xóa:

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

Tôi cũng bỏ qua toàn cầu .DS_Store trên tất cả các kho lưu trữ bằng cách đặt core.excludesfile toàn cầu.

Đầu tiên, tạo tệp (nếu không tồn tại):

touch ~/.gitignore

Sau đó thêm dòng sau và lưu lại:

.DS_Store

Bây giờ cấu hình git để tôn trọng tệp trên toàn cầu:

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

8

Sử dụng lệnh này để xóa các tệp hiện có:

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

Sau đó thêm .DS_Storevào.gitignore


6

Tôi thấy rằng dòng sau từ snipplr thực hiện tốt nhất việc xóa tất cả .DS_Store, bao gồm cả dòng có sửa đổi cục bộ.

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

--cachedtùy chọn, giữ địa phương của bạn .DS_Storevì nó sẽ được sao chép bằng mọi cách.

Và giống như đã đề cập ở trên, hãy thêm .DS_Storevào tệp .gitignore trên thư mục gốc của dự án của bạn. Sau đó, nó sẽ không còn trong tầm nhìn của bạn (của repos).


5

Tôi đến bữa tiệc muộn một chút, nhưng tôi có một câu trả lời hay. Để xóa các tệp .DS_Store, hãy sử dụng các lệnh sau từ cửa sổ đầu cuối, nhưng hãy cẩn thận xóa các tệp bằng 'find'. Sử dụng tên cụ thể với tùy chọn -name là một trong những cách an toàn hơn để sử dụng tên đó:

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

Bạn có thể bỏ "-delete" nếu bạn muốn liệt kê chúng trước và sau. Điều đó sẽ trấn an bạn rằng họ đã biến mất.

Liên quan đến lời khuyên ~ / .gitignore_global: hãy cẩn thận ở đây. Bạn muốn đặt tệp đẹp đó vào .gitignore trong cấp độ cao nhất của mỗi workarea và cam kết nó, để bất kỳ ai nhân bản repo của bạn sẽ đạt được lợi ích của việc sử dụng nó.


4

Điều này sẽ làm việc:

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

Nó xóa tất cả các tập tin có tên kết thúc .DS_Store, bao gồm ._.DS_Store.


3
Dấu hoa thị không nên ở đó.
Aristotle Pagaltzis

3
dấu hoa thị nên ở đó vì tôi tìm thấy các tệp .DS_Store và ._. DS_Store trên hệ thống mac của tôi.
MutantMahesh

3
@MutantMahesh. Trong trường hợp đó, bạn cần "*.DS_Store", để dấu hoa thị được chuyển đến findchứ không phải mở rộng bằng vỏ.
TRiG

4

Vì một số lý do, không có cái nào ở trên hoạt động trên máy mac của tôi.

Giải pháp của tôi là từ thiết bị đầu cuối chạy:

rm .DS_Store

Sau đó chạy lệnh sau:

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

Khi khởi tạo kho lưu trữ của bạn, hãy bỏ qua lệnh git có chứa

-u

và nó không phải là một vấn đề.


1
Điều gì xảy ra nếu người khác tạo repo và OP chỉ đồng bộ hóa với nó?
jww

3

Điều này làm việc cho tôi, kết hợp hai câu trả lời từ trên:

  • $ git rm - đã đóng gói -f * .DS_Store
  • $ git commit -m "bộ lọc nhánh --index-filter 'git rm --cached --ignore-unmatch .DS_Store"
  • $ git đẩy chủ gốc - lực lượng

3

Xóa các tệp bị bỏ qua:

(.DS_Store)

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

2

Có một vài giải pháp để giải quyết vấn đề này. Để tránh tạo tệp .DS_Store, không sử dụng Trình tìm OS X để xem các thư mục. Một cách khác để xem các thư mục là sử dụng dòng lệnh UNIX. Để xóa các tệp .DS_Store, có thể sử dụng sản phẩm của bên thứ ba có tên DS_Store Terminator. Để xóa các tệp .DS_Store khỏi toàn bộ hệ thống, có thể sử dụng lệnh shell UNIX. Khởi chạy Terminal từ Ứng dụng: Tiện ích Tại dấu nhắc shell UNIX, hãy nhập lệnh UNIX sau: sudo find / -name ".DS_Store" -depth -exec rm {} \; Khi được nhắc nhập mật khẩu, hãy nhập mật khẩu Quản trị viên Mac OS X.

Lệnh này là để tìm và loại bỏ tất cả các lần xuất hiện của .DS_Store bắt đầu từ gốc (/) của hệ thống tệp thông qua toàn bộ máy. Để cấu hình lệnh này để chạy như một tác vụ theo lịch trình, hãy làm theo các bước dưới đây: Khởi chạy Terminal từ Ứng dụng: Tiện ích Tại dấu nhắc shell UNIX, hãy nhập lệnh UNIX sau:

sudo crontab -e Khi được nhắc nhập mật khẩu, hãy nhập mật khẩu Quản trị viên Mac OS X. Khi ở trong trình soạn thảo vi, nhấn chữ I trên bàn phím của bạn một lần và nhập thông tin sau:

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

Đây được gọi là mục crontab, có định dạng sau:

Phút giờ DayOfMonth Tháng DayOfWeek Lệnh người dùng.

Mục crontab có nghĩa là lệnh sẽ được hệ thống tự động thực thi vào lúc 1:15 sáng hàng ngày bởi tài khoản được gọi là root.

Lệnh bắt đầu từ tìm tất cả các cách để. Nếu hệ thống không chạy, lệnh này sẽ không được thực thi.

Để lưu mục nhập, nhấn phím Esc một lần, sau đó nhấn đồng thời Shift + z + z.

Lưu ý: Thông tin trong Bước 4 chỉ dành cho trình soạn thảo vi.


2

thêm phần này vào tập tin của bạn .gitignore

#Ignore folder mac
.DS_Store

lưu cái này và thực hiện cam kết

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

và bây giờ bạn bỏ qua điều này cho tất cả các cam kết của bạn


2

tạo một .gitignoretập tin bằng lệnhtouch .gitignore

và thêm các dòng sau vào nó

.DS_Store

lưu .gitignoretập tin và sau đó đẩy nó vào repo git của bạn.


2

Cách tốt nhất để thoát khỏi tập tin này mãi mãi và không bao giờ phải lo lắng về nó nữa là

tạo một tệp .gitignore toàn cầu:

tiếng vang .DS_Store >> ~ / .gitignore_global

Và cho git biết rằng bạn muốn sử dụng tệp này cho tất cả các kho lưu trữ của bạn:

git config --global core.excludesfile ~ / .gitignore_global Và đó là nó! .DS_Store không theo cách của bạn.


1

Không cần phải loại bỏ .DS_STOREcục bộ

Chỉ cần thêm nó vào .gitignoretập tin

Tệp .gitignore chỉ là một tệp văn bản cho Git biết các tệp hoặc thư mục nào sẽ bỏ qua trong một dự án.

Các lệnh

  • nano .gitignore
  • Viết .DS_Storerồi bấmCTRL+X > y > Hit Return
  • git status Để có cái nhìn cuối cùng về những thay đổi của bạn
  • git add .gitignore
  • git commit -m 'YOUR COMMIT MESSAGE'
  • git push origin master
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.