Czy można użyć pip do zainstalowania pakietu z prywatnego repozytorium GitHub?

349

Próbuję zainstalować pakiet Python z prywatnego repozytorium GitHub. W przypadku publicznego repozytorium mogę wydać następujące polecenie, które działa dobrze:

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

Jeśli jednak spróbuję tego dla prywatnego repozytorium:

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

Otrzymuję następujące dane wyjściowe:

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

Chyba dlatego, że próbuję uzyskać dostęp do prywatnego repozytorium bez uwierzytelnienia. Dlatego próbowałem użyć Git +, sshmając nadzieję, że pip użyje mojego klucza publicznego SSH do uwierzytelnienia:

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

Daje to następujące dane wyjściowe:

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

Czy to, co próbuję osiągnąć, jest w ogóle możliwe? Jeśli tak, jak mogę to zrobić?

Adam J. Forster
źródło
2
Z pewnością nie jest to poprawna odpowiedź, ale ręczne klonowanie repozytorium, a następnie wskazanie pip na localhost zamiast na github da ci radę, jeśli tylko próbujesz być produktywny.
nmichaels
@nmicheals To właśnie zrobiłem do tej pory, ale muszę umieścić to w plikach wymagań do wdrożenia na wielu stronach internetowych, wszystkie z osobnymi virtualenvs.
Adam J. Forster
Dla pewności: już skonfigurowałeś obsługę klucza ssh w github, prawda? Jeśli to zdecydowanie nie działa .... Czy próbowałeś użyć git + git: // użytkownik: [email protected] / .... jako URI?
Jason LeBrun
Spróbuj użyć, eval $(ssh-agent); ssh-add ~/.ssh/github_id_rsaa następnie uruchom instalacje pip, postępując zgodnie z pip.pypa.io/en/stable/reference/pip_install/#git
Darren Weber

Odpowiedzi:

375

Możesz użyć git+sshschematu URI, ale musisz ustawić nazwę użytkownika:

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

Czy widzisz tę git@część w URI?

PS: Przeczytaj także o wdrażaniu kluczy .

PPS: W mojej instalacji schemat URI „git + ssh” działa tylko z wymaganiami „edytowalnymi”:

pip install -e URI#egg=EggName

Pamiętaj : zmień :znak git remote -vdrukowany na /znak przed użyciem adresu pilota w pippoleceniu:

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

Jeśli zapomnisz, pojawi się ten błąd:

ssh: Could not resolve hostname github.com:echweb:
         nodename nor servname provided, or not known
oksy
źródło
3
Dzięki za to, właśnie brakowało mi części git @. Nawiasem mówiąc, polecenie „pip install git + ssh: //[email protected]/echweb/echweb-utils.git” zadziałało, nie wymagałem przełącznika -e.
Adam J. Forster
2
możesz także użyć pliku .ssh / config, aby ustawić prawidłową nazwę użytkownika
Stefano,
2
Kiedyś to działało dla mnie, ale teraz nie, używam nawet odpowiedniego git+ssh://[email protected]/echweb/echweb-utils.gitschematu w pliku wymagań. Otworzyłam nowe pytanie tutaj: stackoverflow.com/questions/18883430/... . Każda pomoc byłaby świetna.
Robeezy,
2
Doskonały. Wkładanie git+ssh://[email protected]/echweb/echweb-utils.gitw requirements.txtprace też jest niesamowite.
Avindra Goolcharan
2
Jeśli chcesz zainstalować z określonego oddziału:pip install git+ssh://[email protected]/echweb/echweb-utils.git@branch-name
Guilherme Beltramini
73

Jako dodatkową technikę, jeśli masz prywatne klonowane lokalnie repozytorium, możesz:

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

Bardziej nowoczesnie, możesz to po prostu zrobić (a -eto oznacza, że ​​nie musisz zatwierdzać zmian, zanim zostaną odzwierciedlone):

pip install -e C:\repo\directory
Scott Stafford
źródło
9
To było bardzo pomocne. Najwyraźniej lokalne zmiany muszą zostać zatwierdzone przez git, zanim będą mogły zostać zainstalowane przez pip.
ramhiser
5
To prawda - pobiera ją z repozytorium git (w .git), a NIE z kopii roboczych plików.
Scott Stafford
47

Możesz to zrobić bezpośrednio za pomocą adresu URL HTTPS:

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

