ฉันจะกำหนดค่า git ให้ละเว้นไฟล์บางไฟล์ในเครื่องได้อย่างไร


1350

ฉันจะเพิกเฉยต่อไฟล์ในเครื่องโดยไม่ทำให้เกิดมลพิษกับการตั้งค่า git ทั่วโลกสำหรับคนอื่น ๆ ได้หรือไม่? ฉันมีไฟล์ที่ไม่ได้ติดตามซึ่งเป็นสแปมในสถานะ git ของฉัน แต่ฉันไม่ต้องการยอมรับการเปลี่ยนแปลงการตั้งค่า git สำหรับไฟล์ untracked สุ่มเล็ก ๆ น้อย ๆ ที่ฉันมีในสาขาท้องถิ่นของฉัน

คำตอบ:


1862

จากเอกสาร Git ที่เกี่ยวข้อง :

รูปแบบที่เฉพาะเจาะจงกับที่เก็บเฉพาะ แต่ไม่จำเป็นต้องแชร์กับที่เก็บอื่น ๆ ที่เกี่ยวข้อง (เช่นไฟล์เสริมที่อยู่ภายในที่เก็บ แต่เฉพาะกับเวิร์กโฟลว์ของผู้ใช้คนเดียว) ควรเข้าสู่$GIT_DIR/info/excludeไฟล์

.git/info/excludeไฟล์มีรูปแบบเหมือนกับที่.gitignoreไฟล์ อีกทางเลือกหนึ่งคือการตั้งcore.excludesFileชื่อไฟล์ที่มีรูปแบบทั่วโลก

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

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

หมายเหตุเกี่ยวกับ$GIT_DIR : นี่คือสัญลักษณ์ที่ใช้ทั่วทั้งคู่มือ git เพื่อระบุเส้นทางไปยังที่เก็บ git หากมีการตั้งค่าตัวแปรสภาพแวดล้อมแล้วมันจะแทนที่ตำแหน่งของสิ่งที่คุณซื้อซ้ำซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ


แก้ไข : อีกวิธีคือการใช้:

git update-index --skip-worktree <file-list>

ย้อนกลับโดย:

git update-index --no-skip-worktree <file-list>

204
ในฐานะโน้ตให้แน่ใจว่าได้รันgit update-index --assume-unchanged [<file>...]หลังจากทำการเพิ่มไปยังไฟล์ที่แยก การเปลี่ยนแปลงจะไม่ถูกหยิบขึ้นมาจนกว่าจะถึงตอนนั้น
tollmanz

30
ฉันไม่จำเป็นต้องเรียกใช้ 'git update-index ... ' เพื่อให้การเปลี่ยนแปลงมีผลโดยใช้ git 1.7.9.5
Jeffrey Martinez

39
คุณจะต้องใช้ git update-index เฉพาะเมื่อคุณทำการเปลี่ยนแปลงไฟล์แล้วและต้องการให้ละเว้น หากคุณเปลี่ยนแปลงไม่รวมก่อนทำการเปลี่ยนแปลงก็ไม่จำเป็น
Brady Emerson

13
แม้ว่าสิ่งนี้จะหยุดไฟล์ไม่ให้ปรากฏเมื่อมีการเปลี่ยนแปลงในระหว่างการคอมมิทเช่น. gitignore ซึ่งไม่เหมือนกับไฟล์ที่ถูกละเว้นไฟล์จะยังคงถูกรีเซ็ตกลับไปเป็นเวอร์ชัน repo หากคุณเรียกใช้ git reset - ฮาร์ด
Brady Emerson

19
ต่อstackoverflow.com/questions/23097368/...และstackoverflow.com/questions/13630849/... , จะมีแนวโน้มที่จะต้องการที่จะskip-worktree assume-unchanged
danShumway

436

อัปเดต : ลองใช้git update-index --skip-worktree [<file>...]แทนขอบคุณ @danShumway! ดูคำอธิบาย Borealid เกี่ยวกับความแตกต่างของทั้งสองตัวเลือก


คำตอบเก่า:

หากคุณต้องการที่จะไม่สนใจการเปลี่ยนแปลงในท้องถิ่นเพื่อติดตามไฟล์ (เรามีที่มีการปรับเปลี่ยนในท้องถิ่นเพื่อ config ไฟล์), git update-index --assume-unchanged [<file>...]การใช้งาน


8
เพิ่งทราบว่าฉันเพิ่มไฟล์ใน $ GIT_DIR / info / แยก (เช่น my-file.php) จากนั้นต้องเรียกใช้git update-index --assume-unchanged my-file.phpเพื่อเริ่มต้นให้ละเว้น ขอบคุณสำหรับทิป!
tollmanz

