Ist es möglich, mit pip ein Paket aus einem privaten GitHub-Repository zu installieren?

349

Ich versuche, ein Python-Paket aus einem privaten GitHub-Repository zu installieren. Für ein öffentliches Repository kann ich den folgenden Befehl ausgeben, der einwandfrei funktioniert:

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

Wenn ich dies jedoch für ein privates Repository versuche:

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

Ich erhalte folgende Ausgabe:

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

Ich denke, das liegt daran, dass ich versuche, auf ein privates Repository zuzugreifen, ohne eine Authentifizierung bereitzustellen. Ich habe daher versucht, Git + zu verwenden, in der sshHoffnung, dass pip meinen öffentlichen SSH-Schlüssel zur Authentifizierung verwenden würde:

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

Dies ergibt die folgende Ausgabe:

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

Ist das, was ich versuche, überhaupt möglich? Wenn ja, wie kann ich das machen?

Adam J. Forster
quelle
2
Es ist sicherlich nicht die richtige Antwort, aber wenn Sie das Repo manuell klonen und dann pip auf localhost anstatt auf github zeigen, werden Sie darüber hinwegkommen, wenn Sie nur versuchen, produktiv zu sein.
Nmichaels
@nmicheals Das habe ich bisher getan, aber ich muss dies in Anforderungsdateien für die Bereitstellung auf vielen Websites mit separaten virtuellen Umgebungen ablegen.
Adam J. Forster
Nur um sicher zu gehen: Sie haben bereits die SSH-Schlüsselunterstützung für Github eingerichtet, oder? Wenn das definitiv nicht funktioniert ... Haben Sie versucht, git + git: // user: [email protected] / .... als URI zu verwenden?
Jason LeBrun
Versuchen Sie, eval $(ssh-agent); ssh-add ~/.ssh/github_id_rsapip-Installationen zu verwenden, und führen Sie sie anschließend aus, indem Sie pip.pypa.io/en/stable/reference/pip_install/#git
Darren Weber

Antworten:

375

Sie können das git+sshURI-Schema verwenden, müssen jedoch einen Benutzernamen festlegen:

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

Sehen Sie den git@Teil in der URI?

PS: Lesen Sie auch über Bereitstellungsschlüssel .

PPS: In meiner Installation funktioniert das URI-Schema "git + ssh" nur mit "bearbeitbaren" Anforderungen:

pip install -e URI#egg=EggName

Denken Sie daran : Ändern Sie das :Zeichen, das git remote -vin ein /Zeichen gedruckt wird, bevor Sie die Adresse der Fernbedienung im pipBefehl verwenden:

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

Wenn Sie vergessen, erhalten Sie folgende Fehlermeldung:

ssh: Could not resolve hostname github.com:echweb:
         nodename nor servname provided, or not known
Oxyum
quelle
3
Danke dafür, mir hat gerade der git @ Teil gefehlt. Übrigens hat der Befehl 'pip install git + ssh: //[email protected]/echweb/echweb-utils.git' funktioniert, ich brauchte den Schalter -e nicht.
Adam J. Forster
2
Sie können auch eine .ssh / config-Datei verwenden, um den richtigen Benutzernamen festzulegen
Stefano
2
Früher hat das bei mir funktioniert, jetzt aber nicht mehr. Ich verwende sogar das richtige git+ssh://[email protected]/echweb/echweb-utils.gitSchema in meiner Anforderungsdatei. Ich habe hier eine neue Frage geöffnet: stackoverflow.com/questions/18883430/… . Jede Hilfe wäre großartig.
Robeezy
2
Perfekt. Auch git+ssh://[email protected]/echweb/echweb-utils.gitin requirements.txtWerke zu stecken , was großartig ist.
Avindra Goolcharan
2
Wenn Sie von einem bestimmten Zweig installieren möchten:pip install git+ssh://[email protected]/echweb/echweb-utils.git@branch-name
Guilherme Beltramini
73

Wenn Sie das private Repository lokal geklont haben, können Sie als zusätzliche Technik Folgendes tun:

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

Moderner können Sie dies einfach tun (und das -ebedeutet, dass Sie keine Änderungen vornehmen müssen, bevor sie reflektiert werden):

pip install -e C:\repo\directory
Scott Stafford
quelle
9
Das war sehr hilfreich. Anscheinend müssen lokale Änderungen git-commit werden, bevor sie über pip installiert werden können.
Ramhiser
5
Das stimmt - es wird aus dem Git-Repository (in .git) gezogen, NICHT aus den Arbeitskopien der Dateien.
Scott Stafford
47

Sie können dies direkt mit der HTTPS-URL wie folgt tun:

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

Dies funktioniert beispielsweise auch nur durch Anhängen dieser Zeile in der Datei require.txt in einem Django- Projekt.

