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


123

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

Відповіді:


187

За замовчуванням, коли ви клонуєте сховище

  • що проживає в 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
    

замість цього.


чи "git push -u" також змінить типову поведінку "git pull"?
benroth

1
Так, так буде, тому замість того, щоб робити "push -u", ви повинні використовувати опцію pushDefault: git config --add remote.origin.pushdefault myrepo, і це вплине лише на натискання, і стосується всіх існуючих нових гілок.
Маріус К

1
Зробив git remote set-url origin http://github.com/myname/reponameі тоді git push origin mybranch. Працювали! Дякую!
розробник Marius Žilėnas

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 config файл:

$ 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

Ви абсолютно маєте права на доступ до цього репо. Якщо ви хочете підштовхнути свій код до оригінального репо, ви можете надіслати запит на виклик.


Вони не просять клонувати виделку. Ласкаво, прочитайте питання ще раз.
Ахмад Авей
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.