Как я могу нажать на свою вилку с клона исходного репо?

124

Я создал форк (назовем его 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, к которому у меня нет доступа на запись?

Реми Бешерас
источник

Ответы:

188

По умолчанию при клонировании репозитория

  • который проживает в https://github.com/original/orirepo.git,
  • чья текущая ветвь называется master,

затем

  • локальная конфигурация полученного клона перечисляет только один удаленный вызываемый объект origin, связанный с URL-адресом клонированного вами репозитория;
  • локальная masterветка в вашем клоне настроена на отслеживание origin/master .

Поэтому, если вы не изменяете конфигурацию своего клона, 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
    

вместо.

jub0bs
источник
будет ли «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. Работал! Спасибо!
Разработчик Мариус Жиленас
1
Если используется добавление удаленного доступа, как это влияет на тягу? Откуда это берется? Как он справляется с будущим слиянием двух репозиториев?
Kok How Teh
1
@KokHowTeh Добавление другого пульта дистанционного управления не влияет на то, какую удаленную ветку (если есть) отслеживает локальная ветка. Однако git push -u myrepo masterзаставляет вашего местного мастера начать отслеживание myrepo/master. Если после этого вы будете работать git pullна мастере, вы будете тянуть из него myrepo, а не из него origin.
jub0bs
18

Итак, вы клонировали чье-то репо, внесли изменения, а затем поняли, что вы не можете нажать на это репо, но вы можете нажать на свою собственную вилку. Итак, вы пошли дальше и разделили исходное репо.

Все, что вам нужно сделать, это заменить исходный URL-адрес в вашем локальном клоне на URL-адрес вашего разветвленного репо.

Делай это так

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

Где https://github.com/fork/name.gitнаходится URL-адрес вашей вилки из исходного репо.

После этого просто

git push

и вы сможете внести свои изменения в вилку :)

Ахмад Авайс
источник
работал как шарм, спасибо!
Рафаэль Руалес,
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

Работал как шарм.

Или, благодаря ответу Тьяго Ф. Маседо :

git remote set-url origin https://yourusername@github.com/user/repo.git
Реми Бешерас
источник
-5

Сначала вы должны клонировать разветвленное репо в своей учетной записи.

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

У вас есть абсолютно все права на добавление в это репо. Если вы хотите переместить свой код в исходное репо, вы можете отправить запрос на перенос.

LeonF
источник
Они не просят клонировать вилку. Пожалуйста, прочтите вопрос еще раз.
Ахмад Авайс