78
หากต้องการยกเลิกมัน git update-index --no-assume-unchanged my-file.php
เรย์

18
เพียงเพื่อชี้แจง: สมมติ-เปลี่ยนแปลงสำหรับไฟล์ติดตาม (อยู่ใน repo) ที่ ... OP ถามสำหรับไฟล์ที่ไม่ได้ติดตามซึ่งในกรณีนี้.git/info/excludeคือสิ่งที่คุณต้องการ (เพื่อหลีกเลี่ยงมลพิษ .gitignore มักจะใช้ร่วมกันและการติดตาม)
dyodji

7
ตามstackoverflow.com/questions/23097368/…สิ่งนี้ถือว่าไม่ปลอดภัยและไฟล์ของคุณอาจยังคงถูกส่งต่อหากคุณไม่ระวัง มันมีไว้เพื่อเป็นตัวช่วยด้านประสิทธิภาพไม่ใช่วิธีแก้ปัญหาที่เข้าใจผิดได้
danShumway

3
ฉันรีบวิ่งไป--assume-unchangedก่อนที่จะอ่านของคุณปรับปรุง ฉัน undid ด้วย--no-assume-unchangedและแล้วก็--skip-worktree... ฉันในที่ชัดเจน?
Nicolas Miari

162

เพิ่มบรรทัดต่อไปนี้ในส่วน [นามแฝง] ของไฟล์. gitconfig ของคุณ

ignore = update-index --assume-unchanged
unignore = update-index --no-assume-unchanged
ignored = !git ls-files -v | grep "^[[:lower:]]"

ตอนนี้คุณสามารถใช้git ignore my_fileเพื่อละเว้นการเปลี่ยนแปลงในไฟล์โลคัลและgit unignore my_fileเพื่อหยุดการเพิกเฉยต่อการเปลี่ยนแปลง git ignoredแสดงรายการไฟล์ที่ถูกละเว้น

คำตอบนี้เป็นที่รวบรวมได้จากhttp://gitready.com/intermediate/2009/02/18/temporarily-ignoring-files.html


1
"! git ls-files -v | grep" ^ [[: ต่ำกว่า:]] "- โอกาสใด ๆ ที่คุณรู้วิธีทำบน windows cmd?
Haohmaru

3
ติดตั้งเชลล์จริง (เช่น Babun มี bash หรือ zsh);) ฉันรู้ว่าความรู้สึกของคุณ แต่ฉันเพิ่งเปลี่ยนจาก Windows เป็น Linux และฉันจะไม่ใช้ cmd อีกต่อไป
Xerus

@Haohmaru คุณสามารถใช้ WSL (ระบบย่อย Windows สำหรับ Linux) ได้เสมอ
ก.ย.

110

คุณมีหลายทางเลือก:

  • ทิ้งไฟล์สกปรก (หรือไม่ผูกมัด) .gitignoreไว้ใน dir ที่ทำงานของคุณ (หรือใช้มันโดยอัตโนมัติโดยใช้topgitหรือเครื่องมือแก้ไขอื่น ๆ ดังกล่าว)
  • ใส่การแยกใน$GIT_DIR/info/excludeไฟล์ของคุณหากเป็นแบบเฉพาะทรีหนึ่ง
  • เรียกใช้และเพิ่มรูปแบบที่คุณgit config --global core.excludesfile ~/.gitignore ~/.gitignoreตัวเลือกนี้ใช้ถ้าคุณต้องการที่จะไม่สนใจรูปแบบบางอย่างในต้นไม้ทั้งหมด ฉันใช้สิ่งนี้สำหรับ.pycและ.pyoไฟล์เช่น

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


10
ฉันคิดว่าคุณต้องgit config --globalตั้งค่าตัวเลือกทั่วโลก
Josh Lee

7
ที่จริงแค่เพิ่ม. gitignore ไปยัง. gitignore;)!
Dominik George

68

ฉันคิดว่าคุณกำลังมองหา:

git update-index --skip-worktree FILENAME

ซึ่งเพิกเฉยต่อการเปลี่ยนแปลงที่เกิดขึ้นในท้องถิ่น

นี่คือhttp://devblog.avdi.org/2011/05/20/keep-local-modifications-in-git-tracked-files/คำอธิบายเพิ่มเติมเกี่ยวกับโซลูชันเหล่านี้!

เพื่อเลิกใช้:

git update-index --no-skip-worktree FILENAME

