È possibile usare pip per installare un pacchetto da un repository GitHub privato?


349

Sto cercando di installare un pacchetto Python da un repository GitHub privato. Per un repository pubblico, posso emettere il seguente comando che funziona perfettamente:

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

Tuttavia, se provo questo per un repository privato:

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

Ottengo il seguente output:

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

Immagino che questo sia perché sto provando ad accedere a un repository privato senza fornire alcuna autenticazione. Ho quindi cercato di usare Git + sshsperando che pip usasse la mia chiave pubblica SSH per autenticare:

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

Questo dà il seguente output:

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

Ciò che sto cercando di ottenere è anche possibile? In tal caso, come posso farlo?


2
Non è certamente la risposta corretta, ma la clonazione manuale del repository, quindi il puntamento di pip su localhost invece di github ti farà passare oltre questo se stai solo cercando di essere produttivo.
nmichaels,

@nmicheals Questo è quello che ho fatto finora, ma devo metterlo nei file dei requisiti per la distribuzione su molti siti Web tutti con virtualenv separati.
Adam J. Forster,

Giusto per essere sicuro: hai già impostato il supporto per i tasti ssh su github, giusto? Se sicuramente non funziona .... Hai provato a usare git + git: // user: pass@github.com / .... come URI?
Jason LeBrun,

Prova a utilizzare eval $(ssh-agent); ssh-add ~/.ssh/github_id_rsaed esegui pip install seguendo pip.pypa.io/en/stable/reference/pip_install/#git
Darren Weber

Risposte:


375

È possibile utilizzare lo git+sshschema URI, ma è necessario impostare un nome utente:

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

Vedi la git@parte nell'URI?

PS: leggi anche le chiavi di distribuzione .

PPS: Nella mia installazione, lo schema URI "git + ssh" funziona solo con requisiti "modificabili":

pip install -e URI#egg=EggName

Ricorda : cambia il :carattere che git remote -vstampa in un /personaggio prima di usare l'indirizzo del telecomando nel pipcomando:

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

Se dimentichi, otterrai questo errore:

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

3
Grazie, mi mancava solo la parte git @. Per inciso il comando 'pip install git + ssh: //git@github.com/echweb/echweb-utils.git' ha funzionato, non ho richiesto l'opzione -e.
Adam J. Forster,

2
puoi anche usare un file .ssh / config per impostare il nome utente corretto
Stefano

2
Questo funzionava per me, ma ora non lo è, sto anche usando lo git+ssh://git@github.com/echweb/echweb-utils.gitschema corretto nel mio file dei requisiti. Ho aperto una nuova domanda qui: stackoverflow.com/questions/18883430/… . Qualsiasi aiuto sarebbe grande.
Robeezy,

2
Perfetto. Mettere anche git+ssh://git@github.com/echweb/echweb-utils.gitin requirements.txtopera, il che è fantastico.
Avindra Goolcharan,

2
Se si desidera installare da un ramo specifico:pip install git+ssh://git@github.com/echweb/echweb-utils.git@branch-name
Guilherme Beltramini,

73

Come tecnica aggiuntiva, se il repository privato è clonato localmente, è possibile eseguire:

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

Più moderno, puoi semplicemente farlo (e -eciò significherà che non devi impegnare le modifiche prima che si riflettano):

pip install -e C:\repo\directory

9
Questo è stato abbastanza utile. Apparentemente, le modifiche locali devono essere sottoposte a commit git prima di poter essere installate tramite pip.
Ramhiser,

5
È vero: lo sta estraendo dal repository git (in .git), NON dalle copie funzionanti dei file.
Scott Stafford,

47

Puoi farlo direttamente con l'URL HTTPS in questo modo:

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

Questo funziona anche semplicemente aggiungendo quella riga nel requisito.txt in un progetto Django , per esempio.


19
Per i repository privati, tuttavia, ciò attiverà un prompt nome utente / password sulla console, che probabilmente non è quello che desideri.
Rascalking,

31

Funziona anche con Bitbucket :

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

Pip utilizzerà le chiavi SSH in questo caso.


15

La sintassi per il file dei requisiti è fornita qui:

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

Quindi, ad esempio, usa:

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

se si desidera che l'origine rimanga in posizione dopo l'installazione.

O semplicemente

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

se vuoi solo che sia installato.


L'URL per la sintassi del file dei requisiti è stato modificato. Il nuovo URL è: pip.pypa.io/en/latest/reference/…
sfera

15

Ho trovato molto più facile usare i token rispetto alle chiavi SSH. Non sono riuscito a trovare molta buona documentazione su questo, quindi ho trovato questa soluzione principalmente attraverso tentativi ed errori. Inoltre, l'installazione da pip e setuptools presentano alcune sottili differenze; ma in questo modo dovrebbe funzionare per entrambi.

GitHub non offre (attualmente, ad agosto 2016) un modo semplice per ottenere lo zip / tarball dei repository privati. Quindi devi puntare setuptools per dire a setuptools che stai puntando a un repository 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 paio di note qui:

  • Per i repository privati, devi autenticarti con GitHub; il modo più semplice che ho trovato è creare un token OAuth , rilasciarlo nel proprio ambiente e quindi includerlo nell'URL
  • Devi includere un numero di versione (eccolo qui 0) alla fine del link, anche se non esiste alcun pacchetto su PyPI . Questo deve essere un numero reale, non una parola.
  • Devi git+prefigurare per dire a setuptools che deve clonare il repository, piuttosto che puntare a una zip / tarball
  • version può essere un ramo, un tag o un hash di commit
  • È necessario fornire --process-dependency-linksse l'installazione da pip

1
La nota setup.pynon deve contenere dipendenze concrete, ma solo astratte. Questo sta specificando una dipendenza concreta da setup.py.
Jorge Leitao,