Działa to również po prostu dodając tę ​​linię na przykład w pliku wymagania.txt w projekcie Django .

Danius
źródło
19
Jednak w przypadku prywatnych repozytoriów spowoduje to wyświetlenie w konsoli monitu o podanie nazwy użytkownika / hasła, co prawdopodobnie nie jest tym, czego chcesz.
rascalking 27.07.17
31

Działa również z Bitbucket :

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

W tym przypadku Pip użyje kluczy SSH.

gnrfan
źródło
15

Składnia pliku wymagań znajduje się tutaj:

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

Na przykład użyj:

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

jeśli chcesz, aby źródło pozostało po instalacji.

Lub tylko

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

jeśli chcesz go tylko zainstalować.

Rachel
źródło
Adres URL składni pliku wymagań został zmieniony. Nowy adres URL to: pip.pypa.io/en/latest/reference/…
kula
15

Uznałem, że łatwiej jest używać tokenów niż kluczy SSH. Nie mogłem znaleźć dużo dobrej dokumentacji na ten temat, więc natknąłem się na to rozwiązanie głównie metodą prób i błędów. Ponadto instalacja z pip i setuptools ma pewne subtelne różnice; ale ten sposób powinien działać dla obu.

GitHub nie oferuje (obecnie od sierpnia 2016 r.) Łatwego sposobu na uzyskanie zip / tarball prywatnych repozytoriów. Musisz więc wskazać setuptools, aby powiedzieć setuptools, że wskazujesz repozytorium 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)
        ]

Kilka uwag tutaj:

  • W przypadku prywatnych repozytoriów musisz uwierzytelnić się w GitHub; najprostszym sposobem, jaki znalazłem, jest utworzenie tokena OAuth , upuszczenie go w swoim środowisku, a następnie dołączenie go do adresu URL
  • Trzeba podać jakiś numer wersji (Oto 0) na końcu łącza, nawet jeśli nie jest to dowolny pakiet na PyPI . To musi być liczba rzeczywista, a nie słowo.
  • Musisz git+poprzedzić to, aby powiedzieć setuptools, że ma sklonować repozytorium, zamiast wskazywać na zip / tarball
  • version może być odgałęzieniem, znacznikiem lub skrótem zatwierdzenia
  • Musisz dostarczyć, --process-dependency-linksjeśli instalujesz z pip
Maksymilian
źródło
1
Uwaga setup.pynie powinna zawierać konkretnych zależności, tylko abstrakcyjne. To określa konkretną zależność setup.py.
Jorge Leitao,
1
Wraz z wydaniem PIP w wersji 19.0 opcja --process-dependence-links jest przestarzała.
miernik17
14

Wymyśliłem sposób na automatyczne „pipowanie” instalacji prywatnego repozytorium GitLab, które nie wymaga podania hasła. Podejście to wykorzystuje GitLab „Wdróż klucze” i plik konfiguracyjny SSH, więc możesz wdrożyć, używając kluczy innych niż osobiste klucze SSH (w moim przypadku do użytku przez „bota”). Być może ktoś miły dusza może zweryfikować za pomocą GitHub.

Utwórz nowy klucz SSH:

ssh-keygen -t rsa -C "GitLab_Robot_Deploy_Key"

Plik powinien pojawić się jako ~/.ssh/GitLab_Robot_Deploy_Keyi ~/.ssh/GitLab_Robot_Deploy_Key.pub.

Skopiuj i wklej zawartość ~/.ssh/GitLab_Robot_Deploy_Key.pubpliku do okna dialogowego „Wdróż klucze” GitLab.

Przetestuj nowy klucz wdrażania

Następujące polecenie informuje SSH, aby użył nowego klucza wdrażania do skonfigurowania połączenia. Po sukcesie powinieneś otrzymać komunikat: „Witamy w GitLab, nazwa użytkownika!”

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

Utwórz plik konfiguracyjny SSH

Następnie użyj edytora, aby utworzyć ~/.ssh/configplik. Dodaj następującą zawartość. Wartość „Host” może być dowolna (pamiętaj o niej, ponieważ będziesz jej później używać). Nazwa hosta to adres URL Twojej instancji GitLab. IdentifyFile to ścieżka do pliku kluczy SSH utworzonego w pierwszym kroku.

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

Wskaż SSH na plik konfiguracyjny