9
มีการอภิปรายที่เกี่ยวข้องระหว่าง--skip-worktreeและ--assume-unchangedที่คำถาม SO นี้
Merwer

1
ฉันจะยกเลิกสิ่งนี้ได้อย่างไรหรือดูรายการไฟล์ / รูปแบบที่กำลังถูกเพิกเฉยในขณะนี้--skipworktreeฉันควรจะเปลี่ยนใจและต้องการเริ่มติดตามไฟล์อีกครั้งในภายหลัง
ความผิดปกติ

1
จะยกเลิกสิ่งนี้ได้อย่างไร
user1735921

3
หากต้องการยกเลิกโปรดใช้git update-index --no-skip-worktree <file>
user1735921

49

คุณสามารถติดตั้งนามแฝง gitบางอย่างเพื่อทำให้กระบวนการนี้ง่ายขึ้น วิธีนี้จะแก้ไข[alias]โหนดของ.gitconfigไฟล์ของคุณ

git config --global alias.ignore 'update-index --skip-worktree'
git config --global alias.unignore 'update-index --no-skip-worktree'
git config --global alias.ignored '!git ls-files -v | grep "^S"'

ทางลัดที่ติดตั้งให้คุณมีดังนี้:

  • git ignore config.xml
    • git จะแกล้งทำเป็นว่าไม่เห็นการเปลี่ยนแปลงใด ๆconfig.xml- ป้องกันคุณจากการกระทำการเปลี่ยนแปลงเหล่านั้นโดยไม่ตั้งใจ
  • git unignore config.xml
    • git จะดำเนินการต่อเพื่อรับทราบการเปลี่ยนแปลงของคุณเพื่อconfig.xmlให้คุณสามารถยอมรับการเปลี่ยนแปลงเหล่านั้นได้อีกครั้ง
  • git ignored
    • git จะแสดงรายการไฟล์ทั้งหมดที่คุณ "เพิกเฉย" ในลักษณะที่อธิบายไว้ข้างต้น

ฉันสร้างสิ่งเหล่านี้โดยอ้างถึงคำตอบของ phatmann - ซึ่งนำเสนอ--assume-unchangedรุ่นเดียวกัน

รุ่นที่ฉันนำเสนอใช้--skip-worktreeเพื่อเพิกเฉยต่อการเปลี่ยนแปลงในเครื่อง ดูคำตอบของ Borealidสำหรับคำอธิบายทั้งหมดของความแตกต่าง แต่เป็นหลัก--skip-worktree's วัตถุประสงค์สำหรับนักพัฒนาเพื่อไฟล์การเปลี่ยนแปลงโดยไม่ต้องเสี่ยงของการเปลี่ยนแปลงการกระทำของพวกเขา

git ignoredคำสั่งนำเสนอที่นี่ใช้git ls-files -vและกรองรายการที่จะแสดงเพียงรายการเหล่านั้นเริ่มต้นด้วยSแท็ก Sแท็กหมายถึงไฟล์ที่มีสถานะเป็น "ข้าม worktree" สำหรับรายชื่อเต็มของสถานะของไฟล์ที่แสดงโดยgit ls-files: ดูเอกสารสำหรับตัวเลือก-tgit ls-files


1
สิ่งนี้ใช้ไม่ได้กับไฟล์ที่ไม่ได้ติดตาม: <(git 2.13.5 บน osx)
Terra Ashley

คือ '!' ควรจะอยู่ใน'!git ls-files -v | grep "^S"'? คำสั่งใช้งานไม่ได้สำหรับฉันตอนนี้ .. และดูเหมือนว่าจะทำงานได้ดีเมื่อลบออกแล้ว
Tiris

เครื่องหมายอัศเจรีย์ในนามแฝงคอมไพล์บอกคอมไพล์เรียกใช้คำสั่งภายนอกมากกว่าsubcommand คอมไพล์ ฉันใส่เข้าไปเพราะฉันต้องการไปป์ไลน์ดังนั้นฉันต้องเรียกใช้คอมไพล์จากภายนอก ฉันพยายามลบเครื่องหมายอัศเจรีย์ (ตามคำแนะนำของคุณ) แต่นั่นไม่ได้ผลสำหรับฉัน Expansion of alias 'ignored' failed; 'git' is not a git commandฉันได้รับ เรื่องนี้ทำให้รู้สึก; โดยไม่ต้องเครื่องหมายอัศเจรีย์: git git ls-files …คอมไพล์นามแฝงคำสั่งของคุณจะ
Birchlabs

