Qual é a maneira correta de "ir buscar" um repositório privado?


143

Estou procurando a maneira de começar a $ go gettrabalhar com repositório privado, depois de muitas tentativas no google.

A primeira tentativa:

$ 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

Sim, ele não viu as metatags porque eu não sabia como fornecer informações de login.

A segunda tentativa:

Siga https://gist.github.com/shurcooL/6927554 . Adicione a configuração ao .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

Sim, funciona, mas com a .gitextensão com o nome do meu projeto, posso renomeá-lo para original, mas sempre que $ go getnão é tão bom, existe outro caminho?


2
Depois de seguir a resposta abaixo, certifique-se de exportar GOPRIVATEtambém. por exemploexport GOPRIVATE="github.com/steelx/that-private-repo"
— STEEL

Respostas:


91

Você tem uma coisa para configurar. O exemplo é baseado no GitHub, mas isso não deve alterar o processo:

$ 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

Já fiz isso, na verdade é apenas uma configuração a fazer, o catcomando é apenas para verificação.
— secmask

1
A única desvantagem disso é que você não pode ter configurações diferentes para cada host (por exemplo, se você estiver usando vários provedores) sem alterar a configuração global do git a cada vez. Então é muito melhor especificar isso em «ssh-level» como a descreveu: stackoverflow.com/questions/27500861/…
— Joachim

1
Eu gostaria que isso fosse votado mais alto. Mesmo para repositórios públicos, eu prefiro usar ssh sempre que possível, pois dois fatores tornam a autenticação de senha estranha. Isso corrige todos os repositórios do github em URLs ssh. Obrigado!
— captncraig

53

A maneira correta é colocar manualmente o repositório no lugar certo. Quando o repositório estiver lá, você poderá usar go get -upara atualizar o pacote e go installinstalá-lo. Um pacote chamado

github.com/secmask/awserver-go

entra em

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

Os comandos que você digita são:

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

5
O @secmask go getfoi desenvolvido como uma ferramenta para o caso comum. A equipe do Go decidiu explicitamente não adicionar a configurabilidade para que as pessoas aderissem aos padrões em vez de lançar seu próprio cruft. Nunca foi feito para o caso que você possui (por exemplo, repositórios particulares).
— fuz

@ Shudipta Por favor, pare com as edições. As perguntas parecem piores do jeito que você deseja.
— fuz 16/11/19

Boa documentação. Salvou a minha vida.
— Anish Varghese

34

Eu tive um problema ao go getusar o repositório privado no gitlab da nossa empresa. Perdi alguns minutos tentando encontrar uma solução. E eu encontrei este:

  1. Você precisa obter um token particular em:
    https://gitlab.mycompany.com/profile/account

  2. Configure seu git para adicionar cabeçalho extra com seu token privado:

    $ git config --global http.extraheader "PRIVATE-TOKEN: YOUR_PRIVATE_TOKEN
  3. Configure seu git para converter solicitações de http para ssh :

    $ git config --global url."git@gitlab.mycompany.com:".insteadOf "https://gitlab.mycompany.com/"
  4. Finalmente, você pode usar o seu go getnormalmente:

    $ go get gitlab.com/company/private_repo

3
Uso interessante de http.extraheader. +1
— VonC 29/08/19

29
irá --globaltambém enviar seu token privada para outro servidor git no caso de você usar muitos repo? algum risco seguro?
— usar o seguinte comando

Alguém comentou sobre isso? Eu acho que ele será enviado para o repositório público do github quando formos
— abordá-

13

Todas as opções acima não funcionaram para mim. A clonagem do repositório estava funcionando corretamente, mas eu ainda estava recebendo um unrecognized importerro.

Como significa Go v1.13, descobri no documento que devemos usar a variável env GOPRIVATE da seguinte forma:

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

10

Se você já possui o git usando SSH, esta resposta de Ammar Bandukwala é uma solução simples:


$ go getusa gitinternamente. Os seguintes liners farão gite, consequentemente, $ go getclonarão seu pacote via SSH.

Github:

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

BitBucket:

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

10

Parece o problema do GitLab 5769 .

No GitLab, como os repositórios sempre terminam .git, devo especificar .gitno final do nome do repositório para fazê-lo funcionar, por exemplo:

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

E:

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

Parece que o GitHub resolve isso anexando ".git".

Ele deve ser resolvido em “ Suporte adicionado para recuperação de repositório do Go. Nº 5958 ", desde que as metatags corretas estejam no lugar .
Embora ainda exista um problema para o Go: “ cmd/go: o get get não pode descobrir a meta tag nos documentos HTML5 ”.


Na verdade, eles (e outros) já apoiou meta tags, mas ele só funciona para repo público (onde go getpode ver meta tags sem login)
— secmask

@secmask, e é por isso que você está usando ssh: para fornecer as credenciais dessa maneira.
— VonC

