Est-il possible d'utiliser pip pour installer un package à partir d'un référentiel GitHub privé?

349

J'essaie d'installer un package Python à partir d'un référentiel GitHub privé. Pour un référentiel public, je peux émettre la commande suivante qui fonctionne bien:

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

Cependant, si j'essaye ceci pour un dépôt privé:

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

J'obtiens la sortie suivante:

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

Je suppose que c'est parce que j'essaie d'accéder à un référentiel privé sans fournir d'authentification. J'ai donc essayé d'utiliser Git + en sshespérant que pip utiliserait ma clé publique SSH pour s'authentifier:

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

Cela donne la sortie suivante:

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

Est-ce que ce que j'essaie de réaliser est même possible? Si oui, comment faire?

Adam J. Forster
la source
2
Ce n'est certainement pas la bonne réponse, mais le clonage du référentiel manuellement, puis en pointant pip vers localhost au lieu de github vous permettra de passer au-delà si vous essayez simplement d'être productif.
nmichaels
@nmicheals C'est ce que j'ai fait jusqu'à présent, mais je dois le mettre dans des fichiers d'exigences pour le déploiement sur de nombreux sites Web, tous avec virtualenvs séparés.
Adam J.Forster
Juste pour être sûr: vous avez déjà configuré le support des clés ssh sur github, non? Si cela ne fonctionne vraiment pas .... Avez-vous essayé d'utiliser git + git: // user: [email protected] / .... comme URI?
Jason LeBrun
Essayez d'utiliser eval $(ssh-agent); ssh-add ~/.ssh/github_id_rsapuis exécutez les installations pip en suivant pip.pypa.io/en/stable/reference/pip_install/#git
Darren Weber

Réponses:

375

Vous pouvez utiliser le git+sshschéma URI, mais vous devez définir un nom d'utilisateur:

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

Voyez-vous la git@partie dans l'URI?

PS: Lisez également sur les clés de déploiement .

PPS: Dans mon installation, le schéma d'URI "git + ssh" ne fonctionne qu'avec des exigences "modifiables":

pip install -e URI#egg=EggName

N'oubliez pas : changez le :caractère qui git remote -vs'imprime en /caractère avant d'utiliser l'adresse de la télécommande dans la pipcommande:

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

Si vous oubliez, vous obtiendrez cette erreur:

ssh: Could not resolve hostname github.com:echweb:
         nodename nor servname provided, or not known
oxyum
la source
3
Merci pour cela, il me manquait juste la partie git @. Par ailleurs, la commande «pip install git + ssh: //[email protected]/echweb/echweb-utils.git» a fonctionné, je n'ai pas eu besoin du commutateur -e.
Adam J.Forster
2
vous pouvez également utiliser un fichier .ssh / config pour définir le nom d'utilisateur approprié
Stefano
2
Auparavant, cela fonctionnait pour moi, mais maintenant non, j'utilise même le bon git+ssh://[email protected]/echweb/echweb-utils.gitschéma dans mon fichier d'exigences. J'ai ouvert une nouvelle question ici: stackoverflow.com/questions/18883430/… . Toute aide est la bienvenue.
Robeezy
2
Parfait. Mettre git+ssh://[email protected]/echweb/echweb-utils.giten requirements.txtœuvre aussi, ce qui est génial.
Avindra Goolcharan
2
Si vous souhaitez installer depuis une branche spécifique:pip install git+ssh://[email protected]/echweb/echweb-utils.git@branch-name
Guilherme Beltramini
73

Comme technique supplémentaire, si vous avez cloné localement le référentiel privé, vous pouvez faire:

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

De façon plus moderne, vous pouvez simplement le faire (et la -evolonté signifie que vous n'avez pas à valider les modifications avant qu'elles ne soient reflétées):

pip install -e C:\repo\directory
Scott Stafford
la source
9
C'était très utile. Apparemment, les modifications locales doivent être git-commit avant d'être installées via pip.
ramhiser
5
C'est vrai - c'est le retirer du dépôt git (en .git), PAS les copies de travail des fichiers.
Scott Stafford
47

Vous pouvez le faire directement avec l'URL HTTPS comme ceci:

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

Cela fonctionne également simplement en ajoutant cette ligne dans le fichier requirements.txt dans un projet Django , par exemple.

