Cách thích hợp để các nhà cung cấp có thể nhận được một kho lưu trữ riêng tư là gì?


143

Tôi đang tìm cách để có được $ go getcông việc với kho lưu trữ riêng tư, sau nhiều lần thử google.

Lần thử đầu tiên:

$ go get -v gitlab.com/secmask/awserver-go
Fetching https://gitlab.com/secmask/awserver-go?go-get=1
https fetch failed.
Fetching http://gitlab.com/secmask/awserver-go?go-get=1
Parsing meta tags from http://gitlab.com/secmask/awserver-go?go-get=1 (status code 200)
import "gitlab.com/secmask/awserver-go": parse http://gitlab.com/secmask/awserver-go?go-get=1: no go-import meta tags
package gitlab.com/secmask/awserver-go: unrecognized import path "gitlab.com/secmask/awserver-go

Đúng, nó không thấy các thẻ meta vì tôi không thể biết cách cung cấp thông tin đăng nhập.

Lần thử thứ hai:

Theo dõi https://gist.github.com/shurcooL/6927554 . Thêm cấu hình vào .gitconfig.

[url "ssh://git@gitlab.com/"]
    insteadOf = https://gitlab.com/
$ go get -v gitlab.com/secmask/awserver-go --> not work
$ go get -v gitlab.com/secmask/awserver-go.git --> work but I got src/gitlab.com/secmask/awserer-go.git

Có nó hoạt động nhưng với .gitphần mở rộng với tên dự án của tôi, tôi có thể đổi tên nó thành bản gốc nhưng làm mọi lúc mọi nơi $ go getkhông tốt lắm, liệu có cách nào khác không?


2
một khi bạn làm theo câu trả lời dưới đây, hãy chắc chắn để xuất khẩu GOPRIVATE. ví dụexport GOPRIVATE="github.com/steelx/that-private-repo"
THÉP

Câu trả lời:


91

Bạn có một thứ để cấu hình. Ví dụ này dựa trên GitHub nhưng điều này không nên thay đổi quy trình:

$ git config --global url.git@github.com:.insteadOf https://github.com/
$ cat ~/.gitconfig
[url "git@github.com:"]
    insteadOf = https://github.com/
$ go get github.com/private/repo

Đã làm điều đó, thực sự đó chỉ là một cấu hình để làm, catlệnh chỉ để xác minh.
secmask

1
Hạn chế duy nhất với điều này là bạn không thể có cấu hình khác nhau cho mỗi máy chủ (ví dụ: nếu bạn đang sử dụng nhiều nhà cung cấp) mà không thay đổi cấu hình git toàn cầu cho mỗi lần. Sau đó, tốt hơn hết là chỉ định điều này trên «ssh-level» như được mô tả của cô ấy: stackoverflow.com/questions/27500861/ Kẻ
Joachim

1
Tôi muốn điều này đã được bình chọn cao hơn. Ngay cả đối với các repos công khai, tôi thích sử dụng ssh bất cứ khi nào có thể, vì hai yếu tố khiến mật khẩu auth trở nên khó xử. Điều này sửa tất cả các repos github để ssh url. Cảm ơn!
captncraig

53

Cách thích hợp là tự đặt kho lưu trữ vào đúng nơi. Khi kho lưu trữ ở đó, bạn có thể sử dụng go get -uđể cập nhật gói và go installcài đặt nó. Một gói có tên

github.com/secmask/awserver-go

đi vào

$GOPATH/src/github.com/secmask/awserver-go

Các lệnh bạn gõ là:

cd $GOPATH/src/github.com/secmask
git clone git@github.com:secmask/awserver-go.git

5
@secmask go getđược thiết kế như một công cụ cho trường hợp phổ biến. Nhóm Go quyết định rõ ràng chống lại việc thêm cấu hình để mọi người tuân thủ các tiêu chuẩn thay vì tung ra hành trình của riêng họ. Nó không bao giờ được thực hiện cho trường hợp bạn có (ví dụ như kho riêng).
fuz

@Shudipta Hãy dừng lại với các chỉnh sửa. Các câu hỏi có vẻ tồi tệ hơn theo cách bạn muốn.
fuz

Tài liệu tốt đẹp. Cứu cuộc đời tôi.
Anish Varghese

34

Tôi gặp vấn đề với go getviệc sử dụng kho lưu trữ riêng trên gitlab từ công ty chúng tôi. Tôi mất vài phút cố gắng tìm giải pháp. Và tôi đã tìm thấy cái này:

  1. Bạn cần nhận mã thông báo riêng tư tại:
    https://gitlab.mycompany.com/profile/account

  2. Định cấu hình bạn git để thêm tiêu đề bổ sung với mã thông báo riêng tư của bạn:

    $ git config --global http.extraheader "PRIVATE-TOKEN: YOUR_PRIVATE_TOKEN
  3. Định cấu hình git của bạn để chuyển đổi các yêu cầu từ http sang ssh :

    $ git config --global url."git@gitlab.mycompany.com:".insteadOf "https://gitlab.mycompany.com/"
  4. Cuối cùng, bạn có thể sử dụng go getbình thường của bạn :

    $ go get gitlab.com/company/private_repo

