programing

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

oldcodes 2023. 5. 4. 20:31
반응형

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

어떻게 해야 할지 찾고 있어요.$ go get여러 번의 구글 시도 끝에 개인 저장소로 작업합니다.

첫 번째 시도:

$ 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별로 좋지 않습니다, 다른 방법이 있나요?

구성할 항목이 하나 있습니다.이 예제는 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

1하려면 Go 1.11(Go 1.11 이상)을 GOPRIVATEvariable,합니다.: " " " 공 서 " 버 " 용 " 를 " 지 " 록 " 도 " 않 " 오 " 니 " 다 " 합 " 져 " 가 " 를 " 드 " variable " 코 " 여 " 하 " 용 "

export GOPRIVATE=github.com/private/repo

올바른 방법은 리포지토리를 올바른 위치에 수동으로 배치하는 것입니다.일단 저장소가 그곳에 있다면, 당신은 사용할 수 있습니다.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

나는 문제가 있었습니다.go get우리 회사의 gitlab에 있는 개인 저장소를 사용합니다.해결책을 찾느라 몇 분을 허비했습니다.그리고 저는 이것을 찾았습니다.

  1. 다음 위치에서 개인 토큰을 받아야 합니다.
    https://gitlab.mycompany.com/profile/://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
    

개인 GitLabs를 사용하는 사람들을 위해, https://gist.github.com/MicahParks/1ba2b19c39d1e5fccc3e892837b10e21 에 도움이 될 수 있는 스니펫이 있습니다.

아래에도 붙여넣음:

문제

go명령줄 도구가 개인 GitLab에서 종속성을 가져올 수 있어야 하지만 인증이 필요합니다.

이 GitLab에서 호스팅된다고 가정합니다.privategitlab.company.com.

환경변수

다음과 같은 환경 변수가 권장됩니다.

export GO111MODULE=on
export GOPRIVATE=privategitlab.company.com # this is comma delimited if using multiple private repos

위의 행은 셸 시작에 가장 적합할 수 있습니다. 예를 들어,~/.bashrc.

설명.

GO111MODULE=on는 모듈을 사용 중인 Golang 명령줄 도구에 대해 설명합니다.저는 개인 GitLab에서 Golang 모듈을 사용하지 않는 프로젝트로 이것을 테스트하지 않았습니다.

GOPRIVATE=privategitlab.company.comGolang 명령줄 도구에 나열된 호스트 이름에 대해 공용 인터넷 리소스를 사용하지 않도록 지정합니다(예: 공용 모듈 프록시).

개인 GitLab에서 개인 액세스 토큰 가져오기

이러한 지침을 나중에 입증하려면 GitLab 문서의 이 가이드를 따르십시오.나는 알고 있습니다.read_api하며, Golang 명령도작동구하스면필코요며, 할 수 있습니다.read_repository또한, 하지만 이것을 확인하지 않았습니다.

~/.netrc

Golang 명령줄 도구가 GitLab에 인증되도록 하려면 ,~/.netrc파일을 사용하는 것이 가장 좋습니다.

파일이 없는 경우 파일을 만들려면 다음 명령을 실행합니다.

touch ~/.netrc
chmod 600 ~/.netrc

이제 다음과 일치하도록 파일의 내용을 편집합니다.

machine privategitlab.company.com login USERNAME_HERE password TOKEN_HERE

에▁where디USERNAME_HERE 사용자 과 GitLab 사용자 이름으로 되었습니다.TOKEN_HERE이전 섹션에서 획득한 액세스 토큰으로 대체되었습니다.

흔한 실수들

다음과 같이 글로벌 Git 구성을 설정하지 마십시오.

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

문서를 에는 SSH 로 인해 SSH Git가 Golang과 할 수 합니다.~/.netrc.

보너스: SSH 구성 파일

의정적인위해을용사의 정기적인 .git툴, Golang 명령줄 툴이 아니라, 사용하기 편리합니다.~/.ssh/config를 위해명령을 실행합니다.이렇게 하려면 다음 명령을 실행합니다.

mkdir ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/config
chmod 600 ~/.ssh/config

대부분의 Linux 시스템에서 SSH가 기본 구성으로 작동하려면 위의 파일 및 디렉터리에 대한 사용 권한이 필수적입니다.

그런 다음 편집합니다.~/.ssh/config다음과 일치하는 파일:

Host privategitlab.company.com
  Hostname privategitlab.company.com
  User USERNAME_HERE
  IdentityFile ~/.ssh/id_rsa

위 파일의 공백은 중요하며 파일이 잘못되면 파일이 무효화됩니다.

에▁where디USERNAME_HERE 사용자 및 GitLab 사용자 입니다.~/.ssh/id_rsa파일 시스템의 SSH 개인 키 경로입니다.이미 GitLab에 공개 키를 업로드했습니다.여기 몇 가지 지침이 있습니다.

