Giả sử alice
là một người dùng github.com, có 2 kho lưu trữ riêng tư trở lên repoN
. Trong ví dụ này, chúng tôi sẽ làm việc chỉ với hai kho lưu trữ có tên repo1
vàrepo2
https://github.com/alice/repo1
https://github.com/alice/repo2
Bạn cần phải lấy từ các kho lưu trữ này mà không cần nhập mật khẩu có thể trên một máy chủ hoặc trên nhiều máy chủ. Bạn muốn thực hiện git pull origin master
chẳng hạn, và bạn muốn điều này xảy ra mà không cần hỏi mật khẩu.
Bạn không thích giao dịch với ssh-agent, bạn đã phát hiện (hoặc bạn đang khám phá ngay bây giờ) về ~/.ssh/config
một tệp cho phép khách hàng ssh của bạn biết sử dụng khóa riêng nào tùy thuộc vào Tên máy chủ và tên người dùng, với mục nhập cấu hình đơn giản trông giống như điều này:
Host github.com
HostName github.com
User git
IdentityFile /home/alice/.ssh/alice_github.id_rsa
IdentitiesOnly yes
Vì vậy, bạn đã tiếp tục và tạo ra (alice_github.id_rsa, alice_github.id_rsa.pub)
cặp khóa của mình , sau đó bạn cũng đã đi đến .git/config
tệp của kho lưu trữ của mình và bạn đã sửa đổi url của điều khiển từ xa của bạn origin
thành một cái gì đó như thế này:
[remote "origin"]
url = "ssh://git@github.com/alice/repo1.git"
Và cuối cùng bạn đã đi đến phần kho lưu trữ Settings > Deploy keys
và thêm nội dung củaalice_github.id_rsa.pub
Tại thời điểm này, bạn có thể làm git pull origin master
mà không cần nhập mật khẩu mà không có vấn đề.
Nhưng còn kho thứ hai thì sao?
Vì vậy, bản năng của bạn sẽ là lấy khóa đó và thêm nó vào repo2
các khóa Triển khai, nhưng github.com sẽ báo lỗi và cho bạn biết rằng khóa đó đã được sử dụng.
Bây giờ bạn đi và tạo một khóa khác ( ssh-keygen -t rsa -C "alice@alice.com"
dĩ nhiên không sử dụng mật khẩu) và để điều này không trở thành một mớ hỗn độn, bây giờ bạn sẽ đặt tên cho các khóa của mình như thế này:
repo1
móc khóa: (repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
repo2
móc khóa: (repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)
Bây giờ bạn sẽ đặt khóa công khai mới vào repo2
cấu hình Khóa triển khai tại github.com, nhưng bây giờ bạn có vấn đề về ssh.
Làm thế nào ssh có thể cho biết khóa nào sẽ được sử dụng nếu kho được lưu trữ trên cùng một github.com
tên miền?
Tệp của bạn .ssh/config
trỏ đến github.com
và nó không biết nên sử dụng phím nào khi đến lúc thực hiện thao tác kéo.
Vì vậy, tôi tìm thấy một mẹo với github.com. Bạn có thể nói với khách hàng ssh của mình rằng mỗi kho lưu trữ nằm trong một tên miền phụ github.com khác nhau, trong những trường hợp này, chúng sẽ repo1.github.com
vàrepo2.github.com
Vì vậy, điều đầu tiên là chỉnh sửa các .git/config
tệp trên bản sao repo của bạn, để chúng trông giống như thế này:
Đối với repo1
[remote "origin"]
url = "ssh://git@repo1.github.com/alice/repo1.git"
Đối với repo2
[remote "origin"]
url = "ssh://git@repo2.github.com/alice/repo2.git"
Và sau đó, trên .ssh/config
tệp của bạn , bây giờ bạn sẽ có thể nhập cấu hình cho từng tên miền phụ :)
Host repo1.github.com
HostName github.com
User git
IdentityFile /home/alice/.ssh/repo1.alice_github.id_rsa
IdentitiesOnly yes
Host repo2.github.com
HostName github.com
User git
IdentityFile /home/alice/.ssh/repo2.alice_github.id_rsa
IdentitiesOnly yes
Bây giờ bạn có thể git pull origin master
mà không cần nhập bất kỳ mật khẩu từ cả hai kho lưu trữ.
Nếu bạn có nhiều máy, bạn có thể sao chép các phím vào từng máy và sử dụng lại chúng, nhưng tôi khuyên bạn nên thực hiện công việc chân để tạo 1 khóa cho mỗi máy và repo. Bạn sẽ có nhiều chìa khóa hơn để xử lý, nhưng bạn sẽ ít bị tổn thương hơn nếu bị xâm phạm.