¿Cuál es la forma correcta de "ir a buscar" un repositorio privado?

143

Estoy buscando la forma de $ go gettrabajar con un repositorio privado, después de muchos intentos de Google.

El primer intento:

$ 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

Sí, no vio las metaetiquetas porque no podía saber cómo proporcionar información de inicio de sesión.

El segundo intento:

Siga https://gist.github.com/shurcooL/6927554 . Agregue config a .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

Sí, funciona, pero con la .gitextensión con el nombre de mi proyecto, puedo cambiarle el nombre a original, pero hacerlo cada vez $ go getque no es tan bueno, ¿hay alguna otra manera?

secmask
fuente
2
una vez que siga la respuesta a continuación, asegúrese de exportar GOPRIVATEtambién. por ejemploexport GOPRIVATE="github.com/steelx/that-private-repo"
STEEL

Respuestas:

91

Tienes una cosa para configurar. El ejemplo se basa en GitHub pero esto no debería cambiar el proceso:

$ 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
fuente
Ya lo hice, en realidad es solo una configuración que hacer, el catcomando es solo para verificar.
secmask
1
El único inconveniente con esto es que no puede tener una configuración diferente para cada host (por ejemplo, si está utilizando múltiples proveedores) sin alterar la configuración global de git para cada vez. Entonces es mucho mejor especificar esto en «ssh-level» como se describe en ella: stackoverflow.com/questions/27500861/…
Joachim
1
Desearía que esto fuera votado más alto. Incluso para repositorios públicos, prefiero usar ssh siempre que sea posible, ya que dos factores hacen que la autenticación de contraseña sea incómoda. Esto corrige todos los repositorios de github a URL ssh. ¡Gracias!
captncraig
53

La forma correcta es colocar manualmente el repositorio en el lugar correcto. Una vez que el repositorio esté allí, puede usarlo go get -upara actualizar el paquete e go installinstalarlo. Un paquete llamado

github.com/secmask/awserver-go

entra en

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

Los comandos que escribe son:

cd $GOPATH/src/github.com/secmask
git clone git@github.com:secmask/awserver-go.git
fuz
fuente
55
@secmask go getestá diseñado como una herramienta para el caso común. El equipo de Go decidió explícitamente no agregar capacidad de configuración para que las personas se adhieran a los estándares en lugar de lanzar su propia ruft. Nunca se hizo para el caso que tiene (es decir, repositorios privados).
fuz
@Shudipta Por favor, deténgase con las ediciones. Las preguntas se ven peor de la manera que lo desee.
fuz
Buena documentación Salvó mi vida.
Anish Varghese el
34

Tuve un problema con el go getuso del repositorio privado en gitlab de nuestra empresa. Perdí unos minutos tratando de encontrar una solución. Y encontré este:

  1. Necesita obtener un token privado en:
    https://gitlab.mycompany.com/profile/account

  2. Configure su git para agregar un encabezado adicional con su token privado:

    $ git config --global http.extraheader "PRIVATE-TOKEN: YOUR_PRIVATE_TOKEN
  3. Configure su git para convertir solicitudes de http a ssh :

    $ git config --global url."[email protected]:".insteadOf "https://gitlab.mycompany.com/"
  4. Finalmente puedes usar tu go getnormalmente:

    $ go get gitlab.com/company/private_repo
Rodrigo Oliveira
fuente
3
Interesante uso de http.extraheader. +1
VonC
29
será --globaltambién enviar su ficha privado a otro servidor git en caso de que el uso de muchas de recompra? algún riesgo seguro?
secmask
¿Alguien alguna crítica sobre eso? Creo que lo enviará al repositorio público de Github cuando los obtengamos
hemu
13

Todo lo anterior no funcionó para mí. Clonar el repositorio funcionaba correctamente, pero todavía recibía ununrecognized import error.

Como significa Go v1.13, encontré en el documento que deberíamos usar la variable GOPRIVATE env de esta manera:

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

Si ya tiene git usando SSH, esta respuesta de Ammar Bandukwala es una solución simple:


$ go getutiliza gitinternamente. Los siguientes revestimientos harán gity, en consecuencia, $ go getclonarán su paquete a través de 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
fuente
10

Eso se parece al problema GitLab 5769 .

En GitLab, dado que los repositorios siempre terminan .git, debo especificar .gital final del nombre del repositorio para que funcione, por ejemplo:

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

Y:

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

Parece que GitHub resuelve esto agregando ".git".

Se supone que debe resolverse en " Soporte agregado para la recuperación del repositorio de Go. # 5958 ”, siempre que las metaetiquetas correctas estén en su lugar .
Aunque todavía hay un problema para Go: " cmd/go: go get no puede descubrir metaetiquetas en documentos HTML5 ".

VonC
fuente
En realidad, ellos (y otros) ya han admitido metaetiquetas, pero solo funciona para repositorio público (donde se go getpueden ver metaetiquetas sin iniciar sesión)
secmask
@secmask, por eso está usando ssh: para proporcionar las credenciales de esa manera.
VonC
oh, esa es la única opción, puedo usar http, https pero el go getcomando se verá go get gitlab.com/secmask/awserver-go.git.git(pedirá autenticación básica http), que tampoco se ve bien.
secmask
8