ขอบคุณสำหรับคำอธิบาย ฉันไม่คุ้นเคยกับนามแฝงคอมไพล์และเพิ่งทำงานในเชลล์เพื่อทดสอบก่อนที่จะทำการนามแฝง
Tiris

นี่เป็นทางออกที่ยอดเยี่ยม เนื่องจาก git ติดตามต่อไดเรกทอรีเมื่อคุณเรียกใช้นามแฝงข้างต้นgit ignore <filename>จะใช้กับไดเรกทอรีนั้นเท่านั้น และในที่สุดเมื่อคุณต้องการเปลี่ยนแปลงไฟล์และคอมมิชชันและพุชไปที่รีโมตเพียงแค่ใช้สะดวกgit unignore <filename>ในการเริ่มติดตามอีกครั้งชั่วคราว! ขอบคุณ!
nickang

42

คุณสามารถเพิ่มไฟล์ .gitignore ไปยังไดเรกทอรีที่บ้านของคุณคือหรือ$HOME/.gitignore ~/.gitignoreจากนั้นบอก git ให้ใช้ไฟล์นั้นกับคำสั่ง:

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

นี่เป็นไฟล์. gitignore ปกติซึ่ง git อ้างอิงเมื่อตัดสินใจว่าจะละเว้นอะไร เนื่องจากอยู่ในโฮมไดเร็กตอรี่ของคุณ, จึงมีผลกับคุณเท่านั้นและไม่สร้างมลพิษให้กับไฟล์. gitignore

ฉันใช้วิธีนี้มานานหลายปีด้วยผลลัพธ์ที่ยอดเยี่ยม


ขอบคุณ @EricChen ฉันได้อัปเดตคำตอบแล้ว ให้ลองและจากนั้นใช้git check-ignore <file-name>ในการตรวจสอบ LMK ถ้ามันเหมาะกับคุณ
JESii

ใช้งานได้เฉพาะกับฉันหากไม่มี=:git config --global core.excludesfile ~/.gitignore
E. Sundin

ฉันวาง.gitignoreไฟล์ไว้ใต้โฮมไดเร็กตอรี่และบอกให้ git ใช้ไฟล์นั้นแทนจากนั้นลบไฟล์ที่ฉันต้องการยกเลิกการติดตามในเครื่อง อย่างไรก็ตามหลังจากที่ฉันผลักดันการเปลี่ยนแปลงที่เก็บระยะไกลก็ลบไฟล์เหล่านั้นด้วย ฉันทำอะไรผิดหรือเปล่า?
zyy

ว้าว @xyz; .gitignoreเกี่ยวกับการละเว้นไฟล์ที่มีอยู่ในไดเรกทอรีท้องถิ่นของคุณ สิ่งที่คุณควรทำคือการgit rm --cachedลบพวกเขาออกจาก repo แต่ทิ้งไว้ในท้องถิ่นของคุณ คุณควรจะสามารถย้อนกลับไปที่การคอมมิชชันก่อนหน้าของคุณด้วยgit reset --soft HEAD^การยกเลิกการคอมมิทและกู้คืนไฟล์ของคุณ นั่นคือความงามของคอมไพล์: มันยังมีอยู่ในประวัติศาสตร์คอมไพล์ของคุณ
JESii

2

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


1
ที่ดี! FYI: ใช้งานได้เพียงเพราะ git ติดตามเฉพาะไฟล์ (และอนุญาตให้คุณส่ง) ไม่ใช่โฟลเดอร์
jmiserez

-2

หาก repo ของคุณยังไม่มีไฟล์. gitignore วิธีแก้ไขง่ายๆคือการสร้างไฟล์. gitignore และเพิ่ม.gitignoreเข้าไปในรายการไฟล์ที่จะไม่สนใจ


4
และถ้าหากทีมต้องการเพิ่มเพื่อเพิ่ม gitignore ในภายหลัง มันใช้งานได้จริงเหรอ? ฟังดูเหมือนความคิดแย่ ๆ และชอบบางสิ่งที่ไม่ควรใช้งาน
Bjorn

คำตอบของผู้ชายคนนี้ทำให้ฉันแตก ไม่มีใครทำแบบนี้
Martyn Chamberlin

นี่เป็นวิธีแก้ปัญหาที่ง่ายและรวดเร็วตราบใดที่มีที่สำหรับวาง repo ของเรามี.gitignoreไฟล์ที่แชร์อยู่ด้านบน แต่ไฟล์สกปรกของฉันอยู่ในโฟลเดอร์ที่ลึกดังนั้นฉันเพิ่งเพิ่มของตัวเอง.gitignoreถัดจากพวกเขา +1
joeytwiddle
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.