Danius
quelle
19
Bei privaten Repos wird jedoch eine Eingabeaufforderung für Benutzername / Kennwort auf der Konsole ausgelöst, was wahrscheinlich nicht Ihren Wünschen entspricht.
Rascalking
31

Es funktioniert auch mit Bitbucket :

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

Pip verwendet in diesem Fall Ihre SSH-Schlüssel.

gnrfan
quelle
15

Die Syntax für die Anforderungsdatei finden Sie hier:

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

Verwenden Sie zum Beispiel:

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

Wenn Sie möchten, dass die Quelle nach der Installation erhalten bleibt.

Oder nur

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

wenn Sie nur möchten, dass es installiert wird.

Rachel
quelle
Die URL für die Syntax der Anforderungsdatei wurde geändert. Die neue URL lautet: pip.pypa.io/en/latest/reference/…
Sphäre
15

Ich fand es viel einfacher, Token als SSH-Schlüssel zu verwenden. Ich konnte nicht viel gute Dokumentation dazu finden, daher bin ich auf diese Lösung hauptsächlich durch Ausprobieren gestoßen. Darüber hinaus weisen die Installation von Pip- und Setuptools einige subtile Unterschiede auf. aber dieser Weg sollte für beide funktionieren.

GitHub bietet (derzeit ab August 2016) keine einfache Möglichkeit, den Zip / Tarball von privaten Repositories abzurufen. Sie müssen also auf setuptools zeigen, um setuptools mitzuteilen, dass Sie auf ein Git-Repository verweisen:

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)
        ]

Ein paar Anmerkungen hier:

  • Für private Repositorys müssen Sie sich bei GitHub authentifizieren. Der einfachste Weg, den ich gefunden habe, ist das Erstellen einer OAuth Token , dieses in Ihrer Umgebung und es dann in die URL aufzunehmen
  • Sie müssen am Ende des Links eine Versionsnummer (hier 0) einfügen , auch wenn auf PyPI kein Paket vorhanden ist . Dies muss eine tatsächliche Zahl sein, kein Wort.
  • Sie müssen ein Vorwort verwenden git+, um setuptools mitzuteilen, dass das Repository geklont werden soll, anstatt auf einen Zip / Tarball zu zeigen
  • version kann ein Zweig, ein Tag oder ein Commit-Hash sein
  • Sie müssen liefern, --process-dependency-linkswenn Sie von pip installieren
Maximilian
quelle
1
Hinweis setup.pysollte keine konkreten Abhängigkeiten enthalten, sondern nur abstrakte. Dies gibt eine konkrete Abhängigkeit von an setup.py.
Jorge Leitao
1
Mit der Veröffentlichung von pip Version 19.0 ist die Option --process-dependency-links veraltet.
Maßstab
14

Ich habe eine Möglichkeit gefunden, ein privates GitLab-Repository, für das keine Kennwortabfrage erforderlich ist, automatisch per Pip-Installation zu installieren. Dieser Ansatz verwendet GitLab "Deploy Keys" und eine SSH-Konfigurationsdatei, sodass Sie andere Schlüssel als Ihre persönlichen SSH-Schlüssel bereitstellen können (in meinem Fall zur Verwendung durch einen Bot). Vielleicht kann eine freundliche Seele mit GitHub nachprüfen.

Erstellen Sie einen neuen SSH-Schlüssel:

ssh-keygen -t rsa -C "GitLab_Robot_Deploy_Key"

Die Datei sollte als ~/.ssh/GitLab_Robot_Deploy_Keyund angezeigt werden~/.ssh/GitLab_Robot_Deploy_Key.pub .

Kopieren Sie den Inhalt der ~/.ssh/GitLab_Robot_Deploy_Key.pubDatei und fügen Sie ihn in das GitLab-Dialogfeld "Schlüssel bereitstellen" ein.

Testen Sie den neuen Bereitstellungsschlüssel

Der folgende Befehl weist SSH an, Ihren neuen Bereitstellungsschlüssel zum Einrichten der Verbindung zu verwenden. Bei Erfolg sollten Sie die Meldung erhalten: "Willkommen bei GitLab, Benutzername!"

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

Erstellen Sie die SSH-Konfigurationsdatei

Verwenden Sie als Nächstes einen Editor, um eine ~/.ssh/configDatei zu erstellen . Fügen Sie den folgenden Inhalt hinzu. Der 'Host'-Wert kann beliebig sein (denken Sie daran, da Sie ihn später verwenden werden). Der Hostname ist die URL zu Ihrer GitLab-Instanz. Die IdentifyFile ist der Pfad zu der SSH-Schlüsseldatei, die Sie im ersten Schritt erstellt haben.

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