oxyum dał nam przepis na używanie pipa z SSH:

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

Musimy go tylko trochę zmodyfikować, aby SSH używał naszego nowego klucza do wdrażania. Robimy to, wskazując SSH na pozycję Host w pliku konfiguracyjnym SSH. Po prostu zamień „gitlab.mycorp.com” w poleceniu na nazwę hosta, której użyliśmy w pliku konfiguracyjnym SSH:

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

Pakiet powinien teraz zainstalować się bez pytania o hasło.

Odniesienie A
Odniesienie B

JS.
źródło
7

Podczas instalacji z GitHub mogłem używać:

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

Ale ponieważ musiałem uruchomić pip sudo, klucze SSH nie działały już z GitHub, a „git clone” zawiódł w przypadku „Odmowa dostępu (publickey)”. Użycie git+httpspozwoliło mi uruchomić polecenie jako sudo i poprosić GitHub o podanie mojego użytkownika / hasła.

sudo pip install git+https://github.com/<username>/<projectname>.git#egg=<eggname>
jcarballo
źródło
Czy inne konta użytkowników muszą mieć dostęp do twojego projektu? Jeśli nie, czy odkryłeś sugestię nerdwallera?
Michael - Where's Clay Shirky
7

Możesz także zainstalować zależność prywatnego repozytorium za pomocą git + https: //github.com / ... URL, podając dane logowania (login i hasło lub wdróż token) do zwijania się z .netrcplikiem:

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
źródło
5

Jeśli chcesz zainstalować zależności z pliku wymagań na serwerze CI lub w podobny sposób, możesz to zrobić:

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

W moim przypadku użyłem GIT_USER=gitlab-ci-tokeni GIT_PASS=${CI_JOB_TOKEN}.

Ta metoda ma wyraźną zaletę. Masz jeden plik wymagań, który zawiera wszystkie twoje zależności.

AmirHossein
źródło
3

Jeśli nie chcesz korzystać z SSH, możesz dodać nazwę użytkownika i hasło w adresie URL HTTPS.

Poniższy kod zakłada, że ​​masz plik o nazwie „pass” w katalogu roboczym, który zawiera twoje hasło.

export PASS=$(cat pass)
pip install git+https://<username>:$PASS@github.com/echweb/echweb-utils.git
sam
źródło
0

rozwiązanie oxyum jest w porządku dla tej odpowiedzi. Chcę tylko zaznaczyć, że musisz zachować ostrożność, jeśli instalujesz za pomocą, sudoponieważ klucze muszą być również przechowywane dla roota (na przykład /root/.ssh).

Następnie możesz wpisać

sudo pip install git+ssh://git@github.com/echweb/echweb-utils.git
Andres Romero
źródło
6
Proste rozwiązanie: nie instaluj z sudo. Zamiast tego użyj --userflagi lub virtualenv.
nerdwaller
0

Jeśli masz własną bibliotekę / pakiet na GitHub, GitLab itp., Musisz dodać znacznik, aby zatwierdzić konkretną wersję biblioteki, na przykład v2.0, a następnie możesz zainstalować pakiet:

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

To działa dla mnie. Inne rozwiązania nie działały dla mnie.

zolty13
źródło
0

Oto szybka metoda, która zadziałała dla mnie. Po prostu rozwidlaj repozytorium i zainstaluj je z własnego konta GitHub

pip install git+https://github.com/yourName/repoName
Koder Schrödingera
źródło
-1

Wystarczy skopiować pilota z oryginalnego git clonepolecenia (lub z git remote -v). Otrzymasz coś takiego:

Następnie trzeba wymienić :z /obok nazwy domeny.

Więc zainstaluj używając:

pip install git+ssh://git@bitbucket.org/your_account/my_pro.git
Mohideen bin Mohammed
źródło
Co rozumiesz przez „kopiowanie polecenia klonowania git” ? Czy masz na myśli „kopiuj za pomocą polecenia„ git clone ” ? Lub „skopiuj polecenie„ git clone ” ? Albo coś innego? ( Odpowiedz , edytując odpowiedź , a nie tutaj w komentarzach (odpowiednio). Z góry dziękuję.)
Peter Mortensen,
-2

Możesz spróbować

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

bez ssh:.... To działa dla mnie.

użytkownik2235670
źródło
OP poprosił o github.
Karuhanga