ใช้ gitignore เพื่อละเว้น (แต่ไม่ลบ) ไฟล์


98

ฉันมีไดเร็กทอรี tmp ใน git repo ของฉันฉันต้องการยังคงมีอยู่ แต่ถูกเพิกเฉย ฉันเพิ่มมันเข้าไป.gitignoreแต่git statusยังคงบอกฉันเกี่ยวกับการเปลี่ยนแปลงไฟล์ในไดเร็กทอรีนั้น ฉันลองgit rm -r --cachedแล้ว แต่จะลบมันออกจาก repo ระยะไกล ฉันจะหยุดติดตามการเปลี่ยนแปลงในไดเรกทอรีนี้ได้อย่างไร แต่ยังคงอนุญาตให้มีอยู่ ฉันต้องทำสิ่งนี้สำหรับไฟล์ 1 ไฟล์ แต่การเปลี่ยนแปลงจะปรากฏขึ้นgit statusหลังจากเข้า.gitignoreมาแล้ว ฉันควรทำอย่างไรดี?


1
โปรดเขียนว่าไฟล์. gitignore ของคุณมีลักษณะอย่างไร?
kdehairy

คำตอบ:


184

แต่.gitignoreคุณสามารถอัปเดตที่เก็บ git ภายในได้โดยเรียกใช้คำสั่งต่อไปนี้:

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

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


22
ความรักของฉันอาจเพิ่มขึ้นเป็นสองเท่า
Mark Fox

2
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ ขอบคุณสำหรับการเชื่อมโยงไปที่
Gowiem

4
มีวิธีส่งสิ่งนี้ไปยัง repo ระยะไกลหรือไม่?
Brian Ortiz

2
อืมฉันอยากจะทำเครื่องหมายไฟล์ว่า "ไม่ใช่ไฟล์ git อย่าซิงค์กับคอมไพล์แม้ใน repo อื่น ๆ
ก็ตาม

11
คุณสามารถเปลี่ยนกลับได้ด้วยgit update-index --no-assume-unchanged <file>. หากคุณต้องการแสดงรายการเหล่าgit ls-files -v | grep '^h'นั้น
Sanghyun Lee

12

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

แต่ปัญหาของคุณคือ git กำลังติดตามไฟล์ที่คุณต้องการละเว้นและ.gitignoreไม่ได้ใช้กับไฟล์ที่ติดตาม วิธีเดียวที่จะหยุดการติดตามนี้คือบอกให้คอมไพล์ลบออก เมื่อใช้git rm --cachedคุณจะป้องกันไม่ให้คอมไพล์ลบไฟล์ในเครื่องของคุณ แต่ที่เก็บอื่น ๆ ที่ได้รับการเปลี่ยนแปลงของคุณจะใช้การลบ ฉันไม่คิดว่าจะมีวิธีหลีกเลี่ยงจากที่เก็บของคุณเอง คุณต้องทำบางอย่างในที่เก็บอื่นมิฉะนั้นไฟล์จะถูกลบออก

ในการป้องกันการลบแต่ละที่เก็บคุณสามารถ:

  • (ชัดเจน) สำรองไฟล์ไว้ที่ไหนสักแห่งดึงการเปลี่ยนแปลงและกู้คืนไฟล์
  • หรือgit rm --cachedไฟล์และกระทำก่อนที่จะดึงการเปลี่ยนแปลงของคุณ Git จะผสานการลบทั้งสองเข้าด้วยกันโดยไม่ต้องแตะไฟล์ที่ไม่ได้ติดตามอยู่แล้ว

6
ไม่จำเป็นต้องเป็นจริง ("หยุดติดตาม = ลบไฟล์") คุณยังสามารถมีไฟล์ติดตามใน repo และไม่เห็นการเปลี่ยนแปลงใด ๆ git update-index --assume-unchanged <file>ที่ทำโดยใช้: ดูได้ที่: blog.pagebakers.nl/2009/01/29/…
ducin

สิ่งนี้ช่วยแก้ปัญหาของฉันได้เพราะฉันต้องการลบไฟล์จากgit rm --cached <filename> -r พุชrepositorie ใน git ดังนั้นและหลังจากนี้การผลักดันเปลี่ยนเป็น repositorie อีกครั้งเพื่อให้ไฟล์ถูกลบ
Vinicius Cardoso

7

ใส่/ท้ายชื่อไดเร็กทอรีใน.gitignoreไฟล์ของคุณเช่น

tmp/

หากมีการติดตามไฟล์ภายในไดเร็กทอรีนั้นคุณต้องบอกให้ git ลืมเกี่ยวกับไฟล์เหล่านี้ก่อน (ก่อนที่คุณจะเพิ่ม dir ในรายการละเว้น) สมมติว่าคุณไม่มีอะไรสำคัญอยู่ในนั้น (กล่าวคือคุณสามารถเกาได้):

git rm -rf ./tmp/
git commit -m "untrack tmp dir"
mkdir tmp
echo tmp/ >> .gitignore
git add .gitignore ; git commit -m "add tmp/ to ignore list"

ไฟล์ใหม่ในไดเร็กทอรีนั้นจะไม่ถูกติดตาม

--cachedตัวเลือกที่จะgit rmทำงานเฉพาะในดัชนี (รอการเปลี่ยนแปลงมากขึ้นหรือน้อยกว่า) ไม่มีผลกระทบต่อผังการทำงานหรือสถานะของสิ่งที่ติดตามหรือไม่


ฉันมีสิ่งนั้น ทั้งthe/dir/และthe/dir/*
21312312

สวัสดีจ้าถ้าฉันมีบางอย่างเช่น / สื่อในโฟลเดอร์ต่างๆที่ฉันต้องการละเว้นเป็นไปได้ไหม กดไลค์ / 1 / Media, / 2 / Media, จนถึงไลค์ 99?
Nic

3

.gitignore ไม่มีผลกับไฟล์ที่ติดตาม

สิ่งที่คุณต้องการคือการตั้งค่าบิตที่ไม่เปลี่ยนแปลงบนไฟล์ในไดเร็กทอรี tmp / มีคำอธิบายที่ดีในการดำเนินการที่นี่: Git: ยกเลิกการติดตามไฟล์ใน repo ในเครื่องเท่านั้นและเก็บไว้ใน repo ระยะไกล

นอกจากนี้หนึ่งสมุทรสำหรับการตั้งค่าสมมติ-เปลี่ยนแปลงในไฟล์ทั้งหมดในไดเรกทอรี - คอมไพล์ปรับปรุงดัชนี --assume-เปลี่ยนแปลงในไดเรกทอรี


1

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

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

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

cp index.php index_template.php
git rm --cached index.php

ตอนนี้แก้ไข index_template.php ให้เป็นไปตามที่คุณต้องการให้ปรากฏบน repo ระยะไกล เพิ่มบางอย่างใน README ของคุณเพื่อบอกคนที่ใช้ที่เก็บของคุณว่าเมื่อพวกเขาโคลนแล้วพวกเขาจะต้องคัดลอก index_template.php ไปที่ index.php และแก้ไขให้เหมาะสม

git add index_template.php
git add README
git commit -m 'added template index.php file'
git push

เมื่อมีคนโคลน repo index.phpของคุณพวกเขาจะต้องสร้างของตัวเอง คุณได้ทำให้มันง่ายสำหรับพวกเขาเพียงแค่คัดลอกindex_template.phpไปindex.phpและแก้ไขมันด้วยการตั้งค่าเฉพาะของคอมพิวเตอร์

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