Jak mogę wypchnąć do mojego forka z klonu oryginalnego repozytorium?

124

Stworzyłem fork (nazwijmy to myrepo) innego repozytorium (nazwijmy to orirepo) na GitHub. Później sklonowałem orirepo.

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

Zmodyfikowałem około 20 plików, potem wystawiłem zmianę i zatwierdziłem

git add
git commit

Jednak gdy próbowałem naciskać

git push

Mam ten błąd:

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

Wiem, że popełniłem błąd: powinienem raczej sklonować widelec niż orirepo, ale teraz jest na to za późno. Jak mógłbym naciskać na mój fork zamiast do origin/orirepo, do którego nie mam uprawnień do zapisu?

Rémi Becheras
źródło

Odpowiedzi:

188

Domyślnie podczas klonowania repozytorium

  • znajdującym się https://github.com/original/orirepo.git,
  • którego aktualna gałąź jest nazywana master,

następnie

  • lokalna konfiguracja wynikowego klonu zawiera tylko jedno wywołanie zdalne origin, które jest powiązane z adresem URL sklonowanego repozytorium;
  • lokalna mastergałąź klonu jest ustawiona na śledzenie origin/master .

Dlatego jeśli nie zmodyfikujesz konfiguracji swojego klonu, Git zinterpretuje

git push

tak jak

git push origin master:origin/master

Innymi słowy, git pushpróby wypchnięcia lokalnego masteroddziału do masteroddziału znajdującego się w repozytorium zdalnym (nazywanym przez twój klon origin). Jednak nie możesz tego zrobić, ponieważ nie masz uprawnień do zapisu w tym zdalnym repozytorium.

Musisz

  1. albo przedefiniuj originpilota, który ma być powiązany z twoim forkiem, uruchamiając

    git remote set-url origin https://github.com/RemiB/myrepo.git
    
  2. lub, jeśli chcesz zachować oryginalną definicję originpilota, zdefiniuj nowego pilota (nazywanego myrepotutaj), który jest powiązany z Twoim fork:

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

    Wtedy powinieneś być w stanie wypchnąć swój lokalny masteroddział na rozwidlenie, biegnąc

    git push myrepo master
    

    A jeśli chcesz powiedzieć Gitowi, że git pushpowinien naciskać myrepozamiast originod teraz, powinieneś uruchomić

    git push -u myrepo master
    

zamiast.

jub0bs
źródło
czy „git push -u” zmieni również domyślne zachowanie „git pull”?
benroth
1
Tak, będzie, więc zamiast robić "push -u", powinieneś użyć opcji pushDefault: git config --add remote.origin.pushdefault myrepo i będzie to dotyczyło tylko wypychania i dotyczy wszystkich istniejących nowych gałęzi.
Marius K
1
Zrobił git remote set-url origin http://github.com/myname/reponamei wtedy git push origin mybranch. Pracowałem! Dziękuję Ci!
Deweloper Marius Žilėnas,
1
Jeśli używane jest dodanie pilota, jak to wpływa na ciągnięcie? Skąd to bierze? Jak radzi sobie z przyszłym łączeniem dwóch repozytoriów?
Kok How Teh
1
@KokHowTeh Dodanie kolejnego pilota nie wpływa na to, który oddział zdalny (jeśli w ogóle) śledzi oddział lokalny. Jednak git push -u myrepo masterpowoduje , że lokalny master rozpoczyna śledzenie myrepo/master. Jeśli po tym będziesz biec git pullna master, będziesz ciągnął z myrepo, a już nie origin.
jub0bs
18

Więc sklonowałeś czyjeś repozytorium, wprowadziłeś zmiany, a następnie zdałeś sobie sprawę, że nie możesz naciskać na to repozytorium, ale możesz pushować do własnego forka. Więc poszedłeś naprzód i rozwidliłeś oryginalne repozytorium.

Wszystko, co musisz zrobić, to zamienić pierwotny adres URL w lokalnym klonie na adres URL rozwidlonego repozytorium.

Zrób to w ten sposób

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

Gdzie https://github.com/fork/name.gitjest adres URL twojego fork z oryginalnego repozytorium.

Po tym tylko

git push

i będziesz mógł wprowadzić zmiany do widelca :)

Ahmad Awais
źródło
działało jak urok, dzięki!
Rafael Ruales
7

Okej, w końcu wyedytowałem mój plik konfiguracyjny git:

$ nano .git/config

zmiana:

[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

do

[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

Następnie,

$ git push

Działał jak urok.

Lub, dzięki odpowiedzi Thiago F Macedo :

git remote set-url origin https://[email protected]/user/repo.git
Rémi Becheras
źródło
-5

Najpierw powinieneś sklonować rozwidlone repozytorium na swoim koncie.

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

Masz absolutnie uprawnienia do wypychania do tego repozytorium. Jeśli chcesz przesłać kod do oryginalnego repozytorium, możesz wysłać żądanie ściągnięcia.

LeonF
źródło
Nie proszą o klonowanie widelca. Prosimy o ponowne przeczytanie pytania.
Ahmad Awais