Làm thế nào tôi có thể đẩy đến ngã ba của tôi từ một bản sao của repo ban đầu?


122

Tôi đã tạo một ngã ba (hãy gọi nó myrepo) của một kho lưu trữ khác (hãy gọi nó orirepo) trên GitHub. Sau đó, tôi nhân bản orirepo.

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

Tôi đã sửa đổi khoảng 20 tệp, sau đó tôi dàn dựng thay đổi của mình và thực hiện cam kết

git add
git commit

Tuy nhiên, khi tôi cố gắng đẩy

git push

Tôi đã nhận được lỗi này:

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

Tôi biết tôi đã phạm sai lầm: đáng lẽ tôi nên nhân bản cái nĩa của mình chứ không phải orirepobây giờ đã quá muộn. Làm thế nào tôi có thể đẩy đến ngã ba của mình chứ không phải origin/orirepo, mà tôi không có quyền truy cập bằng văn bản?

Câu trả lời:


187

Theo mặc định, khi bạn sao chép một kho lưu trữ

  • cư trú tại https://github.com/original/orirepo.git,
  • có chi nhánh hiện tại được gọi là master,

sau đó

  • cấu hình cục bộ của bản sao kết quả chỉ liệt kê một từ xa được gọi origin, được liên kết với URL của kho lưu trữ mà bạn đã nhân bản;
  • masterchi nhánh địa phương trong bản sao của bạn được đặt để theo dõi origin/master .

Do đó, nếu bạn không sửa đổi cấu hình của bản sao của mình, Git phiên dịch

git push

như

git push origin master:origin/master

Nói cách khác, git pushcố gắng đẩy masterchi nhánh địa phương của bạn đến masterchi nhánh nằm trên kho lưu trữ từ xa (được biết đến bởi bản sao của bạn origin). Tuy nhiên, bạn không được phép làm điều đó, vì bạn không có quyền truy cập ghi vào kho lưu trữ từ xa đó.

Bạn cần phải

  1. hoặc xác định lại originđiều khiển từ xa được liên kết với ngã ba của bạn, bằng cách chạy

    git remote set-url origin https://github.com/RemiB/myrepo.git
    
  2. hoặc, nếu bạn muốn giữ nguyên định nghĩa ban đầu của originđiều khiển từ xa, hãy xác định một điều khiển từ xa mới (được gọi là myrepoở đây) được liên kết với ngã ba của bạn:

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

    Sau đó, bạn sẽ có thể đẩy masterchi nhánh địa phương của bạn đến ngã ba của bạn bằng cách chạy

    git push myrepo master
    

    Và nếu bạn muốn nói với Git rằng git pushnên đẩy sang myrepothay vì origintừ bây giờ, bạn nên chạy

    git push -u myrepo master
    

thay thế.


´git đẩy -u cũng sẽ thay đổi hành vi mặc định của git kéo Tập?
benroth

1
Có, vì vậy, thay vì thực hiện "đẩy -u", bạn nên sử dụng tùy chọn pushDefault: git config --add remote.origin.pushdefault myrepo và nó sẽ chỉ ảnh hưởng đến việc đẩy và áp dụng cho tất cả các nhánh mới hiện có.
Marius K

1
Đã git remote set-url origin http://github.com/myname/reponamevà sau đó git push origin mybranch. Đã làm việc! Cảm ơn bạn!
Nhà phát triển Marius ilėnas

1
Nếu thêm điều khiển từ xa được sử dụng, nó ảnh hưởng đến kéo như thế nào? Nó kéo từ đâu? Làm thế nào để nó xử lý sự hợp nhất trong tương lai giữa 2 repos?
Kok How Teh

1
@KokHowTeh Thêm một điều khiển từ xa khác sẽ không ảnh hưởng đến nhánh từ xa nào (nếu có) mà một nhánh cục bộ theo dõi. Tuy nhiên, git push -u myrepo masterlàm cho chủ địa phương của bạn bắt đầu theo dõi myrepo/master. Nếu sau đó, bạn chạy git pulltrong khi trên master, bạn sẽ kéo từ myrepovà không còn từ đó nữa origin.
jub0bs

17

Vì vậy, bạn đã nhân bản repo của ai đó đã thực hiện các thay đổi và sau đó nhận ra rằng bạn không thể đẩy tới repo đó, nhưng bạn có thể đẩy đến ngã ba của chính mình. Vì vậy, bạn đã đi trước và rẽ nhánh repo ban đầu.

Tất cả bạn phải làm là trao đổi URL gốc trong bản sao cục bộ của bạn với URL của repo rẽ nhánh của bạn.

Làm như thế này

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

Trong trường hợp https://github.com/fork/name.gitlà URL của ngã ba của bạn từ repo gốc.

Sau đó, chỉ

git push

và bạn sẽ có thể đẩy các thay đổi của bạn lên ngã ba của bạn :)


7

Được rồi cuối cùng tôi đã chỉnh sửa tập tin cấu hình git của mình:

$ nano .git/config

thay đổi :

[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

đến

[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

Sau đó,

$ git push

Làm việc như người ở.

Hoặc, nhờ câu trả lời của Thiago F Macedo :

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

-5

Bạn nên sao chép repo fork trong tài khoản của bạn trước.

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

Bạn hoàn toàn có quyền để đẩy vào repo này. Nếu bạn muốn đẩy mã của mình lên repo ban đầu, Bạn có thể đưa ra yêu cầu kéo.


Họ không yêu cầu nhân bản ngã ba. Vui lòng đọc lại câu hỏi.
Ahmad Awais
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.