¿Es posible usar pip para instalar un paquete desde un repositorio privado de GitHub?

349

Estoy tratando de instalar un paquete de Python desde un repositorio privado de GitHub. Para un repositorio público, puedo emitir el siguiente comando que funciona bien:

pip install git+git://github.com/django/django.git

Sin embargo, si intento esto para un repositorio privado:

pip install git+git://github.com/echweb/echweb-utils.git

Me sale el siguiente resultado:

Downloading/unpacking git+git://github.com/echweb/echweb-utils.git
Cloning Git repository git://github.com/echweb/echweb-utils.git to /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build
Complete output from command /usr/local/bin/git clone git://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build:
fatal: The remote end hung up unexpectedly

Cloning into /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build...

----------------------------------------
Command /usr/local/bin/git clone git://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build failed with error code 128

Supongo que esto se debe a que estoy tratando de acceder a un repositorio privado sin proporcionar ninguna autenticación. Por lo tanto, intenté usar Git + sshcon la esperanza de que pip usara mi clave pública SSH para autenticar:

pip install git+ssh://github.com/echweb/echweb-utils.git

Esto da el siguiente resultado:

Downloading/unpacking git+ssh://github.com/echweb/echweb-utils.git
Cloning Git repository ssh://github.com/echweb/echweb-utils.git to /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build
Complete output from command /usr/local/bin/git clone ssh://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build:
Cloning into /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build...

Permission denied (publickey).

fatal: The remote end hung up unexpectedly

----------------------------------------
Command /usr/local/bin/git clone ssh://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build failed with error code 128

¿Es posible lo que estoy tratando de lograr? Si es así, ¿cómo puedo hacerlo?

Adam J. Forster
fuente
2
Ciertamente no es la respuesta correcta, pero clonar el repositorio manualmente y luego señalar pip a localhost en lugar de github lo ayudará a superar esto si solo está tratando de ser productivo.
nmichaels
@nmicheals Eso es lo que he hecho hasta ahora, pero necesito poner esto en archivos de requisitos para la implementación en muchos sitios web, todos con virtualenvs separados.
Adam J. Forster
Solo para estar seguro: ya has configurado el soporte de clave ssh en github, ¿verdad? Si eso definitivamente no funciona ... ¿Has intentado usar git + git: // user: [email protected] / .... como URI?
Jason LeBrun
Intente usar eval $(ssh-agent); ssh-add ~/.ssh/github_id_rsay luego ejecute las instalaciones de pip después de pip.pypa.io/en/stable/reference/pip_install/#git
Darren Weber

Respuestas:

375

Puede usar el git+sshesquema URI, pero debe establecer un nombre de usuario:

pip install git+ssh://git@github.com/echweb/echweb-utils.git

¿Ves la git@parte en el URI?

PD: Lea también sobre las claves de implementación .

PPS: en mi instalación, el esquema URI "git + ssh" solo funciona con requisitos "editables":

pip install -e URI#egg=EggName

Recuerde : cambie el :carácter que se git remote -vimprime en un /carácter antes de usar la dirección del control remoto en el pipcomando:

$ git remote -v
origin  git@github.com:echweb/echweb-utils.git (fetch)
                      ^ change this to a '/' character

Si lo olvida, recibirá este error:

ssh: Could not resolve hostname github.com:echweb:
         nodename nor servname provided, or not known
oxyum
fuente
3
Gracias por eso, solo me faltaba la parte git @. Por cierto, el comando 'pip install git + ssh: //[email protected]/echweb/echweb-utils.git' funcionó, no necesité el interruptor -e.
Adam J. Forster
2
también puede usar un archivo .ssh / config para establecer el nombre de usuario apropiado
Stefano
2
Esto solía estar funcionando para mí, pero ahora no, incluso estoy usando el git+ssh://[email protected]/echweb/echweb-utils.gitesquema correcto en mi archivo de requisitos. Abrí una nueva pregunta aquí: stackoverflow.com/questions/18883430/… . Cualquier ayuda sería genial.
Robeezy
2
Perfecto. Poner git+ssh://[email protected]/echweb/echweb-utils.giten requirements.txtmarcha también, lo cual es increíble.
Avindra Goolcharan
2
Si desea instalar desde una sucursal específica:pip install git+ssh://[email protected]/echweb/echweb-utils.git@branch-name
Guilherme Beltramini
73

Como técnica adicional, si tiene el repositorio privado clonado localmente, puede hacer lo siguiente:

pip install git+file://c:/repo/directory

De manera más moderna, puede hacer esto (y -esignifica que no tendrá que confirmar los cambios antes de que se reflejen):

pip install -e C:\repo\directory
Scott Stafford
fuente
99
Esto fue bastante útil. Aparentemente, los cambios locales deben ser confirmados por git antes de que puedan instalarse a través de pip.
Ramhiser
55
Eso es cierto: lo extrae del repositorio git (en .git), NO las copias de trabajo de los archivos.
Scott Stafford
47

