it-swarm.com.de

Kann mit pip ein Paket aus einem privaten github-Repository installiert werden?

Wie der Titel besagt, versuche ich, ein Python-Paket von einem privaten Github-Repo zu installieren. Für ein öffentliches Repository kann ich den folgenden Befehl ausgeben, 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 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 + ssh zu verwenden, in der Hoffnung, dass pip meinen öffentlichen ssh-Schlüssel zur Authentifizierung verwendet:

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

Weiß jemand, ob es überhaupt möglich ist, was ich erreichen möchte? Wenn ja, kannst du mir bitte sagen wie?

262
Adam J. Forster

Sie können git+ssh URI-Schema verwenden, aber Sie MÜSSEN den Benutzernamen festlegen:

pip install git+ssh://[email protected]/echweb/echweb-utils.git

Siehe [email protected] Teil in URI?

PS: Lesen Sie auch über deploy keys .

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

pip install -e URI#Egg=EggName

Remember: Ändern Sie das :-Zeichen, das git remote -v gedruckt wird, in ein /-Zeichen, bevor Sie die Adresse der Fernbedienung im pip-Befehl verwenden:

$ git remote -v
Origin  [email protected]: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
274
oxyum

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

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

BEARBEITEN: Moderner können Sie dies einfach tun (und der -e bedeutet, dass Sie keine Änderungen festlegen müssen, bevor sie reflektiert werden):

pip install -e C:\repo\directory
60
Scott Stafford

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

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

Dies funktioniert auch, wenn Sie beispielsweise diese Zeile in der Requirements.txt in einem Django-Projekt anhängen.

42
danius

Funktioniert auch mit Bitbucket:

pip install git+ssh://[email protected]/username/projectname.git

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

23
gnrfan

Die Syntax für die Anforderungsdatei ist hier angegeben: 

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

Also 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.

13
Rachel

Ich habe einen Weg gefunden, ein GitLab-Repository automatisch zu installieren, das kein Kennwort erfordert. Dieser Ansatz verwendet GitLab "Deploy Keys" und eine SSH-Konfigurationsdatei, sodass Sie die Bereitstellung auch mit anderen Schlüsseln als Ihren persönlichen SSH-Schlüsseln durchführen können (in meinem Fall für die Verwendung durch einen "Bot"). Vielleicht kann jemand freundliche Seele mit GitHub überprü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_Key und ~/.ssh/GitLab_Robot_Deploy_Key.pub angezeigt werden.

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

Testen Sie den neuen Bereitstellungsschlüssel

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

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

Erstellen Sie die SSH-Konfigurationsdatei

Verwenden Sie anschließend einen Editor, um eine ~/.ssh/config-Datei zu erstellen. Fügen Sie den folgenden Inhalt hinzu. Der 'Host'-Wert kann beliebig sein (erinnern Sie sich einfach daran, da Sie ihn später verwenden werden). Der Hostname ist die URL Ihrer GitLab-Instanz. Das 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

Verweisen Sie SSH auf die Config-Datei

@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 ihn nur ein wenig ändern, damit SSH unseren neuen Deploy-Schlüssel verwendet. Wir machen das, indem wir SSH auf den Host-Eintrag in der SSH-Konfigurationsdatei zeigen. Ersetzen Sie einfach "gitlab.mycorp.com" im Befehl durch den Hostnamen, den wir in der SSH-Konfigurationsdatei verwendet haben:

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

Das Paket sollte jetzt ohne Kennwortaufforderung installiert werden.

Referenz A
Referenz B

9
JS.

Ich fand es viel einfacher, Token als SSH-Schlüssel zu verwenden. Ich konnte nicht viel gute Dokumentation dazu finden, daher kam diese Lösung hauptsächlich durch Ausprobieren. Außerdem hat die Installation von Pip & Setuptools einige subtile Unterschiede. Aber dieser Weg sollte für beide funktionieren.

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

from setuptools import setup
import os
# get 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 Repos müssen Sie sich mit GitHub authentifizieren. Der einfachste Weg, den ich gefunden habe, ist das Erstellen eines Oauth-Token, das in Ihrer Umgebung abgelegt und dann mit der URL eingeschlossen wird
  • Sie müssen einige Versionsnummer (hier ist 0) am Ende des Links angeben, auch wenn auf PyPI kein Paket vorhanden ist. Dies muss eine tatsächliche Zahl sein, kein Wort.
  • Sie müssen mit git+ beginnen, um setuptools mitzuteilen, dass das Repo geklont werden soll, anstatt auf ein Zip/Tarball zu zeigen
  • version kann ein Zweig, ein Tag oder ein Commit-Hash sein
  • Sie müssen --process-dependency-links angeben, wenn Sie von pip installieren
8
Maximilian

Bei der Installation von github konnte ich Folgendes verwenden:

pip install git+ssh://[email protected]/<username>/<projectname>.git#Egg=<eggname>

ABER, da ich pip als Sudo laufen musste, funktionierten die SSH-Keys nicht mehr mit github. Mit git+https konnte 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>
7
jcarballo

Sie können auch eine private Repo-Abhängigkeit über git + https: //github.com/... URL installieren, indem Sie Anmeldeinformationen (Anmeldename und Kennwort oder Bereitstellungstoken) für curl mit der Datei .netrc 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"
5
ei-grad

Wenn Sie Abhängigkeiten aus der Anforderungsdatei auf einem CI-Server oder ähnlichem installieren möchten, 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 und GIT_PASS=${CI_JOB_TOKEN} verwendet.

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

1
AmirHossein

oxyums lösung ist für diese Antwort in Ordnung, ich möchte nur darauf hinweisen, dass Sie vorsichtig sein müssen, wenn Sie Sudo installieren, da die Schlüssel auch für root gespeichert werden müssen (z. B. /root/.ssh).

Dann kannst du tippen

Sudo pip install git+ssh://[email protected]/echweb/echweb-utils.git

0
Andres Romero

sie können es versuchen 

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

ohne ssh: ... das ist Arbeit für mich.

0
user2235670

Wenn Sie ssh nicht verwenden möchten, können Sie den Benutzernamen und das Kennwort in die https-URL eingeben.
Im folgenden Code wird davon ausgegangen, dass sich im Arbeitsverzeichnis eine Datei mit dem Namen "pass" befindet, die Ihr Kennwort enthält.

export PASS=$(cat pass)    
pip install git+https://<username>:[email protected]/echweb/echweb-utils.git
0
sam

Wenn Sie über eine eigene Bibliothek/ein eigenes Paket für github/gitlab usw. verfügen, müssen Sie ein Tag hinzufügen, das mit einer konkreten Version der Bibliothek festgeschrieben wird, z. v2.0 dann können Sie Ihr Paket installieren 

pip install git+ssh://link/name/[email protected]

Das funktioniert für mich. Andere Lösungen haben für mich nicht funktioniert.

0
zolty13