เหตุใด Git จึงไม่เพิกเฉยต่อไฟล์ที่ฉันระบุ


195

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

sites/default/settings.php

แต่เมื่อฉันพิมพ์git statusมันจะแสดงไฟล์เป็นไฟล์ที่ไม่มีการจัดฉาก

มีปัญหาอะไร? รูปแบบอื่น ๆ ทั้งหมดทำงานได้ดี



ฉันมีปัญหาเดียวกันจากนั้นฉันค้นพบว่าฉันบันทึกไฟล์. gitignore ของฉันลงในไดรฟ์อื่นแทน: face-palm:
Henry Chan

เป็นความคิดที่ดีมากที่จะเก็บข้อมูลไว้ในที่เก็บของคุณและไม่สนใจสิ่งที่เปลี่ยนแปลง
Yevgeniy Afanasyev

คำตอบ:


370

ตรวจสอบให้แน่ใจว่าคุณ.gitignoreอยู่ในรากของไดเรกทอรีการทำงานและในระยะไดเรกทอรีที่git statusและคัดลอก.gitignoreเส้นทางไปยังแฟ้มจากการแสดงผลสถานะและวางมันลงไป

หากวิธีนี้ใช้ไม่ได้แสดงว่าไฟล์ของคุณถูกติดตามโดย Git แล้ว git statusคุณสามารถยืนยันนี้ผ่านการส่งออกของ หากไฟล์นั้นไม่ปรากฏในส่วน“ ไฟล์ที่ไม่ได้ติดตาม” แสดงว่าไฟล์นั้นถูกติดตามโดย Git แล้วและจะไม่สนใจกฎจาก.gitignoreไฟล์นั้น

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

ในการเพิกเฉยต่อไฟล์จริงๆคุณต้องยกเลิกการติดตามและลบออกจากพื้นที่เก็บข้อมูล git rm --cached sites/default/settings.phpคุณสามารถทำได้โดยใช้ สิ่งนี้จะลบไฟล์ออกจากพื้นที่เก็บข้อมูลโดยไม่ต้องลบไฟล์ทางกายภาพ (นั่นคือสิ่งที่--cachedทำ) หลังจากยอมรับการเปลี่ยนแปลงไฟล์จะถูกลบออกจากที่เก็บและไม่ควรดำเนินการอย่างถูกต้อง


'รากของไดเรกทอรีทำงาน' หมายความว่าอย่างไร ไดเรกทอรีที่พบที่เก็บข้อมูล '.git' หรือไม่
Jonathan Leffler

ไดเร็กทอรีการทำงานคือไดเร็กทอรีที่.gitไดเร็กทอรีอยู่และตัวเองเป็นรูทของที่เก็บ เช่นเดียวกับเมื่อคุณโคลนที่เก็บข้อมูล/xy/จากนั้น/xy/เป็นไดเรกทอรีการทำงานของคุณด้วย/xy/.git/ภายใน
สะกิด

3
บางครั้งคุณอาจต้องดำเนินการสักgit add .ครู่git rm --cachedเพื่อสร้างดัชนีใหม่อย่างถูกต้อง
คูเปอร์

แนวคิดในการตรวจสอบในสถานะ git นั้นยอดเยี่ยม ฉันตรวจสอบมันใน Git Staging ใน Eclipse และเส้นทางไม่ถูกต้อง ขอบคุณ!
walla

1
ฉันต้องการเพิ่มแฟล็ก -r (เรียกซ้ำ) เนื่องจากฉันได้ตรวจสอบโฟลเดอร์ซ้อนกันด้วย ในกรณีของฉันฉันย้ายไปที่รูทของโฟลเดอร์ git ของฉันจากนั้นรันคำสั่ง git rm --cached -r .vs / Where vs เป็นโฟลเดอร์ระดับบนสุดที่ฉันต้องการลบออกจากการติดตาม
Devology Ltd

106

ฉันพบสิ่งนี้มันเป็นคำถามเก่า แต่ฉันต้องการให้ไฟล์นั้นถูกติดตาม แต่จะไม่ติดตามในสำเนาที่ทำงานได้เพื่อที่คุณจะได้ทำงาน

git update-index --assume-unchanged sites/default/settings.php

5
นั่นคือคำตอบที่ฉันต้องการ คำตอบอื่น ๆ ทั้งหมดถือว่าไฟล์นั้นถูกเพิ่มเข้ามาด้วย git add ซึ่งไม่ได้เป็นอย่างนั้นเสมอไป ด้วย Acquia Cloud ไฟล์. gitignore ควรจะละเว้น settings.php (ตัวอย่าง) แต่ไฟล์นั้นรวมอยู่ในการคอมมิทครั้งแรก การยกเลิกการติดตามไฟล์เพียงแค่ลบออกจากที่เก็บดังนั้นการลบมันออกจากเว็บไซต์ที่ใช้งานจริง ...
PatrickS

ช่วยฉันด้วย - ขอบคุณ! โหวตขึ้น ฉันสงสัยว่ามันใช้ได้กับ repo คอมไพล์ท้องถิ่นเท่านั้นและจะไม่คงอยู่เมื่อถูกผลักไปที่รีโมตและโคลนโดย devs คนอื่น ๆ ?
อีวาน

