วิธีละเว้นไฟล์บางไฟล์ใน Git


731

ฉันมีที่เก็บพร้อมไฟล์Hello.java. เมื่อฉันรวบรวมมันHello.classไฟล์เพิ่มเติมจะถูกสร้างขึ้น

ฉันสร้างรายการสำหรับHello.classใน.gitignoreไฟล์ อย่างไรก็ตามไฟล์ดังกล่าวยังคงถูกติดตาม

ฉันจะทำให้ Git เพิกเฉยได้Hello.classอย่างไร


8
คุณหมายถึง "มันไม่ทำงาน"? คุณอาจเพิ่ม Hello.class ไปยังที่เก็บของคุณหรือไม่? gitignores ไม่มีผลกับเนื้อหาที่ติดตามไปแล้ว ดูตัวอย่างstackoverflow.com/questions/1139762/gitignore-file-not-ignoring
Cascabel

คำตอบ:


809

ปัญหาคือ.gitignoreละเว้นไฟล์ที่ไม่ได้ติดตามมาก่อน (โดยgit add) รันgit reset name_of_fileเพื่อเลิกเก็บไฟล์และเก็บไว้ ในกรณีที่คุณต้องการที่จะยังเอาไฟล์ที่ได้รับจากพื้นที่เก็บข้อมูล (หลังจากการผลักดัน), git rm --cached name_of_fileการใช้งาน


190
คำสั่งgit rm --cached name_of_fileจะลบไฟล์ออกจาก repo git ของคุณ แม้ว่าคุณจะเพิ่มลงในไฟล์. gitignore ของคุณ ที่ไม่ได้สนใจที่จะลบ
OrwellHindenberg

4
ซึ่งน่าจะเป็นสิ่งที่ OP ต้องการในกรณีนี้
Ondrej Slinták

40
ฉันดีใจที่โซลูชันของคุณใช้งานได้กับ @ Kohan95! แม้ว่าคำถามนี้ควรจะเปลี่ยนชื่อตามคำตอบที่เลือก ความคิดเห็นของฉันเป็นเพียงคำเตือนให้ devs ที่อาจไม่ทราบว่าคำสั่งทำอะไร
OrwellHindenberg

91
git reset name_of_fileลบการติดตามและไม่ลบไฟล์
Cees Timmerman

7
พยายาม git rm - แคช <name_of_file> มันลบไฟล์ใน repo แต่เนื่องจากอยู่ในไฟล์. gitignore สำเนาโลคอลจึงไม่ถูกลบ ในฐานะที่เป็นหมายเหตุเพิ่มเติมเพื่อเพิ่มไดเรกทอรีคุณจะต้องใส่ไว้ในที่มีต่อท้ายทับ '/' ฉันลบไดเรกทอรีการตั้งค่าของ Rubymine ในโครงการทับทิมที่มีคนเช็คอินซึ่งก็คือ ".idea" ในไฟล์ที่ฉันใส่ ".idea /" แล้ว "git rm --cached -r .idea" เพื่อลบไดเรกทอรีและทุกอย่างภายใต้มัน (เพราะ git เฉพาะรุ่นไฟล์ไม่ใช่ไดเรกทอรี.)
Doug Noel

222

วิธีเพิกเฉยไฟล์ใหม่

ทั่วโลก

เพิ่มเส้นทางไปยังไฟล์ที่คุณต้องการเพิกเฉย .gitignoreไฟล์ (และคอมมิท) รายการไฟล์เหล่านี้จะใช้กับผู้อื่นที่ตรวจสอบที่เก็บข้อมูล

ในท้องถิ่น

เพิ่มเส้นทางไปยังไฟล์ของคุณซึ่งคุณต้องการเพิกเฉยต่อ.git/info/excludeไฟล์ของคุณ รายการไฟล์เหล่านี้จะใช้กับสำเนาการทำงานในท้องถิ่นของคุณเท่านั้น

วิธีละเว้นไฟล์ที่ถูกเปลี่ยนแปลง (ชั่วคราว)

