ฉันกังวลว่าอาจลืมคุณสมบัติที่ดีนี้ในครั้งต่อไปที่ฉันต้องการ
Git 2.13 (Q2 2017) อธิบายว่าเหตุใดจึงไม่มีการ "ป้องกัน" ตัวเลือกการพุชนี้เนื่องจากแม้ว่าคุณจะไม่ลืมในgit pushระดับนั้น แต่ก็ยังอาจถูกเพิกเฉย
ดูกระทำ f17d642 (19 เมษายน 2017) โดยÆvar Arnfjord Bjarmason (avar )
(รวมโดยJunio C Hamano - gitster-ในการกระทำ 46bdfa3 , 26 เมษายน 2017)
push: เอกสารและทดสอบ--force-with-leaseด้วยรีโมทหลายตัว
เอกสารและการทดสอบสำหรับกรณีที่มีรีโมตสองตัวที่ชี้ไปยัง URL เดียวกันและการดึงข้อมูลพื้นหลังและภายหลังgit push --force-with-leaseไม่ควร clobber การอ้างอิงที่ไม่อัปเดตที่เราไม่ได้ดึงมา
ตัวแก้ไขบางตัวเช่น VSC ของ Microsoft มีคุณสมบัติในการดึงข้อมูลอัตโนมัติในพื้นหลังซึ่งจะข้ามการป้องกันที่นำเสนอโดย--force-with-lease&--force-with-lease=<refname>ตามที่ระบุไว้ในเอกสารประกอบที่เพิ่มไว้ที่นี่
ดังนั้นเอกสารในgit pushตอนนี้จึงประกอบด้วย:
หมายเหตุทั่วไปเกี่ยวกับความปลอดภัย: การจัดหาอ็อพชันนี้โดยไม่มีค่าที่คาดหวังเช่นเป็น--force-with-leaseหรือ--force-with-lease=<refname>
โต้ตอบกับสิ่งใด ๆ ที่ทำงานโดยปริยายgit fetchบนรีโมตเพื่อผลักไปที่พื้นหลังเช่นgit fetch origin
บนที่เก็บของคุณใน cronjob
การป้องกันที่มอบ--forceให้คือการตรวจสอบให้แน่ใจว่าการเปลี่ยนแปลงในภายหลังงานของคุณไม่ได้ขึ้นอยู่กับการไม่ยึดติด แต่สิ่งนี้จะพ่ายแพ้เล็กน้อยหากกระบวนการเบื้องหลังบางอย่างกำลังอัปเดตการอ้างอิงในพื้นหลัง เราไม่มีอะไรเลยนอกจากข้อมูลการติดตามระยะไกลที่จะนำไปใช้เพื่อเป็นข้อมูลอ้างอิงสำหรับการอ้างอิงที่คุณคาดว่าจะได้เห็นและยินดีที่จะปิดบัง
หากตัวแก้ไขของคุณหรือระบบอื่น ๆ กำลังทำงานgit fetchอยู่เบื้องหลังสำหรับคุณวิธีลดปัญหานี้คือเพียงแค่ตั้งค่ารีโมตอื่น:
git remote add origin-push $(git config remote.origin.url)
git fetch origin-push
ตอนนี้เมื่อกระบวนการพื้นหลังเรียกgit fetch originใช้การอ้างอิงorigin-pushจะไม่ได้รับการอัปเดตดังนั้นคำสั่งเช่น:
git push --force-with-lease origin-push
git fetch origin-pushจะล้มเหลวจนกว่าคุณจะทำงานด้วยตนเอง
แน่นอนว่าวิธีนี้พ่ายแพ้อย่างสิ้นเชิงกับสิ่งที่ทำงานgit fetch
--allในกรณีนี้คุณต้องปิดการใช้งานหรือทำสิ่งที่น่าเบื่อเช่น:
git fetch # update 'master' from remote
git tag base master # mark our base point
git rebase -i master # rewrite some commits
git push --force-with-lease=master:base master:master
เช่นสร้างbaseแท็กสำหรับเวอร์ชันของโค้ดอัปสตรีมที่คุณเคยเห็นและยินดีที่จะเขียนทับจากนั้นจึงเขียนประวัติใหม่และสุดท้ายบังคับให้พุชเปลี่ยนแปลงmasterหากเวอร์ชันรีโมตยังอยู่ที่baseไม่ว่าในเครื่องของคุณremotes/origin/masterจะอัปเดตเป็นอะไรใน พื้นหลัง.
rmการrm -iใน .bashrc ของคุณ คุณจะลืมและลบไฟล์สำคัญบนเซิร์ฟเวอร์ในบางวัน ใช้นามแฝงของคุณเองไม่มีปัญหา :)