Bagaimana cara mendorong ke fork saya dari tiruan repo asli?

124

Saya membuat garpu (sebut saja myrepo) dari repositori lain (sebut saja orirepo) di GitHub. Nanti, saya kloning orirepo.

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

Saya memodifikasi sekitar 20 file, lalu saya melakukan perubahan dan membuat komit

git add
git commit

Namun, saat saya coba dorong

git push

Saya mendapat kesalahan ini:

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

Saya tahu saya membuat kesalahan: Saya seharusnya mengkloning garpu saya orirepo, tetapi sudah terlambat untuk itu sekarang. Bagaimana cara mendorong ke fork saya, bukan ke origin/orirepo, yang tidak memiliki akses tulis?

Rémi Becheras
sumber

Jawaban:

188

Secara default, saat Anda menggandakan repositori

  • yang berada di https://github.com/original/orirepo.git,
  • yang cabangnya saat ini disebut master,

kemudian

  • konfigurasi lokal dari klon yang dihasilkan hanya mencantumkan satu remote yang dipanggil origin, yang terkait dengan URL repositori yang Anda kloning;
  • mastercabang lokal di klon Anda disetel untuk melacak origin/master .

Oleh karena itu, jika Anda tidak mengubah konfigurasi klon Anda, Git menginterpretasikan

git push

sebagai

git push origin master:origin/master

Dengan kata lain, git pushmencoba untuk mendorong mastercabang lokal Anda ke mastercabang yang berada di repositori jarak jauh (dikenal dengan klon Anda sebagai origin). Namun, Anda tidak diizinkan melakukan itu, karena Anda tidak memiliki akses tulis ke repositori jarak jauh itu.

Kamu butuh

  1. baik mendefinisikan ulang originremote untuk dikaitkan dengan garpu Anda, dengan menjalankan

    git remote set-url origin https://github.com/RemiB/myrepo.git
    
  2. atau, jika Anda ingin mempertahankan definisi asli dari originremote, tentukan remote baru (disebut myrepo, di sini) yang terkait dengan fork Anda:

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

    Kemudian Anda harus dapat mendorong mastercabang lokal Anda ke garpu dengan menjalankan

    git push myrepo master
    

    Dan jika Anda ingin memberi tahu Git bahwa git pushharus mendorong ke myrepodaripada originmulai sekarang, Anda harus menjalankan

    git push -u myrepo master
    

sebagai gantinya.

jub0bs
sumber
akankah ´git push -u´ juga mengubah perilaku default ´git pull´?
benroth
1
Ya itu akan terjadi, jadi daripada melakukan "push -u", Anda harus menggunakan opsi pushDefault: git config --add remote.origin.pushdefault myrepo dan itu hanya akan mempengaruhi dorongan, dan berlaku untuk semua cabang baru yang ada.
Marius K
1
Apakah git remote set-url origin http://github.com/myname/reponamedan kemudian git push origin mybranch. Bekerja! Terima kasih!
Pengembang Marius Žilėnas
1
Jika add remote digunakan, bagaimana pengaruhnya terhadap tarikan? Dari mana itu menarik? Bagaimana cara menangani penggabungan antara 2 repo di masa mendatang?
Kok How Teh
1
@KokHowTeh Menambahkan remote lain tidak mempengaruhi cabang jarak jauh mana (jika ada) trek cabang lokal. Namun, git push -u myrepo masterbuat master lokal Anda mulai melacak myrepo/master. Jika, setelah itu, Anda menjalankan git pullsementara di master, Anda akan menarik dari myrepo, dan tidak lagi dari origin.
jub0bs
18

Jadi, Anda mengkloning repo seseorang yang membuat perubahan dan kemudian menyadari bahwa Anda tidak dapat mendorong ke repo itu, tetapi Anda dapat mendorong ke garpu Anda sendiri. Jadi, Anda melanjutkan dan melakukan fork pada repo asli.

Yang harus Anda lakukan adalah menukar URL asal di klon lokal Anda dengan URL repo bercabang Anda.

Lakukan seperti ini

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

Di mana https://github.com/fork/name.gitURL garpu Anda dari repo asli.

Setelah itu baru

git push

dan Anda akan dapat mendorong perubahan Anda ke garpu :)

Ahmad Awais
sumber
bekerja seperti pesona, terima kasih!
Rafael Ruales
7

Oke saya akhirnya mengedit file konfigurasi git saya:

$ nano .git/config

mengubah:

[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

untuk

[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

Kemudian,

$ git push

Bekerja seperti pesona.

Atau, berkat jawaban Thiago F Macedo :

git remote set-url origin https://[email protected]/user/repo.git
Rémi Becheras
sumber
-5

Anda harus mengkloning repo bercabang di akun Anda terlebih dahulu.

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

Anda benar-benar memiliki izin untuk mendorong ke repo ini. Jika Anda ingin memasukkan kode Anda ke repo asli, Anda dapat mengeluarkan permintaan penarikan.

LeonF
sumber
Mereka tidak meminta untuk mengkloning garpu. Mohon, baca pertanyaannya lagi.
Ahmad Awais