ในการเพิกเฉยไฟล์ที่ถูกเปลี่ยนแปลงเพื่อแสดงรายการว่าถูกแก้ไขคุณสามารถใช้คำสั่ง git ต่อไปนี้:

git update-index --assume-unchanged <file>

หากต้องการคืนค่าความไม่รู้นั้นให้ใช้คำสั่งต่อไปนี้:

git update-index --no-assume-unchanged <file>

สมบูรณ์แบบสำหรับการป้องกันไฟล์ที่ถือคีย์ api ปัจจุบันจากการถูกผลักเข้าไปใน GitHub!
Jim In Texas

1
@Xman ทำไมคุณพูดว่ามันชั่วคราว? ฉันทำตามขั้นตอนที่คุณกล่าวถึงเรื่องการlocalละเว้นคอมไพล์แล้วรีสตาร์ทระบบของฉันมันยังคงแสดงว่าทำงานได้โดยตรง
Vivek Vardhan

1
ขอบคุณสำหรับupdate-indexเคล็ดลับที่มีประโยชน์สมบูรณ์แบบเพื่อหลีกเลี่ยงการเปลี่ยนแปลง.gitignoreไฟล์ซึ่งถูกติดตามโดย Git!
โทมัสพี

@mcbjam ไม่มีคำสั่ง git ที่ไม่สนใจเป็นพิเศษ แก้ไขไฟล์. gignignore ที่อยู่ในตำแหน่งที่เหมาะสมภายในสำเนาการทำงาน คุณควรเพิ่ม. gitignore นี้และคอมมิท ทุกคนที่โคลนที่ repo จะถูกละเลยกว่าไฟล์เหล่านั้น
Xman Classical

@Vivek Vardhan git update-index - สมมติว่าไม่มีการเปลี่ยนแปลงเป็นเหมือนมาสก์ชั่วคราวในดัชนี มันจะยังคงมีผลจนกว่าคุณจะปิด เพื่อทำให้จุดของฉันชัดเจนยิ่งขึ้นดัชนีเริ่มต้น (นั่นคือทันทีหลังจาก git read-tree) "มี" ไฟล์ทั้งหมดจาก tree-ish ที่เพิ่งอ่านมาดังนั้นการทำให้ Git "เมิน" รายการดัชนีไม่เท่ากับการลบอย่างแท้จริง
Xman Classical

150

เพิ่มบรรทัดต่อไปนี้ใน. gitignore:

/Hello.class

สิ่งนี้จะยกเว้น Hello.class จาก git หากคุณยืนยันแล้วให้รันคำสั่งต่อไปนี้:

git rm Hello.class

ถ้าคุณต้องการแยกไฟล์คลาสทั้งหมดออกจาก git ให้เพิ่มบรรทัดต่อไปนี้ใน. gitignore:

*.class

32
การเพิ่มHello.classลงใน.gitignoreจะไม่สนใจไฟล์ใด ๆ ที่เรียกว่าHello.classในไดเรกทอรีย่อย หากคุณต้องการละเว้นไฟล์Hello.classในไดเรกทอรีเดียวกับ.gitignoreไฟล์ให้ใช้/Hello.classบรรทัดแทน
ndim

คุณวาง.gitignoreไฟล์ไว้ที่ไหน
CodyBugstein

6
@Imray คุณสามารถใส่.gitignoreที่ใดก็ได้ในโครงการคอมไพล์ - หากเส้นทางเริ่มต้นด้วย/มันจะสัมพันธ์กับตำแหน่งของ.gitignoreไฟล์; มิฉะนั้นจะอ้างถึงไฟล์ซ้ำในไดเรกทอรีปัจจุบันและไดเรกทอรีที่สืบทอด
อาร์มันด์

109

1) สร้าง.gitignoreไฟล์ ในการทำเช่นนั้นคุณเพียงสร้าง.txtไฟล์และเปลี่ยนนามสกุลดังนี้:

ป้อนคำอธิบายภาพที่นี่

จากนั้นคุณต้องเปลี่ยนชื่อเขียนบรรทัดต่อไปนี้ในหน้าต่าง cmd:

 rename git.txt .gitignore