Puede hacerlo directamente con la URL HTTPS como esta:

pip install git+https://github.com/username/repo.git

Esto también funciona simplemente agregando esa línea en los requisitos.txt en un proyecto de Django , por ejemplo.

danius
fuente
19
Sin embargo, para repositorios privados, esto activará una solicitud de nombre de usuario / contraseña en la consola, que probablemente no sea lo que desea.
rascalking
31

También funciona con Bitbucket :

pip install git+ssh://git@bitbucket.org/username/projectname.git

Pip usará sus claves SSH en este caso.

gnrfan
fuente
15

La sintaxis para el archivo de requisitos se proporciona aquí:

https://pip.pypa.io/en/latest/reference/pip_install.html#requirements-file-format

Entonces, por ejemplo, use:

-e git+http://github.com/rwillmer/django-behave#egg=django-behave

si desea que la fuente permanezca después de la instalación.

O solo

git+http://github.com/rwillmer/django-behave#egg=django-behave

si solo quieres que se instale.

Rachel
fuente
La URL para la sintaxis del archivo de requisitos ha cambiado. La nueva URL es: pip.pypa.io/en/latest/reference/…
esfera
15

Me resultó mucho más fácil usar tokens que las claves SSH. No pude encontrar mucha documentación buena sobre esto, así que encontré esta solución principalmente a través de prueba y error. Además, la instalación desde pip y setuptools tiene algunas diferencias sutiles; pero de esta manera debería funcionar para ambos.

GitHub no (actualmente, a partir de agosto de 2016) ofrece una manera fácil de obtener el zip / tarball de los repositorios privados. Por lo tanto, debe señalar las herramientas de configuración para indicarle a las herramientas de configuración que está apuntando a un repositorio de Git:

from setuptools import setup
import os
# Get the deploy key from https://help.github.com/articles/git-automation-with-oauth-tokens/
github_token = os.environ['GITHUB_TOKEN']

