คุณทำให้ Git ละเว้นไฟล์โดยไม่ใช้. gitignore ได้อย่างไร


133

เนื่องจากข้อ จำกัด แปลก ๆ ภายนอกฉันไม่สามารถแก้ไขที่.gitignoreเก็บของฉันได้ มีวิธีละเว้นไฟล์และไดเร็กทอรีอื่นนอกเหนือจากการแก้ไข.gitignoreหรือไม่? แม้ว่าจะเป็นโซลูชันระดับโลกเช่นการกำหนดค่าส่วนกลางที่จะนำไปใช้กับที่เก็บทั้งหมดของฉัน

คำตอบ:


179

อย่าลืมตามgitignoreว่ามีลำดับความสำคัญใน "แหล่งที่มาของรูปแบบที่ไม่สนใจ" ต่างๆที่ Git พิจารณา:

  • รูปแบบอ่านจากบรรทัดคำสั่งสำหรับคำสั่งเหล่านั้นที่รองรับ
  • รูปแบบที่อ่านจากไฟล์. gitignore ในไดเร็กทอรีเดียวกับพา ธ หรือในไดเร็กทอรีพาเรนต์ใด ๆ โดยรูปแบบในไฟล์ระดับที่สูงกว่า (สูงสุดถึงรูท) จะถูกแทนที่โดยไฟล์ระดับล่างลงไปยังไดเร็กทอรีที่มีไฟล์
  • รูปแบบอ่านจาก$GIT_DIR/info/exclude.
  • core.excludesfileรูปแบบการอ่านจากแฟ้มที่ระบุโดยตัวแปรการกำหนดค่า

สองข้อสุดท้ายอาจเป็นทางออกสำหรับปัญหาของคุณ แต่:

  • ไม่ได้จำลองแบบสำหรับที่เก็บที่ห่างไกล
  • พวกเขาสามารถมีรูปแบบที่ถูกแทนที่โดยแหล่งที่มาอื่น ๆ

(ดูคำถาม SOนี้ด้วย)


อีกสองวิธีที่เกี่ยวข้องกับการอัปเดตดัชนี ( git update-index):

อย่างไรก็ตามเมื่อคุณชำระเงินสาขาอื่นหรือเมื่อคุณgit pullสถานะ "ละเว้น" นั้นอาจถูกรีเซ็ต ดังนั้นตัวเลือกอื่น ๆ :

ความแตกต่างระหว่างทั้งสองมีอธิบายไว้ใน " Git - ความแตกต่างระหว่าง ' assume-unchanged' และ ' skip-worktree' "


คุณสามารถใช้update-index --assume-unchanged@see stackoverflow.com/a/25253144/292408
Elijah Lynn

1
@ElijahLynn นั่นเอง update-index --skip-work-treeคุณยังมี ฉันแก้ไขคำตอบเพื่อเพิ่มลิงก์ไปยังคำตอบเก่า ๆ ของฉันที่แสดงupdate-indexคำสั่งทั้งสองนี้
VonC

142

หากคุณสามารถแก้ไขได้.git/info/excludeคุณสามารถวางกฎเดียวกันไว้ที่นั่นได้ แต่ไฟล์นั้นอยู่ใน repo ในเครื่องของคุณเท่านั้น


ดูเหมือนว่านี่อาจเป็นทางออกที่ดีที่สุดของคุณ ให้คุณแยกไฟล์ออกจากที่เก็บในเครื่องของคุณ
Abizern

1
สิ่งนี้ทำงานกับโมดูลย่อยอย่างไร ไม่มี.gitไดเร็กทอรีในโมดูลย่อย ...
zakdances

10
@yourfriendzak .gitโฟลเดอร์ของโมดูลย่อยอยู่ที่parent_repo/.git/modules/submodule_name. ดังนั้นคุณต้องแก้ไขparent_repo/.git/modules/submodule_name/info/exclude
Kara Brightwell

25

มีสามวิธีในการบอก GIT ว่าจะละเว้นไฟล์ใด:

  • .gitignore ไฟล์
  • $GIT_DIR/.git/info/exclude
  • ไฟล์ที่ชี้ไปผ่านการcore.excludesfileตั้งค่า

สองประเด็นหลังสามารถแก้ปัญหาของคุณได้

สำหรับข้อมูลเพิ่มเติมโปรดดูที่gitignore (5)


5

หากคุณแค่ต้องการมีไฟล์ในเครื่องในที่เก็บและตำแหน่งไดเร็กทอรีย่อยมีความยืดหยุ่นคุณสามารถใส่ไฟล์ของคุณเข้าไปtracked_dir1/tracked_dir2/untracked_dir/แล้วเพิ่มไฟล์ที่tracked_dir1/tracked_dir2/untracked_dir/.gitignoreมีเนื้อหาเช่น:

*

กล่าวคือ

$ cat > tracked_dir1/tracked_dir2/untracked_dir/.gitignore
*
<Ctrl+D>

4

ฉันอยู่ในสถานการณ์คล้าย ๆ กันดังนั้นฉันจึงเพิ่มโซลูชันที่ต้องการซึ่งฉันไม่เห็นกล่าวถึง ปัญหาgit update-index --assume-unchangedในกรณีนี้คือคุณไม่สามารถทำเช่นนั้นสำหรับไฟล์ที่ไม่ได้ติดตาม คุณบอกว่า

ฉันไม่สามารถแก้ไข. gitignore ของที่เก็บของฉันได้

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


3

ละเว้นการเปลี่ยนแปลงในระบบของไฟล์ที่ติดตาม: git update-index --assume-unchanged my-file.php

ยกเลิกการลบการเปลี่ยนแปลงในระบบของไฟล์ที่ติดตาม: git update-index --no-assume-unchanged my-file.php

แหล่งที่มา: git help update-index

--[no-]assume-unchanged
           ...
           This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked
           files (akin to what .gitignore does for untracked files). Git will fail (gracefully) in case it needs to
           modify this file in the index e.g. when merging in a commit; thus, in case the assumed-untracked file is
           changed upstream, you will need to handle the situation manually.


1

อีกวิธีหนึ่ง:

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