ในกรณีที่git.txtเป็นชื่อของไฟล์ที่คุณเพิ่งสร้าง

จากนั้นคุณสามารถเปิดไฟล์และเขียนไฟล์ทั้งหมดที่คุณไม่ต้องการเพิ่มลงในที่เก็บ ตัวอย่างเช่นของฉันมีลักษณะเช่นนี้:

#OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
*.pyc
*.xml
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

เมื่อคุณมีสิ่งนี้แล้วคุณจะต้องเพิ่มมันเข้าไปในที่เก็บ Git ของคุณ คุณต้องบันทึกไฟล์ในที่เก็บของคุณ

จากนั้นใน Git Bash คุณต้องเขียนบรรทัดต่อไปนี้:

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

หากที่เก็บมีอยู่แล้วคุณต้องทำดังต่อไปนี้:

  1. git rm -r --cached .
  2. git add .
  3. git commit -m ".gitignore is now working"

หากขั้นตอนที่ 2 ไม่ทำงานคุณควรเขียนเส้นทางทั้งหมดของไฟล์ที่คุณต้องการเพิ่ม


คุณสามารถใช้คำสั่ง "copy con .gignignore" ในพรอมต์แล้วกด CTRL + Z เพื่อสร้างไฟล์โดยตรงโดยไม่ต้องใช้ Windows Explorer
heringer

61

วิธีเพิกเฉย:

git update-index --assume-unchanged <path/to/file>

หากต้องการยกเลิกการเพิกเฉย:

git update-index --no-assume-unchanged <path/to/file>

6
ฉันต้องการให้แผนภูมินี้เป็นทางแก้ปัญหา .... มันง่ายและสง่างาม
user1457958

"มันง่ายมากและสง่างาม" - ไม่จริง : 'สมมติว่าไม่เปลี่ยนแปลงไม่ควรถูกใช้ในทางที่ผิด มันคือ "ฉันรู้ว่าการดำเนินการของระบบไฟล์ของฉันช้าฉันจะสัญญากับ Git ว่าฉันจะไม่เปลี่ยนเส้นทางเหล่านี้ ... " โดยเฉพาะอย่างยิ่งมันไม่ใช่สัญญา ... ว่า Git จะพิจารณาเส้นทางเหล่านี้เสมอว่าไม่มีการแก้ไข - ถ้า Git สามารถกำหนดเส้นทางได้ ... เปลี่ยนแปลงโดยไม่มีlstat(2)ค่าใช้จ่ายเพิ่มเติมขอสงวนสิทธิ์ในการรายงานว่าเส้นทางได้รับการแก้ไข (... git commit -aมีอิสระที่จะยอมรับการเปลี่ยนแปลงนั้น) '
Chris

47

คุณสามารถใช้วิธีการด้านล่างเพื่อเพิกเฉย / ไม่สนใจการเปลี่ยนแปลงในไฟล์ที่ถูกติดตาม

  1. สำหรับการละเลย: git update-index --assume-unchanged <file>
  2. สำหรับการคืนค่าไฟล์ที่ละเว้น: git update-index --no-assume-unchanged <file>

4
สิ่งนี้ใช้ได้กับทุกไฟล์หรือไม่? มันไม่ชัดเจนว่าคำสั่งเหล่านั้นอาจนำไปใช้กับไฟล์เพียงไฟล์เดียวเพื่อเพิกเฉย / ยกเลิกการเพิกถอนได้อย่างไร
javadba

@kapil ในที่สุด !! สิ่งที่ใช้งานได้จริงในรูปแบบคำสั่ง git ล้านล้าน! พยายามทุกคำตอบเพื่อละเว้นไฟล์ build.xml โง่ ๆ ที่ยังคงปรากฏหลังจากสร้างทุกครั้ง ... ขอบคุณ!
killjoy