1
ใช่มันเป็นของท้องถิ่นเท่านั้น
Mescalito

41

. gitignore จะเพิกเฉยต่อไฟล์ที่คุณยังไม่ได้เพิ่มในที่เก็บของคุณ

ถ้าคุณทำgit add .และไฟล์ถูกเพิ่มไปยังดัชนี. gitignore จะไม่ช่วยคุณ คุณจะต้องทำgit rm sites/default/settings.phpเพื่อลบมันแล้วมันจะถูกละเว้น


Thanks.but ฉันจะลบไฟล์จากดัชนีเท่านั้นและไม่ได้ออกจากไดเรกทอรีการทำงานได้อย่างไร
Nick.h

1
git rmควรทำเช่นนั้น แต่อาจขอให้คุณใช้ตัวเลือก -f ซึ่งจะลบออกจากไดเรกทอรีการทำงาน ฉันไม่ได้คิดเรื่องนี้นอกจากทำสำเนาไฟล์ทำgit rm -fแล้วกู้คืนสำเนา
jonescb

ชายคนเดียวกัน ทำสำเนาที่อื่นลบออกกระทำรัฐลบเพิ่มไฟล์กลับและดูว่าพวกเขาจะถูกละเว้นในขณะนี้
Yevgeniy Afanasyev

18

กรุณาใช้คำสั่งนี้

git rm -rf --cached .
git add .

บางครั้งไฟล์. gignignore ไม่ทำงานแม้ว่าจะถูกต้อง เหตุผลที่ Git เพิกเฉยไฟล์คือพวกเขาไม่ได้ถูกเพิ่มในที่เก็บ หากคุณเพิ่มไฟล์ที่คุณต้องการเพิกเฉยก่อนหน้าไฟล์นั้นจะถูกติดตามโดย Git และกฎการจับคู่ที่ข้ามจะถูกข้ามไป Git ทำเช่นนี้เพราะไฟล์เป็นส่วนหนึ่งของที่เก็บข้อมูลอยู่แล้ว


12

ผมมีปัญหาเหมือนกัน. ไฟล์ที่กำหนดไว้ในสถานที่ที่ระบุว่าเป็นไฟล์ที่ไม่ได้ติดตามเมื่อทำงาน.gitingoregit status

เหตุผลก็คือ.gitignoreไฟล์ถูกบันทึกในการUTF-16LEเข้ารหัสไม่ใช่การUTF8เข้ารหัส

หลังจากเปลี่ยนการเข้ารหัส.gitignoreไฟล์เป็นไฟล์ที่UTF8ใช้งานได้สำหรับฉัน


ฉันรู้สึกเป็น noob เพราะสิ่งนี้ ... dang it Windows
Coty Embry

มีความคิดใดว่าเหตุใดการเข้ารหัสไฟล์จึงสำคัญ อาจจะไม่ได้อ่านเส้นทางอย่างถูกต้อง?
Chargenn

2

สิ่งที่ฉันทำเพื่อละเว้นไฟล์settings.phpสำเร็จ:

  1. git rm - ไซต์ที่แคช / ค่าเริ่มต้น / settings.php
  2. กระทำ (จนถึงที่นี่ไม่ทำงาน)
  3. ไซต์ที่ถูกลบด้วยตนเอง / default / settings.php (สิ่งนี้ทำเคล็ดลับ)
  4. คอมไพล์เพิ่ม
  5. กระทำ (ละเว้นสำเร็จ)

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


2

มีอินสแตนซ์เช่นไฟล์ Application Configuration ซึ่งฉันต้องการติดตามใน git (ดังนั้น. gignignore จะไม่ทำงาน) แต่ฉันต้องเปลี่ยนการตั้งค่าท้องถิ่น ฉันไม่ต้องการให้คอมไพล์จัดการไฟล์เหล่านี้หรือแสดงว่าถูกแก้ไข เมื่อต้องการทำสิ่งนี้ฉันใช้ skip-worktree:

git update-index --skip-worktree path/to/file

คุณสามารถยืนยันว่าไฟล์ถูกข้ามโดยการแสดงไฟล์และตรวจสอบบรรทัดที่ขึ้นต้นด้วย S เพื่อข้าม

git ls-files -v | grep ^S

หากในอนาคตคุณต้องการให้ git จัดการไฟล์ภายในเครื่องอีกครั้งให้เรียกใช้:

 git update-index --no-skip-worktree path/to/file

เมสคาลิโตด้านบนมีคำตอบที่ดีซึ่งทำให้ฉันลงไปในเส้นทางที่ถูกต้อง แต่

git update-index - สมมติว่าไฟล์ไม่เปลี่ยนแปลง / ถึง / ไม่สนใจ. php

มีสัญญากับ git ซึ่งผู้ใช้สัญญาว่าจะไม่เปลี่ยนแปลงไฟล์และอนุญาตให้ Git สมมติว่าไฟล์แผนผังการทำงานตรงกับสิ่งที่บันทึกไว้ในดัชนี