1
Con il rilascio di pip versione 19.0, l'opzione --process-dependency-links è obsoleta.
yardstick17

14

Ho escogitato un modo per "installare pip" automagicamente un repository privato GitLab che non richiede la richiesta di password. Questo approccio utilizza GitLab "Distribuisci chiavi" e un file di configurazione SSH, in modo da poter distribuire utilizzando chiavi diverse dalle chiavi SSH personali (nel mio caso, per l'uso da un 'bot). Forse qualcuno anima gentile può verificare usando GitHub.

Crea una nuova chiave SSH:

ssh-keygen -t rsa -C "GitLab_Robot_Deploy_Key"

Il file dovrebbe apparire come ~/.ssh/GitLab_Robot_Deploy_Keye ~/.ssh/GitLab_Robot_Deploy_Key.pub.

Copia e incolla il contenuto del ~/.ssh/GitLab_Robot_Deploy_Key.pubfile nella finestra di dialogo "Distribuisci chiavi" di GitLab.

Testare la nuova chiave di distribuzione

Il comando seguente indica a SSH di utilizzare la nuova chiave di distribuzione per impostare la connessione. In caso di successo, dovresti ricevere il messaggio: "Benvenuto in GitLab, UserName!"

ssh -T -i ~/.ssh/GitLab_Robot_Deploy_Key git@gitlab.mycorp.com

Crea il file di configurazione SSH

Quindi, utilizzare un editor per creare un ~/.ssh/configfile. Aggiungi i seguenti contenuti. Il valore "Host" può essere quello che vuoi (ricordalo, perché lo userai in seguito). HostName è l'URL dell'istanza di GitLab. IdentifyFile è il percorso del file della chiave SSH creato nel primo passaggio.

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

Puntare SSH sul file di configurazione

Oxyum ci ha dato la ricetta per l'utilizzo di pip con SSH:

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

Dobbiamo solo modificarlo un po 'per fare in modo che SSH utilizzi la nostra nuova chiave di distribuzione. Lo facciamo puntando SSH alla voce Host nel file di configurazione SSH. Sostituisci semplicemente "gitlab.mycorp.com" nel comando con il nome host che abbiamo usato nel file di configurazione SSH:

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

Il pacchetto ora dovrebbe essere installato senza alcuna richiesta di password.

Riferimento A
Riferimento B


7

Durante l'installazione da GitHub sono stato in grado di utilizzare:

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

Ma, poiché ho dovuto eseguire pip as sudo, le chiavi SSH non funzionavano più con GitHub e "git clone" non è riuscito su "Autorizzazione negata (chiave pubblica)". Usando git+httpsmi hai permesso di eseguire il comando come sudo e chiedi a GitHub di chiedermi il mio utente / password.

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

Gli altri account utente devono accedere al tuo progetto? In caso contrario, hai scoperto il suggerimento di nerdwaller?
Michael - Dov'è Clay Shirky il

7

È inoltre possibile installare una dipendenza del repository privato tramite git + https: //github.com / ... URL fornendo le credenziali di accesso (login e password o token di distribuzione) per arricciare con il .netrcfile:

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"

5

Se si desidera installare dipendenze da un file di requisiti all'interno di un server CI o simili, è possibile effettuare ciò:

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

Nel mio caso, ho usato GIT_USER=gitlab-ci-tokene GIT_PASS=${CI_JOB_TOKEN}.

Questo metodo ha un chiaro vantaggio. Hai un singolo file dei requisiti che contiene tutte le tue dipendenze.


3

Se non si desidera utilizzare SSH, è possibile aggiungere il nome utente e la password nell'URL HTTPS.

Il codice seguente presuppone che nella directory di lavoro sia presente un file chiamato "pass" che contiene la password.

export PASS=$(cat pass)
pip install git+https://<username>:$PASS@github.com/echweb/echweb-utils.git

Questo imprime la tua password in chiaro in qualche file di configurazione?
Michael - Dov'è Clay Shirky

0

La soluzione di oxyum è OK per questa risposta. Voglio solo sottolineare che è necessario fare attenzione se si sta eseguendo l'installazione sudopoiché anche le chiavi devono essere archiviate per il root (ad esempio /root/.ssh).

Quindi puoi digitare

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

6
Soluzione semplice: non installare con sudo. Usa invece la --userbandiera o un virtualenv.
nerdwaller,

0

Se hai la tua libreria / pacchetto su GitHub, GitLab, ecc., Devi aggiungere un tag per eseguire il commit con una versione concreta della libreria, ad esempio v2.0, quindi puoi installare il pacchetto:

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

Questo funziona per me. Altre soluzioni non hanno funzionato per me.


0

Ecco un metodo rapido che ha funzionato per me. Basta reimpostare il repository e installarlo dal proprio account GitHub con

pip install git+https://github.com/yourName/repoName

-1

Basta copiare il telecomando dal git clonecomando originale (o da git remote -v). Otterrai qualcosa del genere:

  • bitbucket: git+ssh://git@bitbucket.org:your_account/my_pro.git

  • GitHub: git+ssh://git@github.com:your_account/my_pro.git

Successivamente, è necessario sostituire :con /accanto al nome del dominio.

Quindi installa usando:

pip install git+ssh://git@bitbucket.org/your_account/my_pro.git

Cosa intendi con "copia comando git clone" ? Intendi "copia usando il comando 'git clone'" ? O "copia il comando 'git clone'" ? O qualcos'altro? (Rispondere modificando la risposta , non qui nei commenti (a seconda dei casi). Grazie in anticipo.).
Peter Mortensen,

-2

Puoi provare

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

senza ssh:.... Per me va bene.


OP ha richiesto github.
Karuhanga,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.