ฉันจะลบไฟล์. DS_Store ออกจากที่เก็บ Git ได้อย่างไร


1257

ฉันจะลบ.DS_Storeไฟล์Mac OS X ที่น่ารำคาญออกจากที่เก็บ Git ได้อย่างไร?



คิดว่านี่เหมือนกันในหลาย ๆ เวอร์ชันของ MacOS ไม่ใช่แค่ Mac OS X เท่านั้น
Jim Aho

ตรวจสอบ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เพราะฉันไม่ต้องกังวลกับการหลบหนีของตัวละครพิเศษมากมาย
benzado

8
สิ่งนี้ควรใช้. git / info / แยกไม่ใช่. gitignore ดูstackoverflow.com/questions/1753070/…สำหรับคำอธิบายของความแตกต่างระหว่างทั้งสอง
Andrew Grimm

106
@Andrew: ฉันไม่เห็นด้วย มันจะไม่เป็นประโยชน์สำหรับไฟล์. DS_Store ที่จะเช็คอินดังนั้นจึงเหมาะสมกว่าสำหรับการตั้งค่าทั้งพื้นที่เก็บข้อมูลผู้ใช้ทั้งหมดแทนที่จะเป็นสิ่งที่ผู้ใช้ Mac แต่ละคนต้องจำไว้ในเครื่องของตัวเอง
benzado

51
การเพิ่ม.DS_Storeการ.gitignoreทำงานซ้ำหรือไม่? นั่นคือมันจะเพิกเฉยsome/level/of/folders/.DS_Storeเช่นกัน?
Charlie Schliesser

70
@CharlieS ใช่ถ้ารูปแบบไม่มีเครื่องหมายทับมันจะจับคู่กับชื่อไฟล์ในไดเรกทอรีทั้งหมด
benzado

239

การรวมคำตอบของเบนโซโด้และ webmat ปรับปรุงด้วยgit rmไม่ล้มเหลวในไฟล์พบว่าไม่ได้อยู่ใน repo และทำให้มันสามารถวางทั่วไปสำหรับผู้ใช้ใด ๆ :

# 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
ฉันพบว่าเมื่อใช้ repo git ในไดเรกทอรีบ้านของฉัน (AKA เป็น "dotfiles" repo) การมี~/.gitignoreไฟล์ที่ไม่รวมทั่วโลกของฉันถือเป็นเรื่องเจ็บปวด มีไฟล์ที่ฉันต้องการแยกออกจากโฮมไดเร็กตอรี่ของฉันที่ฉันไม่ต้องการเพิกเฉย ฉันใช้~/.gitexcludesแทนผ่านคำสั่งเดียวกัน:core.excludesfile
อัล X

155

ทางออกที่ดีที่สุดในการแก้ไขปัญหานี้คือการไม่สนใจไฟล์เหล่านี้จาก repos 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 ของที่เก็บของคุณ การทำเช่นนี้จะทำให้ไฟล์เหล่านี้อยู่ในระดับ repo หากมีผู้สนับสนุนหลายคนในโครงการของคุณ อย่างไรก็ตามในกรณีเช่นนี้. gitignore ควรจัดการกับไฟล์เฉพาะของทุก ๆ ระบบปฏิบัติการหากนักพัฒนาที่แตกต่างกำลังใช้ระบบปฏิบัติการที่แตกต่างกัน เช่นเดียวกับกฎสำหรับ linux, OSX และอื่น ๆ
เส้นประสาท

ฉันอยากจะแนะนำให้นักพัฒนาซอฟต์แวร์แต่ละคนจัดการกับไฟล์เฉพาะของเขาใน. global_ignore ของเขาด้วยวิธีการที่โครงการ. gitignore เป็นโครงการเฉพาะ
mcfedr

ต้องเรียกใช้: git เพิ่ม. gitignore_global เพื่อให้โปรแกรมเมอร์อื่นมีไฟล์นั้นในสภาพแวดล้อมท้องถิ่นของเขา
stackdave

58

ในบางสถานการณ์คุณอาจต้องการละเว้นไฟล์บางไฟล์ทั่วโลก สำหรับฉัน. DS_Store เป็นหนึ่งในนั้น นี่คือวิธี:

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

(หรือไฟล์ใด ๆ ที่คุณเลือก)

จากนั้นแก้ไขไฟล์เช่นเดียวกับ. gitignore ของ repo โปรดทราบว่าฉันคิดว่าคุณต้องใช้เส้นทางที่แน่นอน


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 เหล่านั้นออกจากไดเรกทอรีของคุณ

ใช้คำสั่งที่ยอดเยี่ยมนี้จากคำตอบที่ได้รับการโหวตสูงสุด นี่จะผ่านโฟลเดอร์ทั้งหมดในไดเรกทอรีของคุณและลบไฟล์เหล่านั้นออกจากคอมไพล์

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 จะสร้างไฟล์ให้คุณ
Corey Goldberg

1
ฉันพบคำตอบของฉันเอง 2 ปีต่อมาและใช้มัน งานที่ดีที่ผ่านมาฉัน :)
Joshua Dance

ทำงานอย่างสมบูรณ์แบบ !! ขอบคุณ
iUser


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 ข้ามที่เก็บข้อมูลทั้งหมดโดยการตั้งค่า global core.excludesfile

