Tôi biết, tôi đang trả lời điều này rất muộn và thậm chí StackOverflow đã xác nhận nếu tôi thực sự muốn trả lời. Tôi đang trả lời vì không ai thực sự mô tả vấn đề thực tế nên muốn chia sẻ như vậy.
Những thứ cơ bản
Trước tiên, hãy hiểu rằng điều gì ở xa. Remote là GitLab và hệ thống của bạn là cục bộ nên khi chúng ta nói về điều khiển từ xa origin
, bất kỳ URL nào được đặt trong git remote -v
đầu ra của bạn là URL từ xa của bạn.
Các giao thức
Về cơ bản, Git clone / đẩy / kéo hoạt động trên hai giao thức khác nhau chủ yếu (cũng có các giao thức khác) -
- Giao thức HTTP
- Giao thức SSH
Khi bạn sao chép một repo (hoặc thay đổi URL từ xa) và sử dụng URL HTTP như https://gitlab.com/wizpanda/backend-app.git thì nó sử dụng giao thức đầu tiên tức là giao thức HTTP.
Trong khi nếu bạn sao chép repo (hoặc thay đổi URL từ xa) và sử dụng URL như thế git@gitlab.com:wizpanda/backend-app.git
thì nó sẽ sử dụng giao thức SSH.
Giao thức HTTP
Trong giao thức này, mọi thao tác từ xa tức là sao chép, đẩy và kéo đều sử dụng xác thực đơn giản tức là tên người dùng và mật khẩu của điều khiển từ xa (GitLab trong trường hợp này) có nghĩa là đối với mọi thao tác, bạn phải nhập tên người dùng và mật khẩu có thể cồng kềnh .
Vì vậy, khi bạn đẩy / kéo / sao chép, GitLab / GitHub xác thực bạn bằng tên người dùng và mật khẩu của bạn và nó cho phép bạn thực hiện thao tác.
Nếu bạn muốn thử điều này, bạn có thể chuyển sang URL HTTP bằng cách chạy lệnh git remote set-url origin <http-git-url>
.
Để tránh trường hợp đó, bạn có thể sử dụng giao thức SSH.
Giao thức SSH
Một kết nối SSH đơn giản hoạt động trên các cặp khóa công khai. Vì vậy, trong trường hợp của bạn, GitLab không thể xác thực bạn vì bạn đang sử dụng URL SSH để liên lạc. Bây giờ, GitLab phải biết bạn theo một cách nào đó. Để làm được điều đó, bạn phải tạo một cặp khóa công khai và cung cấp khóa chung cho GitLab.
Bây giờ khi bạn đẩy / kéo / sao chép bằng GitLab, GIT (SSH bên trong) theo mặc định sẽ cung cấp khóa riêng của bạn cho GitLab và xác nhận danh tính của bạn và sau đó GitLab sẽ cho phép bạn thực hiện thao tác.
Vì vậy, tôi sẽ không lặp lại các bước đã được Muhammad đưa ra, tôi sẽ lặp lại chúng theo lý thuyết.
- Tạo một cặp khóa `ssh-keygen -t rsa -b 2048 -C" Khóa SSH chung của tôi "
- Cặp khóa được tạo sẽ theo mặc định
~/.ssh
có tên id_rsa.pub
(khóa chung) & id_rsa
(khóa riêng).
- Bạn sẽ lưu trữ khóa chung vào tài khoản GitLab của mình (cùng một khóa có thể được sử dụng trong nhiều hoặc bất kỳ máy chủ / tài khoản nào).
- Khi bạn sao chép / đẩy / kéo, GIT cung cấp khóa riêng của bạn.
- GitLab khớp với khóa riêng với khóa chung của bạn và cho phép bạn thực hiện.
Lời khuyên
Bạn phải luôn tạo một khóa rsa mạnh với ít nhất 2048 byte. Vì vậy, lệnh có thể được ssh-keygen -t rsa -b 2048
.
https://gitlab.com/help/ssh/README#generating-a-new-ssh-key- Pair
Tư tưởng chung
Cả hai cách tiếp cận đều có ưu và nhược điểm của họ. Sau khi tôi gõ văn bản trên, tôi đã đi tìm kiếm thêm về điều này bởi vì tôi chưa bao giờ đọc một cái gì đó về điều này.
Tôi tìm thấy tài liệu chính thức này https://git-scm.com/book/en/v2/Git-on-the-Server-The-Prot Protocol nói thêm về điều này. Quan điểm của tôi ở đây là, bằng cách đọc lỗi và suy nghĩ về lỗi, bạn có thể tự đưa ra lý thuyết hoặc hiểu và sau đó có thể khớp với một số kết quả của Google để khắc phục sự cố :)
ssh -vvvv git@gitlab.com
để xem nó có lấy khóa SSH không