อย่างไรก็ตามฉันเปลี่ยนเนื้อหาของไฟล์ดังนั้นในกรณีของฉัน --skip-worktree เป็นตัวเลือกที่ดีกว่า

เว็บไซต์ของ Toshiharu Nishina ให้คำอธิบายที่ยอดเยี่ยมเกี่ยวกับการข้ามงานและข้อสมมติที่ไม่เปลี่ยนแปลง: ละเว้นไฟล์ที่จัดการกับ Git แล้ว


2

อีกเหตุผลที่เป็นไปได้ - บางกรณีของลูกค้าของคอมไพล์ทำงานในเวลาเดียวกัน ตัวอย่างเช่น "git shell" + "GitHub Desktop" ฯลฯ


สิ่งนี้เกิดขึ้นกับฉันฉันใช้ "GitHub Desktop" เป็นลูกค้าหลักและไม่สนใจการตั้งค่า. gitignore ใหม่: กระทำหลังจากคอมมิท:

  1. คุณทำอะไรสักอย่าง
  2. ถัดไปยอมรับ: มันละเว้นการตั้งค่า. gignignore Commit มีไฟล์ temp จำนวนมากที่กล่าวถึงใน. gitignore
  3. ล้างแคชคอมไพล์ ตรวจสอบว่า. gignignore เป็น UTF8 หรือไม่ ลบไฟล์ -> กระทำ -> ย้ายไฟล์กลับ ข้าม 1 คอมมิท - ไม่ช่วยอะไรเลย

สาเหตุ : ตัวแก้ไขรหัส Visual Studio ถูกเรียกใช้ในพื้นหลังที่มีที่เก็บเปิดเดียวกัน รหัส VS มีการควบคุมคอมไพล์ในตัวและสิ่งนี้ทำให้เกิดความขัดแย้ง

วิธีแก้ปัญหา : ตรวจสอบไคลเอ็นต์ git ที่ซ่อนอยู่หลายรายการและใช้ไคลเอ็นต์ git เพียงครั้งเดียวโดยเฉพาะในขณะที่ล้างแคช git


1

ตรวจสอบให้แน่ใจว่า. gignignore ไม่มีส่วนขยาย !! ไม่สามารถเป็น. gitignore.txt ใน windows เพียงตั้งชื่อไฟล์. gitignore และมันจะทำงาน


0

ฉันเพิ่งลองกับ git 1.7.3.1 และให้โครงสร้างเช่น:

repo/.git/
repo/.gitignore
repo/sites/default/settings.php

โดยที่repo"ราก" ดังกล่าวข้างต้น (ฉันจะเรียกมันว่ารากของต้นไม้ทำงานของคุณ) และ.gitignoreมีเพียงsites/default/settings.phpการเพิกเฉยใช้งานได้สำหรับฉัน (และมันไม่สำคัญว่าจะ.gitignoreถูกเพิ่มลงใน repo หรือไม่) สิ่งนี้ตรงกับรูปแบบ repo ของคุณหรือไม่? ถ้าไม่แตกต่างอะไร


ใช่มันเหมือนกับของคุณ แต่ไม่ทำงานรูปแบบอื่น ๆ ทั้งหมดทำงานตามที่ฉันบอกว่าปัญหาย่อมเกี่ยวข้องกับโฟลเดอร์ settings.php
Nick.h

ฉันรู้สึกว่ามันเป็นความคิดที่ดีมากในการเก็บข้อมูลไว้ในที่เก็บของคุณและไม่สนใจสิ่งที่เปลี่ยนแปลงไป
Yevgeniy Afanasyev

@YevgeniyAfanasyev ยกเว้นสำหรับการส่งออกสิ่งที่ชอบสะสมตั้งค่าผู้ใช้ IDE, ไฟล์ temp อื่น ๆ ทั้งหมดที่สร้างโดย toolchain ของคุณ ...
คริสคาร์โรลล์ F

ฉันหมายถึงการรักษาความมุ่งมั่นในที่เก็บข้อมูลไม่ใช่แค่ไฟล์ที่อยู่ในโฟลเดอร์โครงการ ทำไมคุณต้องการไฟล์ temp ในที่เก็บ?
Yevgeniy Afanasyev

0

ในกรณีที่ทุกคนในอนาคตมีปัญหาเดียวกันกับที่ฉันทำ:

ถ้าคุณใช้

*
!/**/
!*.*

เคล็ดลับในการลบไฟล์ไบนารีที่ไม่มีส่วนขยายตรวจสอบให้แน่ใจว่าบรรทัด gitignore อื่นทั้งหมดอยู่ด้านล่าง Git จะอ่านจาก. gitignore จากด้านบนดังนั้นแม้ว่าฉันจะมี 'test.go' ใน gitignore ของฉันมันเป็นครั้งแรกในไฟล์และกลายเป็น 'unignored' หลังจาก

!*.*

0

ฉันลองคำสั่งส่วนใหญ่ข้างต้นใน VS Code terminal และฉันพบข้อผิดพลาดเช่น:

fatal: pathspec '[dir]/[file]' did not match any files

ฉันเปิดโครงการบน GitHub Desktop และไม่สนใจจากที่นั่นและใช้งานได้

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