3
Sử dụng thú vị của http.extraheader. +1
VonC

29
--globalcũng sẽ gửi mã thông báo riêng của bạn đến máy chủ git khác trong trường hợp bạn sử dụng nhiều repo? bất kỳ rủi ro an toàn?
secmask

Bất cứ ai có nhận xét về điều đó? Tôi nghĩ rằng nó sẽ gửi nó đến repo github công khai khi chúng tôi đi vào chúng
hemu

13

Tất cả những điều trên không làm việc cho tôi. Nhân bản repo đã hoạt động chính xác nhưng tôi vẫn gặp unrecognized importlỗi.

Vì nó là viết tắt của Go v1.13, tôi đã tìm thấy trong tài liệu rằng chúng ta nên sử dụng biến env GOPRIVATE như vậy:

$ GOPRIVATE=github.com/ORGANISATION_OR_USER_NAME go get -u github.com/ORGANISATION_OR_USER_NAME/REPO_NAME

10

Nếu bạn đã có git bằng SSH, câu trả lời này của Ammar Bandukwala là một cách giải quyết đơn giản:


$ go getsử dụng gitnội bộ. Một lớp lót sau đây sẽ tạo gitvà do đó $ go getsao chép gói của bạn thông qua SSH.

Github:

$ git config --global url."git@github.com:".insteadOf "https://github.com/"

Cai Xô nhỏ:

$ git config --global url."git@bitbucket.org:".insteadOf "https://bitbucket.org/"

10

Có vẻ như vấn đề GitLab 5769 .

Trong GitLab, vì các kho lưu trữ luôn kết thúc .git, tôi phải chỉ định .gitở cuối tên kho lưu trữ để làm cho nó hoạt động, ví dụ:

import "example.org/myuser/mygorepo.git"

Và:

$ go get example.org/myuser/mygorepo.git

Có vẻ như GitHub giải quyết điều này bằng cách nối thêm ".git".

Điều này được cho là sẽ được giải quyết trong hỗ trợ của Thêm vào cho việc truy xuất kho lưu trữ của Go. # 5958 , được cung cấp các thẻ meta phù hợp .
Mặc dù vẫn còn một vấn đề đối với bản thân Go: Hãy cmd/go: không thể khám phá thẻ meta trong các tài liệu HTML5 .


Trên thực tế, họ (và những người khác) đã hỗ trợ thẻ meta, nhưng nó chỉ hoạt động cho repo công khai (nơi go getcó thể thấy thẻ meta mà không cần đăng nhập)
secmask 16/12/14

@secmask đó là lý do tại sao bạn đang sử dụng ssh: để cung cấp thông tin đăng nhập theo cách đó.
VonC

ồ, đó chỉ là tùy chọn, tôi có thể sử dụng http, https để nhưng go getlệnh sẽ giống như go get gitlab.com/secmask/awserver-go.git.git(sẽ hỏi http xác thực cơ bản), trông cũng không tốt lắm.
secmask

8

Tạo mã thông báo github oauth tại đây và xuất mã thông báo github của bạn dưới dạng biến môi trường:

export GITHUB_TOKEN=123

Đặt cấu hình git để sử dụng url xác thực cơ bản:

git config --global url."https://$GITHUB_TOKEN:x-oauth-basic@github.com/".insteadOf "https://github.com/"

Bây giờ bạn có thể go getrepo riêng của bạn.


5

Tôi đã tạo một ssh-config cụ thể cho người dùng, vì vậy người dùng của tôi sẽ tự động đăng nhập với thông tin xác thực và khóa chính xác.

Đầu tiên tôi cần tạo cặp khóa

ssh-keygen -t rsa -b 4096 -C "my@email.here"

và lưu nó vào ví dụ ~/.ssh/id_my_domain. Lưu ý rằng đây cũng là cặp khóa (riêng tư và công khai) Tôi đã kết nối với tài khoản Github của mình, vì vậy tài khoản của tôi được lưu trữ ~/.ssh/id_github_com.

Sau đó tôi đã tạo (hoặc thay đổi) một tệp được gọi ~/.ssh/configvới một mục:

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_github_com

Trên một máy chủ khác, "ssh-url" là admin@domain.com:username/private-repo.gitvà mục nhập cho máy chủ này sẽ là:

Host domain.com
    HostName domain.com
    User admin
    IdentityFile ~/.ssh/id_domain_com

Chỉ cần làm rõ rằng bạn cần đảm bảo rằng User, HostHostNameđược đặt chính xác.

Bây giờ tôi chỉ có thể duyệt vào đường dẫn đi và sau đó go get <package>, ví dụ go get mainnơi tệp main/main.gobao gồm gói (từ ví dụ cuối cùng ở trên) domain.com:username/private-repo.git.


