ฉันไม่คิดว่าการคอมมิทสามารถบันทึกเจตนาเช่น“ หยุดติดตามไฟล์นี้ แต่อย่าลบมัน”
การประกาศเจตนาดังกล่าวจำเป็นต้องมีการแทรกแซงนอก Git ในที่เก็บใด ๆ ที่ผสาน (หรือ rebase สู่) การกระทำที่ลบไฟล์
บันทึกสำเนา, ใช้การลบ, กู้คืน
อาจเป็นวิธีที่ง่ายที่สุดที่จะทำคือบอกผู้ใช้ดาวน์สตรีมของคุณให้บันทึกสำเนาของไฟล์ดึงการลบของคุณแล้วกู้คืนไฟล์ หากพวกเขากำลังดึงผ่าน rebase และกำลัง 'ดำเนินการ' แก้ไขไฟล์พวกเขาจะได้รับความขัดแย้ง ในการแก้ไขข้อขัดแย้งดังกล่าวให้ใช้git rm foo.conf && git rebase --continue
(หากการกระทำที่ขัดแย้งกันมีการเปลี่ยนแปลงนอกเหนือจากไฟล์ที่ถูกลบ) หรือgit rebase --skip
(หากการกระทำที่ขัดแย้งกันนั้นเปลี่ยนไปเป็นไฟล์ที่ถูกลบเท่านั้น)
เรียกคืนไฟล์เป็นไม่ได้ติดตามหลังจากดึงคำสั่งที่ลบออกแล้ว
หากพวกเขาดึงการลบของคุณไปแล้วพวกเขายังสามารถกู้คืนเวอร์ชันก่อนหน้าของไฟล์ด้วยgit show :
git show @{1}:foo.conf >foo.conf
หรือด้วยการชำระเงิน git (ต่อความคิดเห็นโดย William Pursell; แต่อย่าลืมลบออกจากดัชนีอีกครั้ง!):
git checkout @{1} -- foo.conf && git rm --cached foo.conf
ถ้าพวกเขาได้กระทำการอื่น ๆ ตั้งแต่การดึงการลบของคุณ (หรือพวกเขาจะดึงกับ rebase เป็นหัวเดี่ยว) @{1}
พวกเขาอาจต้องสิ่งอื่นที่ไม่ใช่ พวกเขาสามารถใช้git log -g
เพื่อค้นหาการกระทำก่อนที่จะลบการลบของคุณ
ในความคิดเห็นคุณพูดถึงว่าไฟล์ที่คุณต้องการ“ ยกเลิกการติดตาม แต่เก็บไว้” เป็นไฟล์การกำหนดค่าบางชนิดที่จำเป็นสำหรับการเรียกใช้ซอฟต์แวร์ (โดยตรงจากที่เก็บ)
เก็บไฟล์เป็น 'เริ่มต้น' และเปิดใช้งานด้วยตนเอง / โดยอัตโนมัติ
หากไม่ยอมรับอย่างสมบูรณ์เพื่อรักษาเนื้อหาของไฟล์การกำหนดค่าในที่เก็บคุณอาจสามารถเปลี่ยนชื่อไฟล์ที่ถูกติดตามจาก (เช่น) foo.conf
ไปยังfoo.conf.default
จากนั้นสั่งให้ผู้ใช้ของคุณcp foo.conf.default foo.conf
หลังจากใช้การเปลี่ยนชื่อกระทำ หรือถ้าผู้ใช้ใช้พื้นที่เก็บข้อมูลที่มีอยู่แล้วบางส่วน (เช่นสคริปต์หรือโปรแกรมอื่นที่กำหนดค่าโดยเนื้อหาในพื้นที่เก็บข้อมูล (เช่นMakefile
หรือคล้ายกัน)) เพื่อเรียกใช้ / ปรับใช้ซอฟต์แวร์ของคุณคุณสามารถรวมกลไกการเริ่มต้นลงใน ปรับใช้กระบวนการ:
test -f foo.conf || test -f foo.conf.default &&
cp foo.conf.default foo.conf
ด้วยกลไกการตั้งค่าเริ่มต้นดังกล่าวผู้ใช้ควรจะสามารถดึงการกระทำที่เปลี่ยนชื่อfoo.conf
เป็นfoo.conf.default
โดยไม่ต้องทำงานพิเศษใด ๆ นอกจากนี้คุณหลีกเลี่ยงการคัดลอกไฟล์กำหนดค่าด้วยตนเองหากคุณทำการติดตั้ง / ที่เก็บเพิ่มเติมในอนาคต
ประวัติการเขียนซ้ำต้องมีการแทรกแซงด้วยตนเองอย่างไรก็ตาม ...
git filter-branch --index-filter …
ถ้ามันเป็นที่ยอมรับไม่ได้ที่จะรักษาเนื้อหาในพื้นที่เก็บข้อมูลแล้วคุณอาจจะต้องการที่จะสมบูรณ์กำจัดมันจากประวัติศาสตร์กับสิ่งที่ต้องการ จำนวนเงินนี้สำหรับการเขียนประวัติใหม่ซึ่งจะต้องมีการแทรกแซงด้วยตนเองสำหรับแต่ละสาขา / พื้นที่เก็บข้อมูล (ดูที่หัวข้อ“ การกู้คืนจากการอัปสตรีมรีบูต” ในgit rebase manpage ) การดูแลเป็นพิเศษที่จำเป็นสำหรับไฟล์กำหนดค่าของคุณจะเป็นเพียงขั้นตอนอื่นที่ต้องดำเนินการในขณะที่กู้คืนจากการเขียนใหม่:
- บันทึกสำเนาของไฟล์กำหนดค่า
- กู้คืนจากการเขียนใหม่
- กู้คืนไฟล์กำหนดค่า
ไม่ต้องสนใจเพื่อป้องกันการเกิดซ้ำ
ไม่ว่าคุณจะใช้วิธีใดคุณอาจต้องการรวมชื่อไฟล์การกำหนดค่าไว้ใน.gitignore
ไฟล์ในที่เก็บเพื่อให้ไม่มีใครสามารถทำได้git add foo.conf
อีกครั้งโดยไม่ตั้งใจ(เป็นไปได้ แต่จำเป็นต้องมี-f
/ --force
) หากคุณมีมากกว่าหนึ่งไฟล์การกำหนดค่าคุณอาจพิจารณา 'ย้าย' พวกเขาทั้งหมดลงในไดเรกทอรีเดียวและละเว้นสิ่งทั้งหมด (โดย 'ย้าย' ฉันหมายถึงการเปลี่ยนแปลงที่โปรแกรมคาดว่าจะหาไฟล์การกำหนดค่าของมันและรับผู้ใช้ (หรือ กลไกการเรียกใช้ / ปรับใช้) เพื่อคัดลอก / ย้ายไฟล์ไปยังตำแหน่งใหม่ของพวกเขาแน่นอนคุณไม่ต้องการที่จะคอมไพล์ mvไฟล์ลงในไดเรกทอรีที่คุณจะไม่สนใจ)