564 Stimmen

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

Ich versuche, ein Python-Paket aus einem privaten GitHub-Repository zu installieren. Für ein öffentliches Repository kann ich den folgenden Befehl eingeben, der gut 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 die 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 vermute, das liegt daran, dass ich versuche, auf ein privates Repository zuzugreifen, ohne mich zu authentifizieren. Ich habe daher versucht, Git + zu verwenden. ssh in der Hoffnung, 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 zu erreichen versuche, überhaupt möglich? Wenn ja, wie kann ich es erreichen?

4 Stimmen

Es ist sicherlich nicht die richtige Antwort, aber wenn Sie das Projektarchiv manuell klonen und pip auf localhost statt auf github verweisen, können Sie das Problem umgehen, wenn Sie nur versuchen, produktiv zu sein.

3 Stimmen

@nmicheals Das ist, was ich bisher getan habe, aber ich muss dies in Anforderungsdateien für die Bereitstellung über viele Websites alle mit separaten virtualenvs setzen.

0 Stimmen

Nur um sicher zu gehen: Sie haben bereits die Unterstützung für SSH-Schlüssel auf Github eingerichtet, richtig? Wenn das definitiv nicht funktioniert.... Haben Sie versucht, git+git://user:pass@github.com/.... als URI zu verwenden?

609voto

oxyum Punkte 5767

Sie können die git+ssh URI-Schema, aber Sie muss einen Benutzernamen festlegen. Beachten Sie die git@ Teil in der URI:

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

Lesen Sie auch über Schlüssel bereitstellen .

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

pip install -e URI#egg=EggName

Erinnern Sie sich an : Ändern Sie die : Zeichen, das git remote -v druckt auf eine / Zeichen, bevor Sie die Adresse der Fernbedienung in der pip Befehl:

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

Wenn Sie das vergessen, erhalten Sie diese Fehlermeldung:

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

7 Stimmen

Danke dafür, ich hatte nur den git@-Teil übersehen. Übrigens hat der Befehl "pip install git+ssh://git@github.com/echweb/echweb-utils.git" funktioniert, ich habe den Schalter -e nicht benötigt.

4 Stimmen

Sie können auch eine .ssh/config-Datei verwenden, um den richtigen Benutzernamen festzulegen

3 Stimmen

Früher hat das bei mir funktioniert, aber jetzt nicht mehr, ich verwende sogar die richtige git+ssh://git@github.com/echweb/echweb-utils.git Schema in meiner Anforderungsdatei. Ich habe hier eine neue Frage eröffnet: stackoverflow.com/questions/18883430/ . Jede Hilfe wäre großartig.

100voto

Scott Stafford Punkte 41787

Wenn Sie das private Repository lokal geklont haben, können Sie eine zusätzliche Technik anwenden:

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

Auf modernere Weise können Sie dies einfach tun (und die -e bedeutet, dass Sie die Änderungen nicht erst festschreiben müssen, bevor sie übernommen werden):

pip install -e C:\repo\directory

15 Stimmen

Das war sehr hilfreich. Anscheinend müssen lokale Änderungen mit git-commit übertragen werden, bevor sie über pip installiert werden können.

7 Stimmen

Das stimmt - es wird aus dem Git-Repository (in .git) geholt, NICHT aus den Arbeitskopien der Dateien.

56voto

danius Punkte 2479

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

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

Das funktioniert auch, indem man die Zeile in der requirements.txt in einer Django Projekt, zum Beispiel.

68 Stimmen

Bei privaten Repos führt dies jedoch zu einer Aufforderung zur Eingabe von Benutzername und Kennwort auf der Konsole, was wahrscheinlich nicht erwünscht ist.

44voto

gnrfan Punkte 18511

Es funktioniert auch mit Bitbucket :

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

Pip wird in diesem Fall Ihre SSH-Schlüssel verwenden.

34voto

Maximilian Punkte 6208

Ich fand es viel einfacher, Token als SSH-Schlüssel zu verwenden. Ich konnte nicht viel gute Dokumentation dazu finden, also bin ich hauptsächlich durch Versuch und Irrtum auf diese Lösung gestoßen. Außerdem haben die Installationen von pip und setuptools einige feine Unterschiede, aber dieser Weg sollte für beide funktionieren.

GitHub bietet (derzeit, Stand August 2016) keine einfache Möglichkeit, das Zip/Tarball privater Repositories zu erhalten. Sie müssen also setuptools mitteilen, 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 dazu:

  • Für private Repositories müssen Sie sich bei GitHub authentifizieren; der einfachste Weg, den ich gefunden habe, ist die Erstellung eines OAuth Token, legen Sie es in Ihrer Umgebung ab und fügen Sie es dann in die URL
  • Sie müssen Folgendes einschließen einige Versionsnummer (hier ist 0 ) am Ende des Links, auch wenn es kein Paket auf PyPI . Es muss sich um eine konkrete Zahl handeln, nicht um ein Wort.
  • Sie müssen einleiten mit git+ um setuptools mitzuteilen, dass das Repository geklont werden soll, anstatt auf ein Zip/Tarball zu verweisen
  • version kann ein Zweig, ein Tag oder ein Commit-Hash sein
  • Sie müssen Folgendes liefern --process-dependency-links wenn Sie von pip installieren

1 Stimmen

Nota setup.py sollte keine konkreten, sondern nur abstrakte Abhängigkeiten enthalten. Dies ist die Angabe einer konkreten Abhängigkeit von setup.py .

2 Stimmen

Mit der Veröffentlichung von pip Version 19.0 ist die Option --process-dependency-links veraltet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X