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?

28voto

JS. Punkte 12845

Ich habe eine Möglichkeit gefunden, ein privates GitLab-Repository automatisch zu installieren, ohne dass eine Passwortabfrage erforderlich ist. Dieser Ansatz verwendet GitLab "Deploy Keys" und eine SSH-Konfigurationsdatei, so dass Sie mit anderen Schlüsseln als Ihren persönlichen SSH-Schlüsseln bereitstellen können (in meinem Fall für die Verwendung durch einen 'Bot). Vielleicht kann jemand freundliche Seele mit GitHub zu überprüfen.

Erstellen Sie einen neuen SSH-Schlüssel:

ssh-keygen -t rsa -C "GitLab_Robot_Deploy_Key"

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

Kopieren und fügen Sie den Inhalt der Datei ~/.ssh/GitLab_Robot_Deploy_Key.pub Datei in das GitLab-Dialogfeld "Deploy-Schlüssel" ein.

Testen Sie den neuen Verteilungsschlüssel

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

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

Erstellen Sie die SSH-Konfigurationsdatei

Als nächstes erstellen Sie mit einem Editor eine ~/.ssh/config Datei. Fügen Sie den folgenden Inhalt hinzu. Der Wert "Host" kann ein beliebiger Wert sein (merken Sie ihn sich einfach, denn Sie werden ihn später verwenden). Der HostName ist die URL zu Ihrer GitLab-Instanz. 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

SSH auf die Konfigurationsdatei verweisen

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

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

Wir müssen sie nur ein wenig ändern, damit SSH unseren neuen Deploy-Schlüssel verwendet. Dazu verweisen wir SSH auf den Host-Eintrag in der SSH-Konfigurationsdatei. Ersetzen Sie einfach das "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 nun ohne Passwortabfrage installiert werden.

Referenz A
Referenz B

21voto

AmirHossein Punkte 1080

Wenn Sie Abhängigkeiten aus einer Anforderungsdatei innerhalb einer CI Server oder ähnlichem, können Sie dies tun:

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-token y GIT_PASS=${CI_JOB_TOKEN} .

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

1 Stimmen

Ich frage mich, ob ich das gleiche in Github tun kann, wie Github hat GITHUB_TOKEN als Standard-Token zu jedem Repo genau wie in Gitlab CI_JOB_TOKEN angehängt, aber ich bin nicht sicher, der Benutzer in Github?

19voto

pcko1 Punkte 539

Mein Fall war etwas komplizierter als die meisten der in den Antworten beschriebenen Fälle. Ich war der Besitzer von zwei privaten Repositories repo_A y repo_B in einer Github-Organisation und musste pip install repo_A während der python Untests von repo_B , als eine Github-Aktion .

Die Schritte, die ich zur Lösung dieser Aufgabe befolgt habe:

  • Erstellt eine Persönliches Zugangstoken für mein Konto. Was die Berechtigungen betrifft, so musste ich nur die Standardberechtigungen beibehalten, d. h. repo - Volle Kontrolle über private Repositories .
  • Erstellt eine Repository-Geheimnis unter repo_B ein, fügte dort mein persönliches Zugriffstoken ein und nannte es PERSONAL_ACCESS_TOKEN . Dies war wichtig denn anders als bei der von der Kommission vorgeschlagenen Lösung Jamie Ich musste mein kostbares rohes persönliches Zugangs-Token nicht explizit in der Github-Aktion preisgeben. .yml Datei.
  • Endlich, pip install das Paket aus dem Quellcode über HTTPS ( no SSH) wie folgt:

    export PERSONAL_ACCESS_TOKEN=${{ secrets.PERSONAL_ACCESS_TOKEN }}

    pip install git+https://${PERSONAL_ACCESS_TOKEN}@github.com/MY_ORG_NAME/repo_A.git

3 Stimmen

Hätten SSH-Schlüssel auch in diesem Fall funktioniert?

1 Stimmen

@MarcelWilson Ich würde erwarten, dass es funktioniert. Die Verwendung eines Zugangstokens anstelle von SSH-Schlüsseln hat jedoch den zusätzlichen Vorteil, dass man die Zugriffsstufe des Tokens anpassen kann. Dies könnte bei der Verwendung von Github sehr nützlich sein actions (Workflows) zu pip install ein privates Repository während des Untestings eines anderen gemeinsam genutzten Repositorys, bei dem Sie Ihre SSH-Schlüssel nicht mit anderen teilen möchten, nicht einmal als Github secret . Tl;dr, Zugangstoken sind weniger freizügig, soweit ich das beurteilen kann.

0 Stimmen

@MarcelWilson - was pcko1 sagte, ist für mich der Hauptvorteil von Token, dass ich Token nach Bedarf erstellen und zerstören kann, ohne meine persönlichen Entwicklungseinstellungen zu verändern

18voto

Jamie Punkte 2061

Wenn Sie dies z. B. in einem Einzeiler in der Befehlszeile erledigen müssen, ist dies ebenfalls möglich. Ich konnte dies für die Bereitstellung auf Google Colab tun:

  1. Erstellen Sie ein persönliches Zugangs-Token: https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token
  2. Laufen: pip install git+https://<PERSONAL ACCESS TOKEN>@github.com/<USERNAME>/<REPOSITORY>.git

1 Stimmen

Sie können einen Kommentar hinzufügen, in dem Sie darauf hinweisen, dass Ihr Zugriffstoken im Klartext vorliegt und für jeden zugänglich ist, der die Pip-Konfiguration lesen kann.

0 Stimmen

Wenn ich so darüber nachdenke, ist Ihre Antwort auch eine Art Duplikat von diese von vor 4 Jahren.

18voto

Rachel Punkte 2707

Die Syntax für die Anforderungsdatei ist hier angegeben:

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

Verwenden Sie also zum Beispiel:

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

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

Oder einfach

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

wenn es nur installiert werden soll.

0 Stimmen

Die URL für die Syntax der Anforderungsdatei hat sich geändert. Die neue URL lautet: pip.pypa.io/de/latest/reference/

0 Stimmen

Ist die egg eine harte Anforderung? Ich versuche, über ssh ein privates Python-Paket mit einem Deploy-Schlüssel zu installieren, erhalte aber immer wieder eine Antwort von ERROR: Command errored out with exit status 128 .

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