1
โปรดอย่า : 'ไม่ควรเปลี่ยนแปลงสมมติว่าไม่ใช้สำหรับกลไกการเพิกเฉย มันคือ "ฉันรู้ว่าการดำเนินการของระบบไฟล์ของฉันช้าฉันจะสัญญากับ Git ว่าฉันจะไม่เปลี่ยนเส้นทางเหล่านี้ ... " โดยเฉพาะอย่างยิ่งมันไม่ใช่สัญญา ... ว่า Git จะพิจารณาเส้นทางเหล่านี้เสมอว่าไม่มีการแก้ไข - ถ้า Git สามารถกำหนดเส้นทางได้ ... เปลี่ยนแปลงโดยไม่มีlstat(2)ค่าใช้จ่ายเพิ่มเติมขอสงวนสิทธิ์ในการรายงานว่าเส้นทางได้รับการแก้ไข (... git commit -aมีอิสระที่จะยอมรับการเปลี่ยนแปลงนั้น) '
Chris

22

สร้าง.gitignoreในไดเรกทอรีที่เป็น. git คุณสามารถแสดงรายการไฟล์ในไฟล์โดยคั่นด้วยบรรทัดใหม่ คุณยังสามารถใช้สัญลักษณ์แทน:

*.o
.*.swp

3
เป็นวิธีปฏิบัติที่ดีในการหลีกเลี่ยงการวางรูปแบบเฉพาะเครื่องมือ (เช่นไฟล์ Vim ชั่วคราวของคุณ) ใน.gitignoreไฟล์ (เว้นแต่ว่าโครงการนั้นได้รับคำสั่งจากโครงการ) คุณสามารถใส่รูปแบบสำหรับเครื่องมือที่คุณชื่นชอบในไฟล์แยกตามผู้ใช้ (ชุดcore.excludesFile); มันจะทำงานกับที่เก็บข้อมูลทั้งหมดของคุณ เช่นgit config --global core.excludesFile "$HOME/.git-user-excludes"วางไว้ในไฟล์นั้น
Chris Johnsen

@ Chris: ขอบคุณสำหรับเคล็ดลับ แต่ฉันเพียงแค่เขียนมันมีเพราะไม่มีอะไรดีขึ้นมาในใจของฉัน :)
ปลายทาง

1
@ChrisJohnsen 'เฉพาะเครื่องมือ?' สำหรับกลุ่ม? ฉันคิดว่ามันปลอดภัยที่จะแยกไฟล์แลกเปลี่ยนเป็นกลุ่ม ..
javadba

16

จากเว็บไซต์ GitHub อย่างเป็นทางการ:

หากคุณมีไฟล์อยู่แล้วและคุณต้องการเพิกเฉยมัน Git จะไม่เพิกเฉยต่อไฟล์หากคุณเพิ่มกฎในภายหลัง ในกรณีดังกล่าวคุณต้องยกเลิกการติดตามไฟล์ก่อนโดยรันคำสั่งต่อไปนี้ในเทอร์มินัลของคุณ:

git rm --cached FILENAME

หรือ

git rm --cached .

12

คุณควรเขียนสิ่งที่ชอบ

*.class

ลงใน.gitignoreไฟล์ของคุณ


4
@AgentZebra คุณควรเพิ่มรายการ*.classของคุณ.gitignoreเพื่อให้คอมไพล์ละเว้นไฟล์ทั้งหมดที่ลงท้าย.classด้วย
KingCrunch

7

เพิ่มไฟล์ที่คุณต้องการละเว้นไฟล์.gitignore:

* .class

* .projects

* .prefs

*.โครงการ



5

หากคุณยืนยันไฟล์แล้วและคุณพยายามที่จะเพิกเฉยต่อการเพิ่ม.gitignoreไฟล์ Git จะไม่เพิกเฉย เพื่อที่คุณจะต้องทำสิ่งต่าง ๆ ด้านล่าง:

git rm --cached FILENAME

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

  1. นำทางไปยังที่เก็บ Git ของคุณ
  2. ป้อน "touch .gitignore" ซึ่งจะสร้าง.gitignoreไฟล์

3

คุณยังสามารถใช้. gitattributes (แทน. gitignore) เพื่อยกเว้นประเภทไฟล์ทั้งหมด ไฟล์อธิบายตัวเองได้ค่อนข้างสวย แต่ฉันกำลังวางเนื้อหาที่นี่เพื่อการอ้างอิง ให้ความสนใจกับบรรทัดสุดท้าย (* .class binary):

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
*.gif binary
*.ico binary
*.mo binary
*.pdf binary
*.phar binary
*.class binary