위의 모든 것이 나에게 효과가 없었습니다.레포 복제는 제대로 작동했지만, 저는 여전히 진단을 받고 있었습니다.unrecognized importmessage

Go v1.13을 의미하므로 문서에서 GOPRIVATE env 변수를 다음과 같이 사용해야 한다는 것을 알게 되었습니다.

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

여기에서 githuboauth 토큰을 생성하고 github 토큰을 환경 변수로 내보냅니다.

export GITHUB_TOKEN=123

기본 인증 URL을 사용하도록 git 구성을 설정합니다.

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

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

SSH를 사용하여 이미 Git을 사용한 경우 Ammar Bandukwala의 다음 답변은 간단한 해결 방법입니다.


$ go get사용하다git내적으로부 의 한 하의라이너.git$ go getSSH를 통해 패키지를 복제합니다.

Github:

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

비트 버킷:

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

우연히 발견했습니다..netrc그리고 이것과 관련이 있다는 것을 알았습니다.

~/.netrc다음 내용을 포함합니다.

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

알았어!

버전의 " " " " " " " " " " " " " " " " " " 에해야 할 도 있습니다.GOPRIVATE=github.com(추가했습니다.) 추가했습니다..zshrc)

netrc또한 HTTPS에 대한 개인 github 액세스가 이제 시스템 전체에서 사용되도록 구성되어 있으므로(SSH 구성과 마찬가지로) 개발 환경 설정이 향상됩니다.

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

특히 Git on Windows와 함께 사용하려면 이 답변을 참조하십시오.

참조: netrcman 페이지


SSH 인증을 유지하려면 요청을 마스크하여 SSH를 강제로 사용합니다.

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


기타 git 액세스 설정 방법: https://gist.github.com/technoweenie/1072829#gistcomment-2979908

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

GitLab으로 에..git를 지정해야 ..git다음과 같이 저장소 이름의 끝에 표시됩니다.

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

그리고:

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

깃허브가 이걸 추가해서 해결하는 것 같습니다.".git".

"고의 저장소 검색 지원 추가"에서 해결되어야 합니다. #5958", 올바른 메타 태그가 있는 경우.
바둑 자체에 대한 문제가 아직 남아 있지만,이동하여cmd/go HTML5 문서에서 메타 태그를 찾을없습니다."

여러 가지 해결책을 시도했지만 여전히 문제가 지속되었습니다.설정 후 최종 솔루션~/.netrc파일을 하여 다음 을 내 SSH ", " "에 했습니다.~/.bash_profile

export GOPRIVATE="github.com/[organization]"

사용자별 ssh-config를 생성했으므로 사용자가 올바른 자격 증명과 키를 사용하여 자동으로 로그인합니다.

먼저 키 쌍을 생성해야 했습니다.

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

그리고 그것을 e.g.에 저장했습니다.~/.ssh/id_my_domain은 제가계정에 및 제 은 Github 계정에 됩니다.~/.ssh/id_github_com.

