ละเว้นไฟล์ที่แก้ไขแล้ว (แต่ไม่ได้คอมมิชชัน) ใน git หรือ


182

ฉันสามารถบอกให้คอมไพล์ละเว้นไฟล์ที่ถูกแก้ไข (ถูกลบ) แต่ไม่ควรคอมมิท?

สถานการณ์คือฉันมีไดเรกทอรีย่อยใน repo ซึ่งมีเนื้อหาที่ฉันไม่สนใจเลยดังนั้นฉันจึงลบมันเพื่อป้องกันไม่ให้มันปรากฏขึ้นในการเติมเต็มอัตโนมัติและสิ่งที่ชอบ (ใน IDE)

แต่ตอนนี้ถ้าฉันเพิ่มโฟลเดอร์นั้นลงใน. gitignore ไม่มีอะไรเปลี่ยนแปลงเลยทุกสิ่งที่แสดงนั้นถูกลบโดยสถานะ git

มีวิธีทำให้คอมไพล์ละเว้นมันด้วยวิธีใด?

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


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

คำตอบ:


274

ตรวจสอบหน้า man git-update-indexและบิต - เปลี่ยนแปลงที่ไม่เปลี่ยนแปลงและที่เกี่ยวข้อง

เมื่อฉันมีปัญหาของคุณฉันทำเช่นนี้

git update-index --assume-unchanged dir-im-removing/

หรือไฟล์เฉพาะ

git update-index --assume-unchanged config/database.yml

3
คุณสามารถแสดงรายการไฟล์ที่ถูกละเว้นทั้งหมดของคุณได้หรือไม่?
Zitrax

21
คุณสามารถรับไฟล์กลับได้git update-index --no-assume-unchanged config/database.yml
Denis Kniazhev

1
ดูคำตอบที่เดฟ L's --assume-unchangedด้านล่างสำหรับการแก้ปัญหาใหม่โดยไม่ต้องบางส่วนของข้อบกพร่องของ
Ben Challenor

2
เป็นไปได้หรือไม่ที่จะเพิ่มสิ่งนี้ลงในไฟล์ config ของที่เก็บแทนที่จะใช้คำสั่งนี้ด้วยตนเองทุกครั้ง?
ทิมโบแลนด์

1
มันจะปรากฏตามที่ได้รับการแก้ไขสำหรับการส่งครั้งต่อไปหรือไม่? ฉันไม่ต้องการให้มันถูกสมมุติตลอดไป
Pranav Nandan

41

ตัวเลือกที่ใหม่และดีกว่าคือตัวเลือก git update-index --skip-worktreeใดจะไม่สูญหายในการรีเซ็ตแบบฮาร์ดหรือการเปลี่ยนแปลงใหม่จากการดึง

ดูหน้าคนที่http://schacon.github.com/git/git-update-index.html

และการเปรียบเทียบที่http://fallengamer.livejournal.com/93321.html


9
ข้อเสียอย่างหนึ่งที่ควรทราบคือเมื่อการแก้ไขไฟล์ถูกซ่อนไว้skip-worktreeการค้นหาไฟล์เหล่านี้ค่อนข้างยุ่งยาก git ls-files -v |grep -v '^H'วิธีเดียวที่ฉันรู้คือ นอกจากนี้เครื่องมือ GUI จำนวนมากไม่ทราบเกี่ยวกับคุณลักษณะนี้และอาจทำให้เกิดข้อผิดพลาดตลก ๆ เช่นหากไฟล์checkoutล้มเหลวเนื่องจากไฟล์ที่ถูกแก้ไข "ซ่อน"
sleske

ฉันไม่เคยเข้าใจไฟล์ git doc ใด ๆ เลย ดังนั้นนี่ไม่ใช่ความช่วยเหลือ (ไฟล์ doc แต่ละอนุมานว่าคุณเข้าใจรายละเอียดปลีกย่อยของไฟล์ doc ทุกอื่น ๆ !)
สกอตต์บิ๊กส์

7

ใช้รหัสนี้

git update-index --assume-unchanged file-name

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

6

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


1
อืมฉันลองแล้ว แต่ฉันมีไฟล์ทั้งหมดที่แสดงว่าถูกลบ ฉันควรจะยอมรับสิ่งนั้นแล้วและ - แคชจะทำให้ไม่สามารถถูกส่งไปยังรีโมตได้? หรือว่าฉันจะได้รับฏ ไม่ถูกต้อง? สำคัญที่สุดสำหรับฉันคือไม่ทำลาย repo ระยะไกล (svn)

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

อ่าฉันคิดว่าฉันเข้าใจแล้ว - เก็บไว้ตอนนี้ .. มันแค่ลบสิ่งต่าง ๆ ออกจากดัชนีและปล่อยให้ต้นไม้ทำงานคนเดียว .. ฉันไม่แน่ใจว่าฉันหายไปบางอย่างหรือไม่ แต่ AFAIS ฉันกำลังมองหาสิ่งที่ตรงกันข้าม เอามันออกจากแผนผังการทำงานโดยไม่ต้องแตะดัชนี .. หรือฉันจะใช้มันเพื่ออะไรล่ะ?

6

สิ่งที่ฉันมักจะทำคือ

คอมไพล์สะสม

คอมไพล์สิ่งอื่นใด

git stash นำไปใช้

คอมไพล์สะสมชัดเจน


10
fwiw คุณยังสามารถ 'git stash pop' เพื่อทำสองครั้งสุดท้ายพร้อมกัน (แม้ว่า 'git stash clear' จะล้างรายการที่เก็บทั้งหมดถ้าคุณต้องการ)
Groxx
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.