หมายเหตุ: 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
' จะแสดงเดียวกันธงเป็นก่อนS
pull
- ด้วยการเปลี่ยนแปลงไฟล์ในท้องถิ่น
Git ไม่ได้สัมผัสไฟล์และสะท้อนความเป็นจริง (ไฟล์ที่สัญญาว่าจะไม่เปลี่ยนแปลงจริง ๆ แล้วเปลี่ยน) สำหรับไฟล์
git reset --hard
skip-worktree
assume-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
เพื่อวัตถุประสงค์ที่คล้ายกัน โซลูชันนี้ใช้งานได้สำหรับคุณหรือไม่