รีโมตถูกปฏิเสธ (ไม่อนุญาตให้อัปเดตตื้น) หลังจากเปลี่ยน URL ระยะไกล Git


164

ฉันมีโครงการภายใต้การควบคุมเวอร์ชัน Git ที่ฉันทำงานทั้งบนเซิร์ฟเวอร์และในคอมพิวเตอร์ของฉัน ตอนแรกฉันมีที่มาระยะไกลตั้งเป็นคอมพิวเตอร์ในท้องถิ่นของฉัน แต่ตอนนี้ฉันอยากจะเปลี่ยนเป็น BitBucket

บนเซิร์ฟเวอร์ฉันใช้คำสั่ง

git remote set-url origin bitbucket_address

แต่ตอนนี้เมื่อฉันพยายามที่จะผลักดันโครงการของฉันฉันได้รับข้อผิดพลาด

 ! [remote rejected] master -> master (shallow update not allowed)

อะไรเป็นสาเหตุของปัญหานี้และฉันจะแก้ไขได้อย่างไร


3
คุณเลียนแบบรุ่นในเครื่องของคุณได้อย่างไร git clone --depth?
Sascha Wolf

เมื่อไม่นานมานี้และฉันจำไม่ได้ มีวิธีหาไหม?
rwolst

2
ควรมีไฟล์ชื่อshallowใน.gitโฟลเดอร์ของคุณ
Sascha Wolf

ใช่ฉันเห็นshallowไฟล์
rwolst

ดูstackoverflow.com/a/50996201สำหรับการแก้ปัญหาที่เพิ่งทิ้ง (หรือเขียนใหม่) ประวัติที่หายไป
caw

คำตอบ:


329

ดูเหมือนว่าคุณคุ้นเคยgit clone --depth <number>กับการลอกข้อมูลเวอร์ชันในเครื่องของคุณ ผลนี้ในโคลนตื้น ข้อ จำกัด อย่างหนึ่งของการโคลนคือคุณไม่สามารถดันมันจากที่เก็บใหม่ได้

ตอนนี้คุณมีสองทางเลือก:

  1. หากคุณไม่สนใจว่าคุณเป็นคนปัจจุบันหรือหายตัวไปลองดูคำถามนี้
  2. หากคุณต้องการเก็บประวัติเต็มของคุณจากนั้นอ่านต่อ:

ดังนั้นคุณต้องการเก็บประวัติของคุณใช่มั้ย หมายความว่าคุณจะต้องปลดที่เก็บของออก หากต้องการทำเช่นนั้นคุณจะต้องเพิ่มรีโมทเก่าของคุณอีกครั้ง

git remote add old <path-to-old-remote>

หลังจากนั้นเราจะใช้git fetchดึงข้อมูลประวัติที่เหลือจากรีโมทเก่า (ตามที่แนะนำในคำตอบนี้ )

git fetch --unshallow old

และตอนนี้คุณควรจะสามารถเข้าไปในพื้นที่เก็บข้อมูลระยะไกลใหม่ของคุณ


หมายเหตุ : หลังจากที่ไม่รวมโคลนของคุณคุณสามารถลบรีโมตเก่าออกได้อีกครั้ง


45
เกิดอะไรขึ้นถ้าฉันโคลนโครงการ kick-start และฉันไม่ต้องการ / ต้องการประวัติทั้งหมด? มีวิธีหลีกเลี่ยงหรือไม่
itamar

9
@itamar นี่เป็นตัวอย่างที่ดีสำหรับคำถามใหม่ที่ถูกต้องสมบูรณ์ คุณสามารถเชื่อมโยงไปยังคำถามนี้เพื่อการอ้างอิง
Sascha Wolf

14
ถามเป็นคำถามใหม่stackoverflow.com/questions/29748197/…
itamar

2
โปรดทราบว่าgit fetch --unshallowสามารถใช้ refspec ในการแยกสาขาบางสาขาเท่านั้นแทนที่จะซื้อคืนทั้งหมด ตัวอย่างเช่นgit fetch --unshallow origin refs/heads/mydeepbranch:refs/remotes/origin/mydeepbranch
clacke

