หมายเหตุ: fallengamerทำการทดสอบบางอย่างในปี 2011 (ดังนั้นอาจล้าสมัย) และนี่คือข้อค้นพบของเขา:
การดำเนินงาน
- ไฟล์มีการเปลี่ยนแปลงทั้งในที่เก็บในเครื่องและอัป
สตรีม
git pull:
Git รักษาการเปลี่ยนแปลงในเครื่องไว้
ดังนั้นคุณจะไม่สูญเสียข้อมูลใด ๆ ที่คุณทำเครื่องหมายด้วยค่าสถานะใด ๆ โดยไม่ตั้งใจ
- ไฟล์ที่มี
assume-unchangedธง: Git จะไม่เขียนทับไฟล์ในเครื่อง แต่จะส่งผลให้เกิดข้อขัดแย้งและให้คำแนะนำวิธีแก้ไข
- ไฟล์ที่มี
skip-worktreeธง: Git จะไม่เขียนทับไฟล์ในเครื่อง แต่จะส่งผลให้เกิดข้อขัดแย้งและให้คำแนะนำวิธีแก้ไข
- ไฟล์มีการเปลี่ยนแปลงทั้งในที่เก็บในเครื่องและอัปสตรีมพยายามดึงต่อไป
การใช้ผลลัพธ์ในการทำงานพิเศษบางอย่าง แต่อย่างน้อยคุณจะไม่สูญเสียข้อมูลใด ๆ หากคุณมีการเปลี่ยนแปลงในเครื่อง
git stash
git pull
skip-worktree
- ไฟล์ที่มีการ
assume-unchangedตั้งค่าสถานะ: ยกเลิกการเปลี่ยนแปลงในเครื่องทั้งหมดโดยไม่สามารถเรียกคืนได้ ผลที่ได้คือ ' git reset --hard' การgit pullโทรจะสำเร็จ
- ไฟล์ที่มี
skip-worktreeธง: Stash จะไม่ทำงานกับskip-worktreeไฟล์ ' git pull' จะล้มเหลวโดยมีข้อผิดพลาดเหมือนด้านบน นักพัฒนาถูกบังคับให้ตั้งค่าskip-worktreeสถานะใหม่ด้วยตนเองเพื่อให้สามารถสะสมและทำตามความล้มเหลวpullได้
- ไม่มีการเปลี่ยนแปลงในเครื่องอัปโหลดไฟล์อัปสตรีม
ทั้งสองแฟล็กจะไม่ป้องกันคุณจากการเปลี่ยนแปลงอัปสตรีม Git ตรวจพบว่าคุณผิดสัญญาและเลือกที่จะสะท้อนความเป็นจริงโดยการตั้งค่าสถานะใหม่
git pull
assume-unchanged
- ไฟล์ที่มีการ
assume-unchangedตั้งค่าสถานะ: เนื้อหาถูกอัปเดตหายไป
' git ls-files -v' จะแสดงว่ามีการปรับเปลี่ยนสถานะเป็นH(จากh)
- ไฟล์ที่มีการ
skip-worktreeตั้งค่าสถานะ: เนื้อหาได้รับการปรับปรุงการตั้งค่าสถานะจะถูกเก็บไว้
' git ls-files -v' จะแสดงเดียวกันธงเป็นก่อนSpull
- ด้วยการเปลี่ยนแปลงไฟล์ในท้องถิ่น
Git ไม่ได้สัมผัสไฟล์และสะท้อนความเป็นจริง (ไฟล์ที่สัญญาว่าจะไม่เปลี่ยนแปลงจริง ๆ แล้วเปลี่ยน) สำหรับไฟล์
git reset --hard
skip-worktreeassume-unchanged
- ไฟล์ที่มีการ
assume-unchangedตั้งค่าสถานะ: เนื้อหาไฟล์ถูกเปลี่ยนกลับ ตั้งค่าสถานะเป็นH(จากh)
- ไฟล์ที่มีการ
skip-worktreeตั้งค่าสถานะ: เนื้อหาไฟล์ยังคงอยู่ ธงยังคงเหมือนเดิม
เขาเพิ่มการวิเคราะห์ต่อไปนี้:
ดูเหมือนว่าskip-worktreeจะพยายามอย่างหนักเพื่อรักษาข้อมูลท้องถิ่นของคุณ แต่ก็ไม่ได้ป้องกันไม่ให้คุณทำการเปลี่ยนแปลงต้นน้ำหากปลอดภัย pullพลัสคอมไพล์ไม่รีเซ็ตธงบน
แต่การเพิกเฉยreset --hardคำสั่ง '' อาจกลายเป็นเรื่องน่าประหลาดใจสำหรับนักพัฒนา
Assume-unchangedการตั้งค่าสถานะอาจสูญหายในการpullดำเนินการและการเปลี่ยนแปลงภายในไฟล์ดังกล่าวดูเหมือนจะไม่สำคัญต่อคอมไพล์
ดู:
เขาสรุป:
อันที่จริงค่าของธงจะง่ายพอ
assume-unchangedสมมติว่านักพัฒนาไม่ควรเปลี่ยนไฟล์ หากไฟล์มีการเปลี่ยนแปลง - แล้วการเปลี่ยนแปลงนั้นไม่สำคัญ การตั้งค่าสถานะนี้มีไว้สำหรับปรับปรุงประสิทธิภาพสำหรับโฟลเดอร์ที่ไม่เปลี่ยนแปลงเช่น SDK
แต่ถ้าสัญญาแตกและไฟล์ถูกเปลี่ยนจริง git จะเปลี่ยนสถานะเพื่อสะท้อนความเป็นจริง อาจเป็นเรื่องปกติที่จะมีการตั้งค่าสถานะที่ไม่สอดคล้องกันบางอย่างในโฟลเดอร์ที่ไม่ได้ตั้งใจจะเปลี่ยน
ในทางกลับกันskip-worktreeมีประโยชน์เมื่อคุณสั่งให้คอมไพล์ไม่แตะไฟล์ใดไฟล์หนึ่งเลยทีเดียว มีประโยชน์สำหรับไฟล์กำหนดค่าที่ถูกติดตามอยู่แล้ว
ที่เก็บหลักต้นน้ำโฮสต์การกำหนดค่าที่พร้อมใช้งานบางส่วน แต่คุณต้องการเปลี่ยนการตั้งค่าบางอย่างในการกำหนดค่าเพื่อให้สามารถทำการทดสอบในท้องถิ่นได้ และคุณไม่ต้องการตรวจสอบการเปลี่ยนแปลงในไฟล์ดังกล่าวโดยไม่ตั้งใจเพื่อส่งผลกระทบต่อการกำหนดค่าการผลิต ในกรณีนั้นskip-worktreeทำให้ฉากสมบูรณ์แบบ
ด้วย Git 2.25.1 (ก.พ. 2020) "จริง ๆ แล้วทั้งธงไม่ง่ายพอ" ดังกล่าวข้างต้นมีการชี้แจงเพิ่มเติม:
ดูคอมมิชชัน 7a2dc95 , ยอมรับ 1b13e90 (22 ม.ค. 2020) โดยbrian m คาร์ลสัน (bk2204 )
(ผสานโดยJunio C Hamano - gitster- in 53a8329 , 30 Jan 2020)
( รายชื่อผู้รับจดหมาย Git )
doc: ห้ามผู้ใช้พยายามละเว้นไฟล์ที่ถูกติดตาม
ลงชื่อออกโดย: Jeff King
ลงชื่อออกโดย: brian m คาร์ลสัน
เป็นเรื่องปกติที่ผู้ใช้จะต้องการเพิกเฉยต่อการเปลี่ยนแปลงของไฟล์ที่ Git ติดตาม
สถานการณ์ทั่วไปสำหรับกรณีนี้คือการตั้งค่า IDE และไฟล์กำหนดค่าซึ่งโดยทั่วไปไม่ควรถูกติดตามและอาจสร้างจากไฟล์ที่ถูกติดตามโดยใช้กลไกการสร้างเทมเพลต
อย่างไรก็ตามผู้ใช้เรียนรู้เกี่ยวกับบิตที่ไม่เปลี่ยนแปลงและข้ามบิต worktree และพยายามที่จะใช้พวกเขาในการทำเช่นนี้ต่อไป
นี่เป็นปัญหาเนื่องจากเมื่อมีการตั้งค่าบิตเหล่านี้การดำเนินการจำนวนมากจะทำงานตามที่ผู้ใช้คาดหวัง แต่โดยทั่วไปจะไม่ช่วยเมื่อgit checkoutจำเป็นต้องแทนที่ไฟล์
ในกรณีนี้ไม่มีพฤติกรรมที่เหมาะสมเนื่องจากบางครั้งข้อมูลมีค่าเช่นไฟล์กำหนดค่าบางอย่างและบางครั้งเป็นข้อมูลที่ไม่เกี่ยวข้องที่ผู้ใช้ยินดีที่จะทิ้ง
เนื่องจากนี่ไม่ใช่การกำหนดค่าที่ได้รับการสนับสนุนและผู้ใช้มีแนวโน้มที่จะใช้คุณลักษณะที่มีอยู่เพื่อวัตถุประสงค์ที่ไม่ได้ตั้งใจทำให้เกิดความโศกเศร้าและความสับสนโดยทั่วไปให้บันทึกพฤติกรรมที่มีอยู่และข้อผิดพลาดในเอกสารเพื่อgit update-indexให้ผู้ใช้ทราบว่า
นอกจากนี้เราขอเสนอวิธีแก้ปัญหาที่แนะนำเพื่อจัดการกับกรณีทั่วไปของไฟล์การกำหนดค่าเนื่องจากมีวิธีการที่รู้จักกันดีที่ใช้ในสภาพแวดล้อมที่ประสบความสำเร็จมากมาย
git update-indexหน้าคนในขณะนี้รวมถึง:
ผู้ใช้มักจะพยายามใช้assume-unchangedและskip-worktreeบิตเพื่อบอก Git ให้ละเว้นการเปลี่ยนแปลงไฟล์ที่ถูกติดตาม สิ่งนี้ไม่ทำงานตามที่คาดไว้เนื่องจาก Git อาจยังตรวจสอบไฟล์แผนผังการทำงานกับดัชนีเมื่อดำเนินการบางอย่าง โดยทั่วไป Git ไม่ได้ให้วิธีในการละเว้นการเปลี่ยนแปลงในไฟล์ที่ถูกติดตามดังนั้นจึงแนะนำให้ใช้วิธีอื่น
ตัวอย่างเช่นหากไฟล์ที่คุณต้องการเปลี่ยนเป็นไฟล์การจัดเรียงบางส่วนที่เก็บสามารถรวมไฟล์กำหนดค่าตัวอย่างที่สามารถคัดลอกไปยังชื่อที่ถูกเพิกเฉยและแก้ไขได้ ที่เก็บยังสามารถรวมสคริปต์เพื่อจัดการไฟล์ตัวอย่างเป็นเทมเพลตแก้ไขและคัดลอกโดยอัตโนมัติ
ที่ส่วนสุดท้ายคือสิ่งที่ผมอธิบายทั่วไปควบคุมตัวกรองเนื้อหาตามรอยเปื้อนสคริปต์ / ทำความสะอาด
.gitignoreเพื่อวัตถุประสงค์ที่คล้ายกัน โซลูชันนี้ใช้งานได้สำหรับคุณหรือไม่