danius
la source
19
Pour les dépôts privés, cependant, cela déclenchera une invite de nom d'utilisateur / mot de passe sur la console, ce qui n'est probablement pas ce que vous voulez.
Coquin
31

Il fonctionne également avec Bitbucket :

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

Pip utilisera vos clés SSH dans ce cas.

gnrfan
la source
15

La syntaxe du fichier d'exigences est donnée ici:

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

Ainsi, par exemple, utilisez:

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

si vous voulez que la source reste après l'installation.

Ou juste

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

si vous voulez juste qu'il soit installé.

Rachel
la source
L'URL de la syntaxe du fichier d'exigences a changé. La nouvelle URL est: pip.pypa.io/en/latest/reference/…
sphère
15

J'ai trouvé qu'il était beaucoup plus facile d'utiliser des jetons que des clés SSH. Je n'ai pas pu trouver beaucoup de bonne documentation à ce sujet, donc je suis tombé sur cette solution principalement par essais et erreurs. De plus, l'installation à partir de pip et setuptools présente quelques différences subtiles; mais cette façon devrait fonctionner pour les deux.

GitHub n'offre pas (actuellement, en août 2016) un moyen facile d'obtenir le zip / tarball des référentiels privés. Vous devez donc pointer setuptools pour indiquer à setuptools que vous pointez vers un référentiel 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)
        ]

Quelques notes ici:

  • Pour les référentiels privés, vous devez vous authentifier avec GitHub; le moyen le plus simple que j'ai trouvé est de créer un jeton OAuth , de le déposer dans votre environnement, puis de l'inclure avec l'URL
  • Vous devez inclure un numéro de version (ici 0) à la fin du lien, même s'il n'y a pas de paquet sur PyPI . Ce doit être un nombre réel, pas un mot.
  • Vous devez faire une préface git+pour dire à setuptools de cloner le référentiel, plutôt que de pointer un zip / tarball
  • version peut être une branche, une balise ou un hachage de validation
  • Vous devez fournir --process-dependency-linkssi l'installation à partir de pip
Maximilian
la source
1
La note setup.pyne doit pas contenir de dépendances concrètes, seulement des dépendances abstraites. Ceci spécifie une dépendance concrète sur setup.py.
Jorge Leitao
1
Avec la version de pip version 19.0, l'option --process-dependency-links est déconseillée.
yardstick17
14

J'ai trouvé un moyen de «pip installer» automatiquement un référentiel privé GitLab qui ne nécessite aucune invite de mot de passe. Cette approche utilise GitLab "Deploy Keys" et un fichier de configuration SSH, vous pouvez donc déployer en utilisant des clés autres que vos clés SSH personnelles (dans mon cas, pour une utilisation par un 'bot). Peut-être qu'une bonne âme peut vérifier en utilisant GitHub.

Créez une nouvelle clé SSH:

ssh-keygen -t rsa -C "GitLab_Robot_Deploy_Key"

Le fichier doit apparaître sous la forme ~/.ssh/GitLab_Robot_Deploy_Keyet ~/.ssh/GitLab_Robot_Deploy_Key.pub.

Copiez et collez le contenu du ~/.ssh/GitLab_Robot_Deploy_Key.pubfichier dans la boîte de dialogue "Déployer les clés" de GitLab.

Testez la nouvelle clé de déploiement

La commande suivante indique à SSH d'utiliser votre nouvelle clé de déploiement pour configurer la connexion. En cas de succès, vous devriez obtenir le message: "Bienvenue dans GitLab, UserName!"

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

Créez le fichier de configuration SSH

