¿Es posible usar pip para instalar un paquete desde un repository github privado?

Como el título sugiere, estoy tratando de instalar un paquete python desde un repository privado de github. Para un repository público puedo emitir el siguiente comando que funciona bien:

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

Sin embargo, si bash esto para un repository 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 intentando acceder a un repository privado sin proporcionar ninguna autenticación. Por lo tanto, traté de usar git + ssh con 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 

¿Alguien sabe si lo que estoy tratando de lograr es incluso posible? Si es así, ¿puedes decirme cómo?

Puede usar el esquema URI de git+ssh , pero DEBE establecer el nombre de usuario:

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

Ver git@ parte en URI?

PS: También lea acerca de las claves de implementación .

PPS: en mi instalación, el esquema de URI “git + ssh” funciona solo con los requisitos “editables”:

 pip install -e URI#egg=EggName 

Recuerde : cambie el carácter : que git remote -v imprime en un carácter / antes de usar la dirección del control remoto en el comando pip :

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

Si olvida, obtendrá este error:

 ssh: Could not resolve hostname github.com:echweb: nodename nor servname provided, or not known 

Como técnica adicional, si tiene el repository privado clonado localmente, puede hacer:

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

EDITAR: Más moderno, puede hacer esto (y -e significará que no tiene que realizar cambios antes de que se reflejen):

 pip install -e C:\repo\directory 

Puedes hacerlo directamente con la URL de HTTPS de esta manera:

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

Esto también funciona simplemente añadiendo esa línea en el archivo Requirements.txt en un proyecto de Django, por ejemplo.

También funciona con Bitbucket:

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

Pip utilizará sus claves SSH en este caso.

La syntax para el archivo de requisitos se da aquí:

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

Así por ejemplo:

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

si quieres que la fuente se quede después de la instalación

o solo

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

Si solo quieres que sea instalado.

Descubrí una forma de “instalar” de forma automática un repository privado de GitLab que no requiere una solicitud de contraseña. Este enfoque utiliza GitLab “Implementar claves” y un archivo de configuración SSH para que pueda implementarlo utilizando otras claves que no sean sus claves SSH personales (en mi caso, para ser utilizadas por un ‘bot’). Tal vez alguien con alma bondadosa pueda verificar usando GitHub.

Crear una nueva clave SSH:

ssh-keygen -t rsa -C "GitLab_Robot_Deploy_Key"

El archivo debe aparecer como ~/.ssh/GitLab_Robot_Deploy_Key y ~/.ssh/GitLab_Robot_Deploy_Key.pub

Copie y pegue el contenido del archivo ~/.ssh/GitLab_Robot_Deploy_Key.pub 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 git@gitlab.mycorp.com

Crear el archivo de configuración SSH

A continuación, use un editor para crear un archivo ~/.ssh/config . Añade los siguientes contenidos. El valor ‘Host’ puede ser lo que quieras (solo recuérdalo, porque lo usarás más adelante). HostName es la URL de su instancia de GitLab. El archivo 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://git@gitlab.mycorp.com/my_name/my_repo.git

Solo necesitamos modificarlo un poco para hacer que SSH use nuestra nueva clave de implementación. Lo hacemos señalando SSH a la entrada del Host en el archivo de configuración de SSH. Simplemente reemplace ‘gitlab.mycorp.com’ en el comando al 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 debe instalarse sin solicitud de contraseña.

Referencia A
Referencia B

Me pareció mucho más fácil usar tokens que las claves SSH. No pude encontrar mucha buena documentación sobre esto, así que encontré esta solución principalmente a través de prueba y error. Además, la instalación desde pip & 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 forma fácil de obtener el zip / tarball de los repositorys privados. Así que debes apuntar a setuptools para decirle a setuptools que estás apuntando a un repository git:

 from setuptools import setup import os # get 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 repositorys privados, necesita autenticarse con GitHub; La forma más sencilla que encontré es crear un touth outh, soltarlo en su entorno y luego incluirlo con la URL.
  • Debe incluir algún número de versión (aquí hay 0 ) al final del enlace, incluso si no hay un paquete en PyPI. Este tiene que ser un número real, no una palabra.
  • Necesitas prefacio con git+ para decirle a setuptools que es clonar el repository, en lugar de apuntar a un zip / tarball
  • version puede ser una twig, una etiqueta o un hash de confirmación.
  • --process-dependency-links proporcionar --process-dependency-links si se instala desde pip

Cuando estaba instalando desde github pude usar:

 pip install git+ssh://git@github.com//.git#egg= 

PERO, ya que tuve que ejecutar pip como sudo , las claves SSH ya no funcionaban con github, el “clon git” falló en “Permiso denegado (publickey)”. El uso de git+https me permitió ejecutar el comando como sudo, y hacer que github me pregunte mi usuario / contraseña.

 sudo pip install git+https://github.com//.git#egg= 

También puede instalar una dependencia de repo 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 token de implementación) para enrollar con el archivo .netrc :

 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" 

Si desea instalar dependencias del archivo de requisitos dentro de un servidor de 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-token y GIT_PASS=${CI_JOB_TOKEN} .

Este método tiene una clara ventaja, tiene un solo archivo de requisitos que contiene todas sus dependencias.

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

A continuación, puede escribir

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

puedes intentar

pip install git+git@gitlab.mycorp.com/my_name/my_repo.git

sin ssh: … eso es trabajo para mi.

Si tiene su propia biblioteca / paquete en github / gitlab, etc., debe agregar una etiqueta para comprometerse con una versión concreta de la biblioteca, por ejemplo v2.0, entonces puede instalar su paquete

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

Esto funciona para mi Otras soluciones no han funcionado para mí.

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://:$PASS@github.com/echweb/echweb-utils.git