setup(
    # ...
    install_requires='package',
    dependency_links = [
    'git+https://{github_token}@github.com/user/{package}.git/@{version}#egg={package}-0'
        .format(github_token=github_token, package=package, version=master)
        ]

Un par de notas aquí:

  • Para repositorios privados, debe autenticarse con GitHub; La forma más simple que encontré es crear un token OAuth , colocarlo en su entorno y luego incluirlo con la URL
  • Debe incluir algún número de versión (aquí está 0) al final del enlace, incluso si no hay ningún paquete en PyPI . Esto tiene que ser un número real, no una palabra.
  • git+Debe prefacio para decirle a setuptools que es para clonar el repositorio, en lugar de apuntar a un zip / tarball
  • version puede ser una rama, una etiqueta o un hash de confirmación
  • Debe suministrar --process-dependency-linkssi se instala desde pip
Maximiliano
fuente
1
La nota setup.pyno debe contener dependencias concretas, solo abstractas. Esto especifica una dependencia concreta de setup.py.
Jorge Leitao
1
Con el lanzamiento de la versión 19.0 de pip, la opción --process-dependency-links está en desuso.
yardstick17
14

Descubrí una manera de 'instalar pip' automáticamente un repositorio privado de GitLab que no requiere solicitud de contraseña. Este enfoque utiliza "Implementar claves" de GitLab y un archivo de configuración SSH, por lo que puede implementar utilizando claves distintas de sus claves SSH personales (en mi caso, para uso de un 'bot). Quizás alguien amable alma pueda verificar usando GitHub.

Cree una nueva clave SSH:

ssh-keygen -t rsa -C "GitLab_Robot_Deploy_Key"

El archivo debería aparecer como ~/.ssh/GitLab_Robot_Deploy_Keyy ~/.ssh/GitLab_Robot_Deploy_Key.pub.

Copie y pegue el contenido del ~/.ssh/GitLab_Robot_Deploy_Key.pubarchivo en el cuadro de diálogo "Implementar claves" de GitLab.

Probar la nueva clave de implementación

El siguiente comando le dice a SSH que use su nueva clave de implementación para configurar la conexión. En caso de éxito, debería recibir el mensaje: "¡Bienvenido a GitLab, UserName!"

ssh -T -i ~/.ssh/GitLab_Robot_Deploy_Key [email protected]

Crear el archivo de configuración SSH

Luego, use un editor para crear un ~/.ssh/configarchivo. Agregue los siguientes contenidos. El valor 'Host' puede ser lo que desee (solo recuérdelo, porque lo usará más adelante). HostName es la URL de su instancia de GitLab. IdentifyFile es la ruta al archivo de clave SSH que creó en el primer paso.

Host GitLab
  HostName gitlab.mycorp.com
  IdentityFile ~/.ssh/GitLab_Robot_Deploy_Key

Apunte SSH al archivo de configuración

oxyum nos dio la receta para usar pip con SSH:

pip install git+ssh://[email protected]/my_name/my_repo.git

Solo necesitamos modificarlo un poco para que SSH use nuestra nueva clave de implementación. Hacemos eso apuntando SSH a la entrada del Host en el archivo de configuración SSH. Simplemente reemplace 'gitlab.mycorp.com' en el comando por el nombre de host que usamos en el archivo de configuración SSH:

pip install git+ssh://git@GitLab/my_name/my_repo.git

El paquete ahora debería instalarse sin ninguna solicitud de contraseña.

Referencia A
Referencia B

JS.
fuente
7

Cuando estaba instalando desde GitHub pude usar:

pip install git+ssh://git@github.com/<username>/<projectname>.git#egg=<eggname>

Pero, como tenía que ejecutar pip como sudo, las claves SSH ya no funcionaban con GitHub, y "git clone" falló en "Permiso denegado (clave pública)". Usar git+httpsme permitió ejecutar el comando como sudo y hacer que GitHub me solicite mi usuario / contraseña.

sudo pip install git+https://github.com/<username>/<projectname>.git#egg=<eggname>
jcarballo
fuente
¿Otras cuentas de usuario necesitan acceder a su proyecto? Si no, ¿has descubierto la sugerencia de nerdwaller?
Michael - ¿Dónde está Clay Shirky?
7

También puede instalar una dependencia de repositorio privado a través de git + https: //github.com / ... URL proporcionando credenciales de inicio de sesión (inicio de sesión y contraseña, o desplegar token) para curl con el .netrcarchivo:

echo "machine github.com login ei-grad password mypasswordshouldbehere" > ~/.netrc
pip install "git+https://github.com/ei-grad/my_private_repo.git#egg=my_private_repo"
ei-grad
fuente
5

Si desea instalar dependencias de un archivo de requisitos dentro de un servidor CI o similar, puede hacer esto:

git config --global credential.helper 'cache'
echo "protocol=https
host=example.com
username=${GIT_USER}
password=${GIT_PASS}
" | git credential approve
pip install -r requirements.txt

En mi caso, usé GIT_USER=gitlab-ci-tokeny GIT_PASS=${CI_JOB_TOKEN}.

Este método tiene una clara ventaja. Tiene un único archivo de requisitos que contiene todas sus dependencias.

AmirHossein
fuente
3

Si no desea utilizar SSH, puede agregar el nombre de usuario y la contraseña en la URL HTTPS.

El siguiente código supone que tiene un archivo llamado "pass" en el directorio de trabajo que contiene su contraseña.

export PASS=$(cat pass)
pip install git+https://<username>:$PASS@github.com/echweb/echweb-utils.git
sam
fuente
¿Esto marca su contraseña en texto sin formato en algún archivo de configuración?
Michael - ¿Dónde está Clay Shirky hace
0

La solución de oxyum está bien para esta respuesta. Solo quiero señalar que debe tener cuidado si está instalando usando, sudoya que las claves también deben almacenarse para la raíz (por ejemplo,/root/.ssh ).

Entonces puedes escribir

sudo pip install git+ssh://git@github.com/echweb/echweb-utils.git
Andres Romero
fuente
66
Solución fácil: no instales con sudo. En su lugar, use la --userbandera o un virtualenv.
nerdwaller
0

Si tiene su propia biblioteca / paquete en GitHub, GitLab, etc., debe agregar una etiqueta para confirmar con una versión concreta de la biblioteca, por ejemplo, v2.0, y luego puede instalar su paquete:

pip install git+ssh://link/name/repo.git@v2.0

Esto funciona para mi. Otras soluciones no me han funcionado.

zolty13
fuente
0

Aquí hay un método rápido que funcionó para mí. Simplemente bifurca el repositorio e instálalo desde tu propia cuenta de GitHub con

pip install git+https://github.com/yourName/repoName
Codificador de Schrödinger
fuente
-1

Simplemente copie el control remoto desde el git clonecomando original (o desde git remote -v). Obtendrás algo como esto:

A continuación, debe reemplazar :con al /lado del nombre de dominio.

Así que instale usando:

pip install git+ssh://git@bitbucket.org/your_account/my_pro.git
Mohideen bin Mohammed
fuente
¿Qué quiere decir con "comando copiar clon git" ? ¿Te refieres a "copiar usando el comando 'git clone'" ? ¿O "copiar el comando 'git clone'" ? ¿O algo mas? (Responda editando su respuesta , no aquí en los comentarios (según corresponda). Gracias de antemano).
Peter Mortensen
-2

Puedes intentar

pip install [email protected]/my_name/my_repo.git

sin ssh:.... Funciona para mi.

usuario2235670
fuente
OP solicitó github.
Karuhanga