개인 저장소를 "가져 오는"올바른 방법은 무엇입니까?


143

$ go get많은 Google 시도 후에 개인 저장소로 작업 하는 방법을 찾고 있습니다.

첫 번째 시도 :

$ 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

그러나 로그인 정보를 제공하는 방법을 알 수 없으므로 메타 태그가 표시되지 않았습니다.

두 번째 시도 :

https://gist.github.com/shurcooL/6927554를 따르십시오 . .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

예, 작동하지만 .git내 프로젝트 이름 으로 확장하면 원래 이름으로 바꿀 수 있지만 매번 $ go get그렇게 좋지 않습니까? 다른 방법이 있습니까?


2
아래 답변을 따르면 내보내기 GOPRIVATE도해야합니다. 예export GOPRIVATE="github.com/steelx/that-private-repo"
STEEL

답변:


91

구성해야 할 것이 하나 있습니다. 예제는 GitHub를 기반으로하지만 프로세스를 변경하지 않아야합니다.

$ 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

이미 그렇게했지만 실제로는 구성이 하나 뿐이며 cat명령은 확인을위한 것입니다.
secmask

1
이것의 유일한 단점은 매번 전역 git 구성을 변경하지 않고 호스트마다 다른 구성을 가질 수 없다는 것입니다 (예 : 여러 공급자를 사용하는 경우). 그런 다음«ssh-level»에서 다음과 같이 설명하는 것이 좋습니다. stackoverflow.com/questions/27500861/…
Joachim

1
나는 이것이 더 높은 투표를 바랍니다. 공개 리포지토리에서도 가능하면 ssh를 사용하는 것이 좋습니다. 두 가지 요소로 인해 암호가 어색하기 때문입니다. 이것은 모든 github repos를 ssh url로 수정합니다. 감사!
captncraig 2016 년

53

올바른 방법은 리포지토리를 올바른 위치에 수동으로 배치하는 것입니다. 리포지토리가 있으면 go get -u패키지를 업데이트하고 go install설치하는 데 사용할 수 있습니다 . 이름이 패키지

github.com/secmask/awserver-go

로 전환

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

입력 한 명령은 다음과 같습니다.

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

5
@secmask go get는 일반적인 경우를위한 도구로 설계되었습니다. Go 팀은 구성 가능성을 추가하지 않기로 결정했기 때문에 사람들은 자신의 균열을 롤아웃하는 대신 표준을 준수했습니다. 그것은 당신이 가지고있는 경우 (즉, 개인 저장소)를 위해 만들어지지 않았습니다.
fuz December

@Shudipta 편집을 중단하십시오. 질문은 당신이 원하는 방식으로 나빠 보입니다.
fuz

좋은 문서. 내 생명을 구했습니다.
Anish Varghese

34

회사의 gitlab 에서 go get개인 저장소를 사용 하는 데 문제가있었습니다 . 해결책을 찾으려고 몇 분을 잃었습니다. 그리고 나는 이것을 찾았습니다 :

  1. https://gitlab.mycompany.com/profile/account 에서 개인 토큰을
    가져와야합니다.

  2. 개인 토큰으로 헤더를 추가하도록 git을 구성하십시오.

    $ git config --global http.extraheader "PRIVATE-TOKEN: YOUR_PRIVATE_TOKEN
  3. 요청을 http 에서 ssh 로 변환하도록 git을 구성하십시오 .

    $ git config --global url."git@gitlab.mycompany.com:".insteadOf "https://gitlab.mycompany.com/"
  4. 마지막으로 go get정상적으로 사용할 수 있습니다 .

    $ go get gitlab.com/company/private_repo

3
의 재미있는 사용 http.extraheader. +1
VonC

29
--global또한 많은 REPO를 사용하여 당신이 경우 다른 자식 서버에 개인 토큰을 보내? 안전한 위험?
secmask

그것에 대한 리뷰가 있습니까? 나는 우리가 그들에게 갈 때 그것을 공개 github 저장소로 보낼 것이라고 생각합니다
hemu

13

위의 모든 것이 나를 위해 작동하지 않았습니다. 저장소 복제가 올바르게 작동했지만 여전히 unrecognized import오류가 발생했습니다.

Go v1.13의 약자 인 doc에서 GOPRIVATE env 변수를 사용해야한다는 것을 알았습니다 .

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

10

이미 SSH를 사용하여 자식을 가지고있는 경우에, 이 대답 하여 아마르 Bandukwala는 간단한 해결 방법입니다 :


$ go getgit내부적으로 사용합니다 . 다음 한 라이너는 것 git결과적으로 $ go getSSH를 통해 패키지를 복제.

깃 허브 :

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

비트 버킷 :

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

10

그것은 GitLab 이슈 5769 처럼 보인다 .

GitLab에서 리포지토리는 항상로 끝나기 때문에 리포지토리 이름 끝에 .git지정해야 .git작동합니다. 예를 들면 다음과 같습니다.

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

과:

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

GitHub가를 추가하여이 문제를 해결 한 것 같습니다 ".git".

"에서 해결 될 것으로 예상되는 이동의 저장소를 검색에 대한 지원이 추가되었습니다. 올바른 메타 태그가있는 경우 # 5958 ” .
Go 자체에는 여전히 문제가 있지만 " cmd/go: go get은 HTML5 문서에서 메타 태그를 검색 할 수 없습니다 ".


실제로 그들 (및 다른 사람들)은 이미 메타 태그를 지원했지만 공개 저장소 ( go get로그인하지 않고 메타 태그를 볼 수 있는 곳)에서만 작동합니다.
secmask

@secmask이므로 ssh :를 사용하여 자격 증명을 제공합니다.
VonC

