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://[email protected]/"]
    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?

secmask
fonte
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 "[email protected]:"]
    insteadOf = https://github.com/
$ go get github.com/private/repo
JulienD
fonte
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
difuso
fonte
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."[email protected]:".insteadOf "https://gitlab.mycompany.com/"
  4. Finalmente, você pode usar o seu go getnormalmente:

    $ go get gitlab.com/company/private_repo
Rodrigo Oliveira
fonte
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
jolancornevin
fonte
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."[email protected]:".insteadOf "https://github.com/"

BitBucket:

$ git config --global url."[email protected]:".insteadOf "https://bitbucket.org/"
Robert K. Bell
fonte
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 ”.

VonC
fonte
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:[email protected]/".insteadOf "https://github.com/"

Agora você pode go getseu repositório particular.

Miguel Mota
fonte
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 "[email protected]"

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" é [email protected]: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.

Joachim
fonte
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."[email protected]:".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."[email protected]:".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

Kanak Singhal
fonte
2

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

[email protected]: 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."[email protected]:".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

Tarmo
fonte