ก่อนอื่นให้สร้างไฟล์ (หากไม่มีอยู่):

touch ~/.gitignore

จากนั้นเพิ่มบรรทัดต่อไปนี้และบันทึก:

.DS_Store

ตอนนี้กำหนดค่าคอมไพล์ให้เคารพไฟล์ทั่วโลก:

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 ลงในรากของโครงการของคุณ จากนั้นจะไม่อยู่ในสายตาของคุณอีกต่อไป (จาก repos)


5

ฉันไปงานปาร์ตี้ช้า แต่ฉันมีคำตอบที่ดี ในการลบไฟล์. DS_Store ให้ใช้คำสั่งต่อไปนี้จากหน้าต่างเทอร์มินัล แต่ต้องระมัดระวังในการลบไฟล์ด้วย 'find' การใช้ชื่อเฉพาะกับตัวเลือก -name เป็นหนึ่งในวิธีที่ปลอดภัยกว่าในการใช้:

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

คุณสามารถออกจาก "-delete" หากคุณต้องการรายการพวกเขาก่อนและหลัง นั่นจะทำให้คุณมั่นใจว่าพวกเขาจากไปแล้ว

เกี่ยวกับคำแนะนำ ~ / .gitignore_global: ระวังที่นี่ คุณต้องการที่จะวางไฟล์ที่ดีลงใน. gitignore ในระดับสูงสุดของแต่ละ workarea และกระทำเพื่อให้ทุกคนที่โคลน repo ของคุณจะได้รับประโยชน์จากการใช้งาน


4

สิ่งนี้จะได้ผล:

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

มันลบไฟล์ทั้งหมดที่มีชื่อลงท้ายด้วยรวมทั้ง.DS_Store._.DS_Store


3
ไม่ควรใส่เครื่องหมายดอกจัน
อริสโตเติล Pagaltzis

3
ดอกจันควรอยู่ที่นั่นเพราะฉันพบไฟล์. DS_Store และ. _ DS_Store ในระบบ mac ของฉัน
MutantMahesh

3
@MutantMahesh ในกรณีนี้คุณต้องใช้"*.DS_Store"เพื่อให้เครื่องหมายดอกจันส่งผ่านไปยังfindแทนที่จะขยายโดยเชลล์
TRiG

4

ด้วยเหตุผลบางอย่างการทำงานบน mac ของฉันไม่ทำงาน

โซลูชันของฉันมาจากการรันเทอร์มินัล:

rm .DS_Store

จากนั้นเรียกใช้คำสั่งต่อไปนี้:

git pull origin master


3

เมื่อเริ่มต้นพื้นที่เก็บข้อมูลของคุณข้ามคำสั่ง git ที่มี

-u

และมันก็ไม่ควรเป็นปัญหา


1
จะเกิดอะไรขึ้นถ้ามีคนสร้าง repo ขึ้นมาอีกครั้งและ OP ก็ซิงค์กับมันเท่านั้นล่ะ
jww

3

สิ่งนี้ใช้ได้สำหรับฉันคำสั่งผสมสองคำตอบจากด้านบน:

  • $ git rm --cached -f * .DS_Store
  • $ git กระทำ -m "ตัวกรองสาขา - ดัชนี - ตัวกรอง 'git rm - เก็บไว้ --ignore-unmatch .DS_Store"
  • $ git push master --force


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 * * * รูทค้นหา / -name ".DS_Store" -depth -exec rm {} \;

นี่เรียกว่ารายการ crontab ซึ่งมีรูปแบบต่อไปนี้:

นาทีชั่วโมง DayOfMonth เดือน DayOfWeek คำสั่งผู้ใช้

รายการ crontab หมายความว่าคำสั่งจะถูกดำเนินการโดยระบบโดยอัตโนมัติเวลา 1:15 น. ทุกวันโดยบัญชีที่เรียกว่ารูท

คำสั่งเริ่มต้นจากหาจนไปถึง หากระบบไม่ได้ใช้คำสั่งนี้จะไม่ได้รับการดำเนินการ

หากต้องการบันทึกรายการให้กดปุ่ม Esc หนึ่งครั้งจากนั้นกด Shift + z + z

หมายเหตุ: ข้อมูลในขั้นตอนที่ 4 ใช้สำหรับเครื่องมือแก้ไข vi เท่านั้น


2

เพิ่มลงในไฟล์ของคุณ. gignignore

#Ignore folder mac
.DS_Store

บันทึกสิ่งนี้และทำการกระทำ

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

และตอนนี้คุณไม่สนใจสิ่งนี้สำหรับการกระทำทั้งหมดของคุณ


2

สร้าง.gitignoreไฟล์โดยใช้คำสั่งtouch .gitignore

และเพิ่มบรรทัดต่อไปนี้ในนั้น

.DS_Store

บันทึก.gitignoreไฟล์แล้วดันเข้าไปยัง repo คอมไพล์ของคุณ


2

วิธีที่ดีที่สุดในการกำจัดไฟล์นี้ตลอดไปและไม่ต้องกังวลอีกต่อไปคือ

สร้างไฟล์. global ทั่วโลก:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.