오, 그 옵션은 http, https를 사용할 수 있지만 go get명령은 go get gitlab.com/secmask/awserver-go.git.git(http 기본 인증을 요구할 것입니다), 모양도 좋지 않습니다.
secmask

8

여기에 github oauth 토큰을 생성하고 github 토큰을 환경 변수로 내보내십시오.

export GITHUB_TOKEN=123

기본 인증 URL을 사용하도록 git config를 설정하십시오.

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

이제 당신은 go get당신의 개인 레포 수 있습니다.


5

사용자 별 ssh-config를 만들었으므로 사용자는 올바른 자격 증명과 키로 자동 로그인합니다.

먼저 키 페어를 생성해야했습니다.

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

예를 들어 ~/.ssh/id_my_domain. 이것은 또한 Github 계정에 연결 한 키 쌍 (개인 및 공개)이기도하므로 내에 저장됩니다 ~/.ssh/id_github_com.

그런 다음 ~/.ssh/config항목과 함께 호출 된 파일을 만들거나 변경했습니다 .

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

다른 서버에서 "ssh-url" admin@domain.com:username/private-repo.git은이 서버에 대한 항목입니다.

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

그냥 당신이 그 보장 필요가 없다는 것을 명확하게 User, Host그리고 HostName정확하게 설정되어 있습니다.

이제 이동 경로로 이동 한 다음 파일 에 패키지가 포함 된 위치 ( go get <package>예 : go get main위의 예) 를 찾아 볼 수 있습니다 .main/main.godomain.com:username/private-repo.git


다음을 사용하여 패키지를 직접 가져올 수도 있습니다 go get hostname.com/username/repo.git(.git 확장자는 중요합니다).
Joachim

확장없이 할 수있는 방법 .git이 있습니까? 왜 그렇게됩니까?
Cristian Chaparro A.

1
나는없이 REPO을받을 수없는 원인 흥미 이유 .git는 내 로컬 자식 구성에 그 것이었다 확장, git config --global url."git@gitlab.myserver.com:".insteadOf "https://gitlab.myserver.com/"하지만 하위 도메인은 gitlab.myserver.com내가 사용 있도록 SSL 인증이없는 http대신 https지금,
크리스티안 Chaparro A.

3

나는 와서 이것 .netrc과 관련이 있다는 것을 알았습니다.

~/.netrc다음 내용 으로 파일 을 작성하십시오 .

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

끝난!

또한 최신 GO 버전의 경우 환경 변수에 추가해야 할 수도 있습니다 GOPRIVATE=github.com (내에 추가했습니다 .zshrc)

netrc 또한 HTTPS에 대한 개인 github 액세스가 이제 SSH 구성과 마찬가지로 시스템 전체에서 사용되도록 구성되어 개발 환경 설정을 개선합니다.

GitHub 개인 액세스 토큰 생성 : https://github.com/settings/tokens

SSH 인증을 사용하려면 ssh를 강제로 사용하도록 요청을 마스킹하십시오.

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

자식 액세스를 설정하는 더 많은 방법 : https://gist.github.com/technoweenie/1072829#gistcomment-2979908

참고 항목 man 페이지이 대답 특히 Windows에서 힘내과의 사용을


2

나를 위해 다른 사람들이 제공 한 솔루션은 여전히 ​​다음과 같은 오류를 일으켰습니다. go get

git@gl.nimi24.com : 권한이 거부되었습니다 (공개 키). 치명적 : 원격 저장소에서 읽을 수 없습니다. 올바른 액세스 권한이 있고 저장소가 존재하는지 확인하십시오.

이 솔루션에 필요한 것

  1. 다른 사람들이 언급했듯이 :

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

  2. ./ssh/id_rsa리포지토리에 대한 연결을 인증하는 데 사용 된 키 에서 암호를 제거 합니다. 다음에 대한 응답으로 프롬프트가 표시되면 빈 비밀번호를 입력하면됩니다.

    ssh-keygen -p

왜 이것이 작동 하는가

개인 키에 항상 암호를 입력하는 것이 더 좋으므로 OpenSSH 내부에서 문제가 발생했기 때문에 이것은 해결 방법이 아닙니다.

go getopenssh를 사용하여 연결을 여는 내부 git을 사용합니다. OpenSSH는 인증에 필요한 인증서를에서 가져옵니다 .ssh/id_rsa. 커맨드 라인에서 git 명령을 실행할 때 에이전트는 id_rsa 파일을 열어서 매번 암호 문구를 지정할 필요가 없지만 매번 실행하면 오지 않는 이유는 무엇입니까? 케이스. OpenSSH는 암호를 묻는 메시지를 표시하지만 호출 방법으로 인해 암호를 입력 할 수 없으므로 디버그 로그에 인쇄합니다.

read_passphrase : / dev / tty를 열 수 없습니다 : 해당 장치 또는 주소가 없습니다

그리고 그냥 실패합니다. 키 파일에서 암호를 제거하면 해당 프롬프트없이 OpenSSH가 키를 가져와 작동합니다.

이것은 수도 로 이동이 동시에 모듈을 가져 와서 (에 설명 된대로 동시에 Github에서 여러 SSH 연결을 열어 발생할 수 이 문서 ). 이것은 OpenSSH 디버그 로그가 리포지토리에 대한 초기 연결이 성공했음을 보여 주 었으나 나중에 어떤 이유로 든 다시 시도했으며 이번에는 암호를 요구하기로 결정했습니다.

그러나 언급 된 기사에서 제시 한 것처럼 SSH 연결 멀티플렉싱을 사용하는 솔루션은 효과가 없었습니다. 기록을 위해 저자는 영향을받는 호스트의 ssh 구성 파일에 다음 conf를 추가 할 것을 제안했습니다.

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

그러나 언급했듯이 나에게는 효과가 없었습니다. 아마도 잘못했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.