oh, essa opção, eu posso usar http, https para mas o go getcomando será parecido go get gitlab.com/secmask/awserver-go.git.git(pedirá a autenticação básica do http), o que também não parecerá bom.
— secmask

8

Gere um token oith do github aqui e exporte o token do github como uma variável de ambiente:

export GITHUB_TOKEN=123

Defina git config para usar o URL de autenticação básico:

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

Agora você pode go getseu repositório particular.


5

Eu criei um ssh-config específico do usuário, para que o usuário efetue login automaticamente com as credenciais e a chave corretas.

Primeiro eu precisei gerar um par de chaves

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

e salvou para, por exemplo ~/.ssh/id_my_domain. Observe que este também é o par de chaves (privado e público) que eu conectei à minha conta do Github, então a minha é armazenada ~/.ssh/id_github_com.

Eu criei (ou alterei) um arquivo chamado ~/.ssh/configcom uma entrada:

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

Em outro servidor, o "ssh-url" é admin@domain.com:username/private-repo.gite a entrada para este servidor seria:

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

Apenas para esclarecer que você precisa garantir que o User, Hoste HostNameestá definido corretamente.

Agora posso apenas navegar no caminho ir e go get <package>, por exemplo, go get mainonde o arquivo main/main.goinclui o pacote (do último exemplo acima) domain.com:username/private-repo.git.


Você também pode importar um pacote diretamente com: go get hostname.com/username/repo.git(a extensão .git é crucial).
— Joachim

existe alguma maneira de fazer isso sem a extensão .gite por que isso acontece?
— Cristian Chaparro A.

1
Interessante, a razão pela qual não consigo obter o repo, sem a .gitextensão que era na minha configuração git local git config --global url."git@gitlab.myserver.com:".insteadOf "https://gitlab.myserver.com/", mas o subdomínio gitlab.myserver.comnão tem a certificação ssl, então eu uso em httpvez de httpsagora
— Cristian Chaparro A.

3

Me deparei com .netrce achei relevante para isso.

Crie um arquivo ~/.netrccom o seguinte conteúdo:

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

Feito!

Além disso, para as versões mais recentes do GO, talvez seja necessário adicionar isso às variáveis ​​de ambiente GOPRIVATE=github.com (eu adicionei ao meu .zshrc)

netrc também melhora a configuração do meu ambiente de desenvolvimento, já que meu acesso pessoal ao HTTPS no github foi configurado para ser usado em toda a máquina (assim como minha configuração SSH).

Gere tokens de acesso pessoal do GitHub: https://github.com/settings/tokens

Se você deseja manter a autenticação SSH, oculte a solicitação para usar o ssh com força

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

Mais métodos para configurar o acesso ao git: https://gist.github.com/technoweenie/1072829#gistcomment-2979908

Consulte a página do manual e esta resposta para usá-lo especificamente com o Git no Windows


2

Para mim, as soluções oferecidas por outros ainda deram o seguinte erro durante go get

git@gl.nimi24.com: permissão negada (chave pública). fatal: Não foi possível ler do repositório remoto. Verifique se você possui os direitos de acesso corretos e se o repositório existe.

O que esta solução exigia

  1. Como declarado por outros:

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

  2. Removendo a senha da minha ./ssh/id_rsachave que foi usada para autenticar a conexão com o repositório. Isso pode ser feito digitando uma senha vazia quando solicitado como resposta a:

    ssh-keygen -p

Por que isso funciona

Essa não é uma solução alternativa, pois é sempre melhor ter uma senha na sua chave privada, mas estava causando problemas em algum lugar do OpenSSH.

go getusa internamente git, que usa openssh para abrir a conexão. O OpenSSH recebe os certificados necessários para autenticação .ssh/id_rsa. Ao executar comandos git a partir da linha de comando, um agente pode cuidar de abrir o arquivo id_rsa para você, para que você não precise especificar a senha sempre, mas quando executado no ventre de ir buscar, isso não funcionava de alguma maneira no meu caso. O OpenSSH deseja solicitar uma senha, mas como não é possível devido à forma como foi chamada, ela imprime no seu log de depuração:

read_passphrase: não é possível abrir / dev / tty: esse dispositivo ou endereço não existe

E apenas falha. Se você remover a senha do arquivo de chaves, o OpenSSH acessará sua chave sem esse prompt e funcionará

Isso pode ser causado pelo Go buscar módulos simultaneamente e abrir várias conexões SSH ao Github ao mesmo tempo (conforme descrito neste artigo ). Isso é um pouco suportado pelo fato de o log de depuração do OpenSSH mostrar a conexão inicial com o repositório bem-sucedida, mas mais tarde tentou novamente por algum motivo e, dessa vez, optou por solicitar uma senha.

No entanto, a solução de usar a multiplexação de conexão SSH, conforme apresentado no artigo mencionado, não funcionou para mim. Para o registro, o autor sugeriu adicionar o conf que se reduz ao arquivo de configuração ssh do host afetado:

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

Mas, como afirmado, para mim não funcionou, talvez eu tenha feito errado

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.