Zeigen Sie mit SSH auf die Konfigurationsdatei

Oxyum gab uns das Rezept für die Verwendung von Pip mit SSH:

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

Wir müssen es nur ein wenig ändern, damit SSH unseren neuen Bereitstellungsschlüssel verwendet. Dazu zeigen wir SSH auf den Host-Eintrag in der SSH-Konfigurationsdatei. Ersetzen Sie einfach die 'gitlab.mycorp.com' im Befehl durch den Hostnamen, den wir in der SSH-Konfigurationsdatei verwendet haben:

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

Das Paket sollte jetzt ohne Eingabeaufforderung installiert werden.

Referenz A
Referenz B.

JS.
quelle
7

Bei der Installation von GitHub konnte ich Folgendes verwenden:

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

Aber da ich pip as ausführen musste, sudofunktionierten die SSH-Schlüssel nicht mehr mit GitHub und "git clone" schlug bei "Permission verweigert (publickey)" fehl. Mit git+httpskonnte ich den Befehl als sudo ausführen und GitHub mich nach meinem Benutzer / Passwort fragen lassen.

sudo pip install git+https://github.com/<username>/<projectname>.git#egg=<eggname>
jcarballo
quelle
Müssen andere Benutzerkonten auf Ihr Projekt zugreifen? Wenn nicht, haben Sie den Vorschlag von Nerdwaller
Michael - Wo ist Clay Shirky
7

Sie können eine private Repository-Abhängigkeit auch über die URL git + https: //github.com / ... installieren, indem Sie Anmeldeinformationen (Login und Kennwort oder Bereitstellungstoken) für Curl mit der .netrcDatei angeben :

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
quelle
5

Wenn Sie Abhängigkeiten von einer Anforderungsdatei auf einem CI- Server oder ähnlichem installieren möchten , haben Sie folgende Möglichkeiten:

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

In meinem Fall habe ich GIT_USER=gitlab-ci-tokenund verwendet GIT_PASS=${CI_JOB_TOKEN}.

Diese Methode hat einen klaren Vorteil. Sie haben eine einzige Anforderungsdatei, die alle Ihre Abhängigkeiten enthält.

AmirHossein
quelle
3

Wenn Sie SSH nicht verwenden möchten, können Sie den Benutzernamen und das Kennwort in die HTTPS-URL einfügen.

Der folgende Code setzt voraus, dass Sie eine Datei mit dem Namen "pass" im Arbeitsverzeichnis haben, die Ihr Passwort enthält.

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

Die Lösung von Oxyum ist für diese Antwort in Ordnung. Ich möchte nur darauf hinweisen, dass Sie vorsichtig sein müssen, wenn Sie mit installieren, sudoda die Schlüssel auch für root gespeichert werden müssen (zum Beispiel /root/.ssh).

Dann können Sie tippen

sudo pip install git+ssh://git@github.com/echweb/echweb-utils.git
Andres Romero
quelle
6
Einfache Lösung: Nicht mit sudo installieren. Verwenden Sie stattdessen das --userFlag oder eine virtuelle Umgebung.
Nerdwaller
0

Wenn Sie eine eigene Bibliothek / ein eigenes Paket auf GitHub, GitLab usw. haben, müssen Sie ein Tag hinzufügen, um eine konkrete Version der Bibliothek, z. B. v2.0, festzuschreiben. Anschließend können Sie Ihr Paket installieren:

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

Das funktioniert bei mir. Andere Lösungen haben bei mir nicht funktioniert.

zolty13
quelle
0

Hier ist eine schnelle Methode, die für mich funktioniert hat. Geben Sie das Repo einfach auf und installieren Sie es von Ihrem eigenen GitHub-Konto mit

pip install git+https://github.com/yourName/repoName
Schrödingers Kodierer
quelle
-1

Kopieren Sie einfach die Fernbedienung vom ursprünglichen git cloneBefehl (oder von git remote -v). Sie werden so etwas bekommen:

Als nächstes müssen Sie ersetzen :mit /neben dem Domain - Namen.

Installieren Sie also mit:

pip install git+ssh://git@bitbucket.org/your_account/my_pro.git
Mohideen bin Mohammed
quelle
Was meinst du mit "git clone Befehl kopieren" ? Meinen Sie "Kopieren mit dem Befehl 'git clone'" ? Oder "Kopieren Sie den Befehl 'git clone'" ? Oder etwas anderes? (Bitte antworten Sie, indem Sie Ihre Antwort bearbeiten , nicht hier in den Kommentaren (falls zutreffend). Vielen Dank im Voraus.)
Peter Mortensen
-2

Sie können es versuchen

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

ohne ssh:.... Das ist für mich in Ordnung.

user2235670
quelle
OP hat Github angefordert.
Karuhanga