Ensuite, utilisez un éditeur pour créer un ~/.ssh/configfichier. Ajoutez le contenu suivant. La valeur 'Host' peut être tout ce que vous voulez (souvenez-vous-en, car vous l'utiliserez plus tard). HostName est l'URL de votre instance GitLab. IdentifyFile est le chemin d'accès au fichier de clé SSH que vous avez créé à la première étape.

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

Pointez SSH vers le fichier de configuration

oxyum nous a donné la recette pour utiliser pip avec SSH:

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

Nous avons juste besoin de le modifier un peu pour que SSH utilise notre nouvelle clé de déploiement. Nous faisons cela en pointant SSH vers l'entrée Host dans le fichier de configuration SSH. Remplacez simplement 'gitlab.mycorp.com' dans la commande par le nom d'hôte que nous avons utilisé dans le fichier de configuration SSH:

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

Le package doit maintenant être installé sans aucune invite de mot de passe.

Référence A
Référence B

JS.
la source
7

Lors de l'installation à partir de GitHub, j'ai pu utiliser:

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

Mais, puisque j'ai dû exécuter pip as sudo, les clés SSH ne fonctionnaient plus avec GitHub, et "git clone" a échoué sur "Autorisation refusée (publickey)". L'utilisation git+httpsm'a permis d'exécuter la commande en tant que sudo, et que GitHub me demande mon utilisateur / mot de passe.

sudo pip install git+https://github.com/<username>/<projectname>.git#egg=<eggname>
jcarballo
la source
D'autres comptes d'utilisateurs doivent-ils accéder à votre projet? Sinon, avez-vous découvert la suggestion de nerdwaller?
Michael - Où est Clay Shirky
7

Vous pouvez également installer une dépendance de référentiel privé via git + https: //github.com / ... URL en fournissant des informations de connexion (login et mot de passe, ou déployer un jeton) pour curl avec le .netrcfichier:

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
la source
5

Si vous souhaitez installer des dépendances à partir d'un fichier d'exigences sur un serveur CI ou similaire, vous pouvez le faire:

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

Dans mon cas, j'ai utilisé GIT_USER=gitlab-ci-tokenet GIT_PASS=${CI_JOB_TOKEN}.

Cette méthode présente un net avantage. Vous disposez d'un fichier d'exigences unique qui contient toutes vos dépendances.

AmirHossein
la source
3

Si vous ne souhaitez pas utiliser SSH, vous pouvez ajouter le nom d'utilisateur et le mot de passe dans l'URL HTTPS.

Le code ci-dessous suppose que vous avez un fichier appelé "pass" dans le répertoire de travail qui contient votre mot de passe.

export PASS=$(cat pass)
pip install git+https://<username>:$PASS@github.com/echweb/echweb-utils.git
sam
la source
Est-ce que cela tamponne votre mot de passe en clair dans un fichier de configuration?
Michael - Où est Clay Shirky
0

la solution d'oxyum est OK pour cette réponse. Je veux juste souligner que vous devez être prudent si vous installez à l'aide de sudocar les clés doivent également être stockées pour root (par exemple,/root/.ssh ).

Ensuite, vous pouvez taper

sudo pip install git+ssh://git@github.com/echweb/echweb-utils.git
Andres Romero
la source
6
Solution simple: ne pas installer avec sudo. Utilisez plutôt le --userdrapeau ou un virtualenv.
nerdwaller
0

Si vous avez votre propre bibliothèque / package sur GitHub, GitLab, etc., vous devez ajouter une balise pour valider avec une version concrète de la bibliothèque, par exemple, v2.0, puis vous pouvez installer votre package:

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

Cela fonctionne pour moi. D'autres solutions n'ont pas fonctionné pour moi.

zolty13
la source
0

Voici une méthode rapide qui a fonctionné pour moi. Forkez simplement le dépôt et installez-le à partir de votre propre compte GitHub avec

pip install git+https://github.com/yourName/repoName
Codeur de Schrödinger
la source
-1

Copiez simplement la télécommande depuis la git clonecommande d' origine (ou depuis git remote -v). Vous obtiendrez quelque chose comme ceci:

Ensuite, vous devez remplacer :par à /côté du nom de domaine.

Installez donc en utilisant:

pip install git+ssh://git@bitbucket.org/your_account/my_pro.git
Mohideen bin Mohammed
la source
Que voulez-vous dire par "copier la commande git clone" ? Voulez-vous dire "copier à l'aide de la commande 'git clone'" ? Ou "copiez la commande 'git clone'" ? Ou autre chose? (Veuillez répondre en modifiant votre réponse , pas ici dans les commentaires (le cas échéant). Merci d'avance.).
Peter Mortensen
-2

Vous pouvez essayer

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

sans pour autant ssh:... . Ça marche pour moi.

user2235670
la source
OP a demandé github.
Karuhanga