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


125

ฉันสร้างทางแยก (ขอเรียกว่าmyrepo) ของที่เก็บอื่น (ขอเรียกว่าorirepo) บน GitHub orirepoต่อมาผมโคลน

git clone https://github.com/original/orirepo.git

ฉันแก้ไขไฟล์ประมาณ 20 ไฟล์จากนั้นฉันก็จัดเตรียมการเปลี่ยนแปลงของฉันและทำการคอมมิต

git add
git commit

อย่างไรก็ตามเมื่อฉันพยายามที่จะผลักดัน

git push

ฉันได้รับข้อผิดพลาดนี้:

remote: Permission to original/orirepo.git denied to mylogin.
fatal: unable to access 'https://github.com/original/orirepo.git/': The requested URL returned error: 403

ฉันรู้ว่าฉันทำพลาด: ฉันควรจะโคลนส้อมของฉันมากกว่าorirepoแต่ตอนนี้มันสายเกินไปแล้ว ฉันจะดันไปที่ทางแยกแทนที่จะไปorigin/orirepoที่ซึ่งฉันไม่มีสิทธิ์เขียนได้อย่างไร

คำตอบ:


189

ตามค่าเริ่มต้นเมื่อคุณโคลนที่เก็บ

  • ที่อาศัยอยู่https://github.com/original/orirepo.git,
  • สาขาปัจจุบันซึ่งเรียกว่าmaster,

แล้วก็

  • การกำหนดค่าโลคัลของโคลนผลลัพธ์จะแสดงรายการรีโมตเพียงตัวเดียวที่เรียกว่าoriginซึ่งเชื่อมโยงกับ URL ของที่เก็บที่คุณโคลน
  • ท้องถิ่นmasterสาขาในโคลนของคุณถูกตั้งค่าให้ติดตาม origin/master

ดังนั้นหากคุณไม่แก้ไข config ของโคลน Git จะตีความ

git push

เช่น

git push origin master:origin/master

กล่าวอีกนัยหนึ่งคือgit pushพยายามผลักดันmasterสาขาในพื้นที่ของคุณไปยังmasterสาขาที่อยู่บนที่เก็บระยะไกล (ที่โคลนของคุณรู้จักorigin) อย่างไรก็ตามคุณไม่ได้รับอนุญาตให้ทำเช่นนั้นเนื่องจากคุณไม่มีสิทธิ์เขียนไปยังที่เก็บระยะไกลนั้น

คุณต้อง

  1. กำหนดoriginรีโมทใหม่ให้เชื่อมโยงกับส้อมของคุณโดยการเรียกใช้

    git remote set-url origin https://github.com/RemiB/myrepo.git
    
  2. หรือหากคุณต้องการรักษานิยามดั้งเดิมของoriginรีโมตให้กำหนดรีโมตใหม่ (เรียกว่าmyrepoที่นี่) ที่เชื่อมโยงกับส้อมของคุณ:

    git remote add myrepo https://github.com/RemiB/myrepo.git
    

    จากนั้นคุณควรจะสามารถผลักดันmasterสาขาในพื้นที่ของคุณไปยังทางแยกได้โดยการวิ่ง

    git push myrepo master
    

    และถ้าคุณต้องการบอก Git ว่าgit pushควรกดไปที่myrepoแทนoriginจากนี้ไปคุณควรเรียกใช้

    git push -u myrepo master
    

แทน.


´git push -u´ จะเปลี่ยนพฤติกรรมเริ่มต้นของ´git pull´ ด้วยหรือไม่
benroth

1
ใช่มันจะทำได้ดังนั้นแทนที่จะทำ "push -u" คุณควรใช้ตัวเลือก pushDefault: git config --add remote.origin.pushdefault myrepo และจะมีผลกับการพุชเท่านั้นและใช้กับสาขาใหม่ที่มีอยู่ทั้งหมด
Marius K

1
ทำgit remote set-url origin http://github.com/myname/reponameแล้วgit push origin mybranch. ทำงาน! ขอบคุณ!
พัฒนา Marius Žilėnas

1
ถ้าใช้ add remote จะมีผลต่อการดึงอย่างไร? มันดึงมาจากไหน? จะจัดการการรวมในอนาคตระหว่าง 2 repos อย่างไร?
Kok How Teh

1
@KokHowTeh การเพิ่มรีโมตอื่นจะไม่ส่งผลต่อสาขาระยะไกล (ถ้ามี) ที่แทร็กสาขาในพื้นที่ แต่ทำให้การติดตามการเริ่มต้นต้นแบบท้องถิ่นของคุณgit push -u myrepo master myrepo/masterถ้าหลังจากนั้นคุณจะทำงานgit pullในขณะที่ต้นแบบคุณจะดึงจากและไม่จากmyrepo origin
jub0bs

19

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

สิ่งที่คุณต้องทำคือเปลี่ยน URL ต้นทางในการโคลนในเครื่องของคุณด้วย URL ของ repo ที่แยกออกมาของคุณ

ทำแบบนี้

git remote set-url origin https://github.com/fork/name.git

https://github.com/fork/name.gitURL ของส้อมของคุณอยู่ที่ไหนจาก repo เดิม

หลังจากนั้นเพียง

git push

และคุณจะสามารถผลักดันการเปลี่ยนแปลงของคุณไปยังส้อมของคุณได้ :)


ทำงานได้อย่างมีเสน่ห์ขอบคุณ!
Rafael Ruales

7

โอเคในที่สุดฉันก็แก้ไขไฟล์ปรับแต่ง git ของฉัน:

$ nano .git/config

เปลี่ยน:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = https://github.com/<origin-project>/<origin-repo>.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master

ถึง

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = https://github.com/<mylogin>/<myrepo>.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master

จากนั้น

$ git push

ทำงานอย่างมีเสน่ห์

หรือขอบคุณคำตอบของ Thiago F Macedo :

git remote set-url origin https://yourusername@github.com/user/repo.git

-5

คุณควรโคลน repo ที่แยกออกจากบัญชีของคุณก่อน

git clone https://github.com/your_account/repo.git

คุณมีสิทธิ์ส่งไปที่ repo นี้อย่างแน่นอน หากคุณต้องการพุชโค้ดของคุณไปยัง repo ดั้งเดิมคุณสามารถส่งคำขอดึง


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