Bạn cũng có thể nhập gói trực tiếp với: go get hostname.com/username/repo.git(phần mở rộng .git là rất quan trọng).
Joachim

Có cách nào để làm điều đó mà không cần gia hạn .gitvà tại sao lại xảy ra?
Cristian Chaparro A.

1
Thật thú vị, lý do khiến tôi không thể có được repo, mà không có .gitphần mở rộng đó là vì cấu hình git cục bộ của tôi git config --global url."git@gitlab.myserver.com:".insteadOf "https://gitlab.myserver.com/", nhưng tên miền phụ gitlab.myserver.comkhông có chứng nhận ssl, vì vậy tôi sử dụng httpthay vìhttps , bây giờ
Cristian Chaparro A.

3

Tôi đã đi qua .netrcvà thấy nó có liên quan đến điều này.

Tạo một tệp ~/.netrccó nội dung sau:

machine github.com
    login <github username>
    password <github password or Personal access tokens >

Làm xong!

Ngoài ra, đối với các phiên bản GO mới nhất, bạn có thể cần thêm biến này vào các biến môi trường GOPRIVATE=github.com (tôi đã thêm nó vào .zshrc)

netrc cũng làm cho thiết lập môi trường phát triển của tôi tốt hơn vì quyền truy cập github cá nhân của tôi cho HTTPS hiện được định cấu hình để sử dụng trên máy (giống như cấu hình SSH của tôi).

Tạo mã thông báo truy cập cá nhân GitHub: https://github.com/sinstall/tokens

Nếu bạn muốn gắn bó với xác thực SSH, thì hãy che dấu yêu cầu sử dụng ssh một cách mạnh mẽ

git config --global url."git@github.com:".insteadOf "https://github.com/"

Các phương pháp khác để thiết lập quyền truy cập git: https://gist.github.com/technoweenie/1072829#gistcomment-2979908

Xem trang hướng dẫncâu trả lời này để biết cách sử dụng với Git trên Windows


2

Đối với tôi, các giải pháp được cung cấp bởi những người khác vẫn đưa ra lỗi sau go get

git@gl.nimi24.com: Quyền bị từ chối (khóa công khai). gây tử vong: Không thể đọc từ kho lưu trữ từ xa. Vui lòng đảm bảo rằng bạn có quyền truy cập chính xác và kho lưu trữ tồn tại.

Giải pháp này cần gì

  1. Như đã nêu của những người khác:

    git config --global url."git@github.com:".insteadOf "https://github.com/"

  2. Xóa cụm mật khẩu khỏi ./ssh/id_rsakhóa của tôi được sử dụng để xác thực kết nối với kho lưu trữ. Điều này có thể được thực hiện bằng cách nhập mật khẩu trống khi được nhắc là phản hồi:

    ssh-keygen -p

Tại sao điều này hoạt động

Đây không phải là một cách giải quyết tốt vì luôn có mật khẩu trên khóa riêng của bạn, nhưng nó đã gây ra sự cố ở đâu đó trong OpenSSH.

go getsử dụng git nội bộ, sử dụng openssh để mở kết nối. OpenSSH lấy các certs cần thiết để xác thực từ .ssh/id_rsa. Khi thực thi các lệnh git từ dòng lệnh, một tác nhân có thể đảm nhiệm việc mở tệp id_rsa cho bạn để bạn không phải chỉ định cụm mật khẩu mỗi lần, nhưng khi được thực thi trong bụng go get, điều này không hoạt động theo cách nào đó trong tôi trường hợp OpenSSH muốn nhắc bạn sau đó cho một mật khẩu nhưng vì không thể do cách nó được gọi, nó sẽ in ra nhật ký gỡ lỗi của nó:

read_passphrase: không thể mở / dev / tty: Không có thiết bị hoặc địa chỉ như vậy

Và chỉ thất bại. Nếu bạn xóa cụm mật khẩu khỏi tệp khóa, OpenSSH sẽ đến khóa của bạn mà không cần dấu nhắc đó và nó hoạt động

Điều này có thể được gây ra bởi việc tìm nạp các mô-đun đồng thời và mở nhiều kết nối SSH tới Github cùng một lúc (như được mô tả trong bài viết này ). Điều này phần nào được hỗ trợ bởi thực tế là nhật ký gỡ lỗi OpenSSH cho thấy kết nối ban đầu đến kho lưu trữ thành công, nhưng sau đó đã thử lại vì một số lý do và lần này đã chọn yêu cầu cụm mật khẩu.

Tuy nhiên, giải pháp sử dụng ghép kênh kết nối SSH như được đưa ra trong bài viết được đề cập không hiệu quả với tôi. Đối với bản ghi, tác giả đề nghị thêm conf collowing vào tệp cấu hình ssh cho máy chủ bị ảnh hưởng:

  ControlMaster auto
  ControlPersist 3600
  ControlPath ~/.ssh/%r@%h:%p

Nhưng như đã nói, đối với tôi nó không hoạt động, có lẽ tôi đã làm sai

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.