Genere un token github oauth aquí y exporte su token github como una variable de entorno:

export GITHUB_TOKEN=123

Establezca git config para usar la url de autenticación básica:

git config --global url."https://$GITHUB_TOKEN:[email protected]/".insteadOf "https://github.com/"

Ahora puedes go gettu repositorio privado.

Miguel Mota
fuente
5

He creado una configuración ssh específica del usuario, por lo que mi usuario inicia sesión automáticamente con las credenciales y la clave correctas.

Primero necesitaba generar un par de claves

ssh-keygen -t rsa -b 4096 -C "[email protected]"

y lo guardé en eg ~/.ssh/id_my_domain. Tenga en cuenta que este es también el par de claves (privado y público) que he conectado a mi cuenta de Github, por lo que el mío se almacena en~/.ssh/id_github_com .

Luego he creado (o alterado) un archivo llamado ~/.ssh/configcon una entrada:

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

En otro servidor, el "ssh-url" es [email protected]:username/private-repo.gity la entrada para este servidor habría sido:

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

Solo para aclarar que necesita asegurarse de que User, HostyHostName esté configurado correctamente.

Ahora puedo simplemente buscar en la ruta de acceso y luego go get <package>, por ejemplo, go get maindonde el archivo main/main.goincluye el paquete (del último ejemplo anterior) domain.com:username/private-repo.git.

Joaquín
fuente
También puede importar un paquete directamente con: go get hostname.com/username/repo.git(la extensión .git es crucial).
Joachim
¿Hay alguna manera de hacerlo sin la extensión .gity por qué sucede?
Cristian Chaparro A.
1
Interesante, la razón porque yo no ser capaz de obtener la cesión temporal, sin la .gitextensión era que en mi configuración de Git local git config --global url."[email protected]:".insteadOf "https://gitlab.myserver.com/", pero el subdominio gitlab.myserver.comno tiene la certificación SSL, así que utilizo httpen lugar de https, por ahora
Cristian Chaparro A.
3

Me encontré con .netrc y lo encontré relevante para esto.

Cree un archivo ~/.netrccon el siguiente contenido:

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

¡Hecho!

Además, para las últimas versiones de GO, es posible que deba agregar esto a las variables de entorno GOPRIVATE=github.com (lo he agregado a mi.zshrc )

netrc también mejora la configuración de mi entorno de desarrollo ya que mi acceso github personal para HTTPS se ha configurado ahora para usarse en toda la máquina (al igual que mi configuración SSH).

Genere tokens de acceso personal de GitHub: https://github.com/settings/tokens

Si desea seguir con la autenticación SSH, enmascare la solicitud para usar ssh con fuerza

git config --global url."[email protected]:".insteadOf "https://github.com/"

Más métodos para configurar el acceso git: https://gist.github.com/technoweenie/1072829#gistcomment-2979908

Consulte la página de manual y esta respuesta para su uso con Git en Windows específicamente

Kanak Singhal
fuente
2

Para mí, las soluciones ofrecidas por otros todavía dieron el siguiente error durante go get

[email protected]: Permiso denegado (clave pública). fatal: no se pudo leer desde el repositorio remoto. Asegúrese de tener los derechos de acceso correctos y de que exista el repositorio.

Lo que requería esta solución

  1. Como lo han dicho otros:

    git config --global url."[email protected]:".insteadOf "https://github.com/"

  2. Eliminar la frase de contraseña de mi ./ssh/id_rsaclave que se usó para autenticar la conexión al repositorio. Esto se puede hacer ingresando una contraseña vacía cuando se le solicite como respuesta a:

    ssh-keygen -p

Por que esto funciona

Esta no es una solución alternativa, ya que siempre es mejor tener una frase de contraseña en su clave privada, pero estaba causando problemas en algún lugar dentro de OpenSSH.

go getusa internamente git, que usa openssh para abrir la conexión. OpenSSH toma los certificados necesarios para la autenticación de.ssh/id_rsa . Al ejecutar comandos git desde la línea de comandos, un agente puede encargarse de abrir el archivo id_rsa por usted para que no tenga que especificar la frase de contraseña cada vez, pero cuando se ejecuta en el estómago de go get, esto no funcionó en mi caso. OpenSSH desea solicitarle una contraseña, pero como no es posible debido a cómo se llamó, imprime en su registro de depuración:

read_passphrase: no se puede abrir / dev / tty: no existe tal dispositivo o dirección

Y simplemente falla. Si elimina la frase de contraseña del archivo de clave, OpenSSH accederá a su clave sin ese aviso y funciona

Esto podría ser causado por Ir a buscar módulos simultáneamente y abrir múltiples conexiones SSH a Github al mismo tiempo (como se describe en este artículo ). Esto está algo respaldado por el hecho de que el registro de depuración de OpenSSH mostró que la conexión inicial al repositorio fue exitosa, pero luego lo intentó nuevamente por alguna razón y esta vez optó por pedir una frase de contraseña.

Sin embargo, la solución de usar multiplexación de conexión SSH como se presenta en el artículo mencionado no funcionó para mí. Para el registro, el autor sugirió agregar la siguiente configuración al archivo de configuración ssh para el host afectado:

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

Pero como se dijo, para mí no funcionó, tal vez lo hice mal

Tarmo
fuente