▁file(▁()▁ior라는 을 만들었습니다(또는 변경했습니다.~/.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.go의 마지막 에서).domain.com:username/private-repo.git.

다른 사람들이 제공한 솔루션은 여전히 다음과 같은 오류를 발생시켰습니다.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 get내부적으로 git을 사용합니다. 이 git은 opensh를 사용하여 연결을 엽니다.는 Open에서 .SSH는 인증에 필요한 인증서를 사용합니다..ssh/id_rsa명령줄에서 git 명령을 실행할 때 에이전트가 id_rsa 파일을 열어 매번 암호 구문을 지정할 필요가 없도록 할 수 있지만, 내 경우에는 어떤 이유로든 실행되지 않았습니다.OpenSSH는 암호를 묻는 메시지를 표시하려고 하지만 암호가 호출된 방식으로 인해 암호를 입력할 수 없기 때문에 디버그 로그에 인쇄합니다.

read_passphrase: can't open /dev/tty: 해당 장치 또는 주소가 없습니다.

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

문제는 Go가 모듈을 동시에 가져오고 동시에 Github에 대한 여러 SSH 연결을 열기 때문에 발생할 수 있습니다( 문서에 설명됨).이는 OpenSSH 디버그 로그가 저장소에 대한 초기 연결이 성공했음을 보여주었지만 나중에 어떤 이유로 다시 시도했고 이번에는 암호를 요청하기로 결정했기 때문입니다.

하지만 위의 기사에서 제시한 SSH 연결 다중화를 사용하는 해결책은 저에게 효과가 없었습니다.기록을 위해 저자는 영향을 받는 호스트의 ssh 구성 파일에 콜로우 conf를 추가할 것을 제안했습니다.

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

하지만 언급한 바와 같이, 저에게 그것은 효과가 없었습니다, 아마도 제가 잘못했을 것입니다.

후 정후설GOPRIVATE그리고.git config ...

개인 소스를 가져올 때 다음과 같은 문제가 발생할 수 있습니다.

https fetch: Get "https://private/user/repo?go-get=1": EOF

그들은 없이는 개인 레포를 사용할 수 없습니다..git연장의

가 이입니다. " " " " " " " " " " VCS " " "git또는svn 어떤 는다른 달리것과또와 다르게.github.com또는golang.org그들은 바둑의 소스에 하드코드되어 있습니다.

그러면 바둑 도구는 다음을 수행할 것입니다.https개인 보고서를 가져오기 전에 쿼리:

https://private/user/repo?go-get=1

개인 레포가 지원하지 않는 경우https 요합다를 하십시오. 사용하십시오.replace : 접적으로말하면직,면말하,

require private/user/repo v1.0.0

...

replace private/user/repo => private.server/user/repo.git v1.0.0

https://golang.org/cmd/go/ #hdr-Remote_import_paths

처음에 시도했습니다.

[url "ssh://git@github.com/"]
    insteadOf = https://github.com/

하지만 제 지역에서는 효과가 없었습니다.

나는 노력했다.

ssh -t git@github.com

그리고 그것은 내 SSH가 괜찮다는 것을 보여줍니다.

마지막으로, 저는 모든 것을 비공개로 간주하고 HTTPS 대신 SSH를 사용하라고 말하는 문제를 해결했습니다.

추가export GOPRIVATE=*

이전 Gitconfig를 제거해야 합니다. 저도 같은 문제가 있었습니다.

에 저는 이에실습다니했행을 했습니다.gitconfig토큰이 만료된 사용자는 다음에 새 토큰으로 명령을 실행할 때 이전 토큰을 삭제해야 합니다.

독립 실행형/최종 저장소의 경우, 간단한 해결책으로 Go.mod 내의 모듈 이름을 회사 도메인을 사용하는 패키지로 지정하는 것이 어떻습니까?

module go.yourcompany.tld/the_repo

go.yourcompany.tld유효한 (하위) 도메인으로 존재할 필요조차 없습니다...

같안에서은서.go.mod사용할 수 있습니다.replacement방식으로 블록된 각 에서 복제됨)$GOPATH/src/go.yourcompany.tld (왜는 깃허브에 (왜우는리너무많에의합존이야니해까)it▁)?합▁(니까▁do▁too?)

편집

  1. 개인 레포는 일반적으로 개인 레포, 일반적으로 표준 기트 레포여야 한다는 것은 말할 필요도 없습니다. 그렇죠?그것과 함께, 왜 그냥.git clone그리고 나서.go get복제된 폴더 안에 있습니까?

하드 코드 인 고 겟입니다.Git Reason 아닙니다이▁g.그래서 Go Source를 수정합니다.
이유:
요청:go-getrepoRootForImportDynamic Will 파일: https://...go-get

// RepoRootForImportPath analyzes importPath to determine the
// version control system, and code repository to use.
func RepoRootForImportPath(importPath string, mod ModuleMode, security web.SecurityMode) (*RepoRoot, error) {
    rr, err := repoRootFromVCSPaths(importPath, security, vcsPaths)
    if err == errUnknownSite {
        rr, err = repoRootForImportDynamic(importPath, mod, security)
        if err != nil {
            err = importErrorf(importPath, "unrecognized import path %q: %v", importPath, err)
        }
    }
    if err != nil {
        rr1, err1 := repoRootFromVCSPaths(importPath, security, vcsPathsAfterDynamic)
        if err1 == nil {
            rr = rr1
            err = nil
        }
    }

따라서 gitlab 도메인을 vcscPaths에 추가하면 됩니다.
바둑 소스 코드 다운로드:

vi ./src/cmd/go/internal/vcs/vcs.go    

아래 코드를 찾습니다.

var vcsPaths = []*vcsPath{
    // GitHub
    {
        pathPrefix: "github.com",
        regexp:     lazyregexp.New(`^(?P<root>github\.com/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(/[A-Za-z0-9_.\-]+)*$`),
        vcs:        "git",
        repo:       "https://{root}",
        check:      noVCSSuffix,
    },

다음과 같이 코드를 추가합니다. XXXX가 도메인입니다.

    // GitLab
    {
        pathPrefix: "gitlab.xxxx.com",
        regexp:     lazyregexp.New(`^(?P<root>gitlab.xxxx\.com/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(/[A-Za-z0-9_.\-]+)*$`),
        vcs:        "git",
        repo:       "https://{root}",
        check:      noVCSSuffix,
    },

바둑을 편찬하고 대체합니다.

언급URL : https://stackoverflow.com/questions/27500861/whats-the-proper-way-to-go-get-a-private-repository

반응형