2

เพิ่มบรรทัดต่อไปนี้ใน. git / info / แยก:
Hello.class


คุณควรเปลี่ยนไฟล์ภายในโฟลเดอร์.gitหรือไม่?
Peter Mortensen

อาจไม่ใช่ความคิดที่ดีที่จะสัมผัสไฟล์เหล่านั้นภายใต้. git ด้วยตนเอง
mgyky

2

ฉันมีปัญหาคล้ายกับไฟล์ "dump.rdb"
ฉันพยายามเพิ่มไฟล์นี้ในรูปแบบต่างๆลงในไฟล์. gignignore แต่ใช้วิธีการเดียวเท่านั้น

เพิ่มชื่อไฟล์ของคุณที่ท้ายไฟล์. gitignore

หมายเหตุ: การเพิ่มไฟล์ในที่อื่นไม่ทำงาน

ตัวอย่างเช่นดู: https://gitlab.com/gitlab-org/gitlab-ce/raw/b3ad3f202478dd88a3cfe4461703bc3df1019f90/.gitignore


2

หน้าเว็บนี้อาจมีประโยชน์และประหยัดเวลาเมื่อทำงานกับ.gitignoreอาจจะมีประโยชน์และประหยัดเวลาเมื่อทำงานกับ

มันจะสร้างไฟล์. gignignore โดยอัตโนมัติสำหรับ IDE และระบบปฏิบัติการที่แตกต่างกันด้วยไฟล์ / โฟลเดอร์เฉพาะที่คุณมักไม่ต้องการดึงไปยังที่เก็บ Git ของคุณ (เช่นโฟลเดอร์เฉพาะของ IDE และไฟล์กำหนดค่า)


1

ฉันลองสิ่งนี้ -

  1. รายการไฟล์ที่เราต้องการละเว้น

git status .idea/xyz.xml .idea/pqr.iml Output .DS_Store

  1. คัดลอกเนื้อหาของขั้นตอนที่ # 1 และผนวกเข้ากับไฟล์. gitignore

echo " .idea/xyz.xml .idea/pqr.iml Output .DS_Store" >> .gitignore

  1. ตรวจสอบ

git status .gitignore

ในทำนองเดียวกันเราสามารถเพิ่มไดเรกทอรีและ dir ย่อยทั้งหมดของมัน / ไฟล์ที่เราต้องการที่จะละเว้นในสถานะ git โดยใช้directoryname/*และฉันดำเนินการคำสั่งนี้จากsrcไดเรกทอรี


1
  1. ไปที่ไฟล์. gignignore และเพิ่มรายการสำหรับไฟล์ที่คุณต้องการละเว้น
  2. วิ่ง git rm -r --cached .
  3. ตอนนี้ทำงาน git add .

0

ฉันได้ลอง--assume-unchangedและยัง.gitignoreไม่ดี พวกเขาทำให้มันยากที่จะสลับสาขาและยากที่จะรวมการเปลี่ยนแปลงจากคนอื่น นี่คือทางออกของฉัน:

เมื่อฉันยืนยันฉันจะลบไฟล์ออกจากรายการด้วยตนเองการเปลี่ยนแปลง

ก่อนที่ฉันจะดึงฉันเก็บไฟล์ที่ถูกเปลี่ยนแปลง และหลังจากที่ดึงผมทำป๊อปซ่อน

  1. คอมไพล์สะสม
  2. git pull
  3. คอมไพล์สะสมป๊อป

ขั้นตอนที่ 3 บางครั้งจะทำให้เกิดการรวมและอาจทำให้เกิดความขัดแย้งที่คุณต้องแก้ไขซึ่งเป็นสิ่งที่ดี

สิ่งนี้ทำให้ฉันสามารถทำการเปลี่ยนแปลงในท้องถิ่นที่ไม่ได้แชร์กับผู้อื่นในทีม

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