5
หากคุณกำลังผลักดันไปยัง repo ที่อยู่เบื้องหลัง repo อะไรก็ตามที่คุณคัดลอกมาไม่ได้สร้าง repo ใหม่ทั้งหมดมันก็เพียงพอแล้วที่การอ้างอิงในท้องถิ่นของคุณจะลึกพอที่จะมีการอ้างอิงระยะไกล ดังนั้นหากคุณorigin/masterเป็น 20 กระทำไปข้างหน้าของคุณoldrepo/masterเมื่อคุณclone --depth 1'เอ็ดมันและคุณได้ทำ 17 กระทำท้องถิ่นตั้งแต่มันเป็นพอสำหรับคุณที่จะทำgit fetch --depth 37 origin refs/heads/master:refs/remotes/origin/master(ขอโทษสำหรับข้อผิดพลาดออกโดยหนึ่ง) และจากนั้นคุณสามารถทำได้git push oldrepo masterโดยไม่เกิดอุบัติเหตุ (อาจต้องการ git 1.9.0 หรือใหม่กว่า)
clacke

28

ในกรณีที่ repo ของคุณอยู่originและ repo ดั้งเดิมคือupstream:

git fetch --unshallow upstream

มันใช้งานได้สำหรับฉันและค่อนข้างง่ายแล้วคำตอบที่ได้คะแนนสูงสุด
Maosheng Wang

11

อีกตัวเลือกหนึ่งถ้าคุณต้องการที่จะให้ repo ที่เป็นอยู่กับใหม่กระทำที่คุณได้เพิ่มตั้งแต่ตื้นเริ่มต้นกระทำคือ: แก้ไขนี้กระทำกับ rebase

  • เริ่มการ rebase เชิงโต้ตอบรวมถึงการกระทำครั้งแรก (รูท)

    git rebase --interactive --root
    
  • เปลี่ยนการpickกระทำเริ่มต้นเป็นeditและบันทึกและปิดไฟล์

    หากคุณทำธุรกรรมซื้อคืนที่มีความลึกมากกว่า 1 คุณอาจต้องทำเช่นเดียวกันสำหรับการกระทำเหล่านั้นทั้งหมด หรือมิฉะนั้นให้เรียกใช้fixupสิ่งเหล่านี้ระหว่างการรีบูตแบบโต้ตอบ

  • แปลงค่าคอมมิทนี้เป็นคอมมิทปกติ, unshallow

    git commit --amend --no-edit
    

    สิ่งนี้จะเปลี่ยนรหัสการมอบหมายและเพิ่มคุณในฐานะผู้เขียนร่วมในการส่งครั้งแรกนี้

  • อย่าลืมทำการรีบูตของคุณให้เสร็จ

    git rebase --continue
    

ขอบคุณ! ทำงานเหมือนมีเสน่ห์เมื่อพื้นที่เก็บข้อมูลดั้งเดิมถูกลบและคุณมีสำเนาที่ตื้นเท่านั้น
Vitalii Dmitriev

9

หากคุณต้องการที่จะผลักดัน repo ใหม่เหมือนเดิมคุณสามารถลอง:

  • ก่อนนำออกold git folderจาก repo ปัจจุบันของคุณsudo rm -rf .git
  • จากนั้นเริ่มต้นคอมไพล์อีกครั้ง git init
  • จากนั้นเพิ่ม repo ระยะไกลใหม่ git remote add your-new-repo
  • จากนั้นกด

ฉันพบว่านี่เป็นวิธีแก้ปัญหาที่ดีกว่าเนื่องจากมันไม่ต้องการการผลักดันให้เก่า บางครั้งสิ่งนี้อาจเกิดขึ้นกับ boilerplates
rnpd

นี้นั้นเป็นคำตอบจากที่คำถามที่เกี่ยวข้องที่คุณสามารถหาที่นี่
Sascha Wolf

@NachPD ฉันไม่แน่ใจว่าคุณหมายถึงอะไรเมื่อคุณพูดว่าโซลูชันอื่นต้องใช้ "การผลักดันสู่ความเก่า" คุณหมายถึงการดึงข้อมูลแทนที่จะเป็นการผลักหรือไม่? เพราะมันไม่จำเป็นต้องกด
Sascha Wolf

0

หากการดึง --unshallow ไม่ทำงาน ต้องมีปัญหากับสาขาของคุณ แก้ไขด้วยคำสั่งต่อไปนี้ก่อนที่จะผลักดันมัน

git filter-branch -- --all

ทำสิ่งนี้กับ - unshallow ไม่ทำงานเนื่องจากมีข้อกังวลด้านความปลอดภัย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.