Özel GitHub deposundan bir paket yüklemek için pip kullanmak mümkün müdür?


349

Özel bir GitHub deposundan bir Python paketi yüklemeye çalışıyorum. Halka açık bir depo için, iyi çalışan aşağıdaki komutu verebilirim:

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

Ancak, bunu özel bir depo için denersem:

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

Aşağıdaki çıktıyı alıyorum:

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

Sanırım bunun nedeni, herhangi bir kimlik doğrulaması sağlamadan özel bir depoya erişmeye çalışıyorum. Bu nedenle sshpip'in kimlik doğrulaması için SSH genel anahtarımı kullanmasını umarak Git + kullanmaya çalıştım :

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

Bu, aşağıdaki çıktıyı verir:

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

Ulaşmaya çalıştığım şey mümkün mü? Öyleyse, nasıl yapabilirim?


2
Kesinlikle doğru cevap değil, ancak repoyu manuel olarak klonlamak ve sonra github yerine localhost'a pip işaret etmek, sadece üretken olmaya çalışıyorsanız bunu geçmenizi sağlayacaktır.
nmichaels

@nmicheals Şimdiye kadar yaptığım şey bu, ancak bunu ayrı sanal internetli birçok web sitesinde dağıtım için gereksinim dosyalarına koymam gerekiyor.
Adam J. Forster

Sadece eminim: github'da zaten ssh anahtar desteği kurdunuz, değil mi? Bu kesinlikle işe yaramazsa .... git + git: // user: pass@github.com / .... URI olarak kullanmayı denediniz mi?
2'de Jason LeBrun

Kullanmayı deneyin eval $(ssh-agent); ssh-add ~/.ssh/github_id_rsave ardından pip.pypa.io/en/stable/reference/pip_install/#git
Darren Weber

Yanıtlar:


375

git+sshURI şemasını kullanabilirsiniz , ancak bir kullanıcı adı ayarlamanız gerekir :

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

git@URI'nin içindeki kısmı görüyor musunuz ?

PS: Dağıtım anahtarları hakkında da bilgi edinin .

PPS: Kurulumumda "git + ssh" URI şeması yalnızca "düzenlenebilir" gereksinimlerle çalışır:

pip install -e URI#egg=EggName

Unutmayın : Uzaktan kumandanın adresini komutta kullanmadan önce bir karaktere yazdırılan :karakteri değiştirin :git remote -v/pip

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

Unutursanız, bu hatayı alırsınız:

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

3
Bunun için teşekkürler, git @ bölümünü kaçırıyordum. Bu arada 'pip install git + ssh: //git@github.com/echweb/echweb-utils.git' komutu çalıştı, -e anahtarına ihtiyaç duymadım.
Adam J. Forster

2
uygun kullanıcı adını ayarlamak için bir .ssh / config dosyası da kullanabilirsiniz
Stefano

2
Bu eskiden benim için çalışıyordu ama şimdi değil, git+ssh://git@github.com/echweb/echweb-utils.gitgereksinimler dosyamda doğru düzeni bile kullanıyorum . Burada yeni bir soru açtım: stackoverflow.com/questions/18883430/… . Herhangi bir yardım çok iyi olurdu.
Robeezy

2
Mükemmel. İşlere git+ssh://git@github.com/echweb/echweb-utils.gitde koymak requirements.txt, bu harika.
Avindra Goolcharan

2
Belirli bir şubeden yüklemek istiyorsanız:pip install git+ssh://git@github.com/echweb/echweb-utils.git@branch-name
Guilherme Beltramini

73

Ek bir teknik olarak, yerel olarak klonlanmış özel deponuz varsa, şunları yapabilirsiniz:

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

Daha modern olarak, sadece bunu yapabilirsiniz (ve bu -e, değişikliklerin yansıtılmadan önce taahhütte bulunmanız gerekmeyeceği anlamına gelir):

pip install -e C:\repo\directory

9
Bu oldukça yardımcı oldu. Görünüşe göre, yerel değişiklikler pip yoluyla yüklenmeden önce git-taahhüt edilmelidir.
ramhiser

5
Bu doğru - git deposundan (.git) çekiyor, dosyaların çalışma kopyalarını DEĞİL.
Scott Stafford

47

Doğrudan aşağıdaki gibi HTTPS URL'si ile yapabilirsiniz:

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

Bu, aynı zamanda , örneğin, bir Django projesindeki gereksinimler.txt dosyasına ekleyerek de çalışır .


19
Ancak özel depolar için, bu konsolda bir kullanıcı adı / şifre istemi tetikler, bu da muhtemelen istediğiniz şey değildir.
rascalking

31

Ayrıca Bitbucket ile çalışır :

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

Pip bu durumda SSH anahtarlarınızı kullanacaktır.


16

Jeton kullanmayı SSH anahtarlarından çok daha kolay buldum. Bu konuda çok iyi bir belge bulamadım, bu yüzden çoğunlukla çözüm ve hata yoluyla bu çözüme rastladım. Ayrıca, pip ve kurulum araçlarından kurulumda bazı ince farklar vardır; ama bu yol her ikisi için de işe yarayacaktır

GitHub (şu anda, Ağustos 2016 itibariyle) özel depoların zip / tarball'ını almanın kolay bir yolunu sunmuyor. Bu nedenle, kurulum araçlarına bir Git deposuna işaret ettiğinizi söylemek için kurulum araçlarını işaretlemeniz gerekir:

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

Burada birkaç not:

  • Özel depolar için GitHub ile kimlik doğrulaması yapmanız gerekir; bulduğum en basit yol bir OAuth jetonu oluşturmak , bunu ortamınıza bırakmak ve ardından URL'ye eklemektir.
  • PyPI'de herhangi bir paket olmasa bile, bağlantının sonuna bazı sürüm numaralarını (burada 0) eklemeniz gerekir . Bu gerçek bir sayı olmalı, bir kelime değil.
  • git+Kurulum araçlarına, bir zip / tarball'a işaret etmek yerine depoyu klonlayacağını söylemek için önceden bilgi vermeniz gerekir.
  • version bir şube, bir etiket veya bir sağlama karması olabilir
  • --process-dependency-linksPip'den kurulum yapıyorsanız tedarik etmeniz gerekir

1
Not setup.pysomut bağımlılıklar içermemeli, sadece soyut bağımlılıklar içermelidir. Bu, somut bir bağımlılık olduğunu belirtiyor setup.py.
Jorge Leitao

1
Pip sürüm 19.0 sürümüyle birlikte --process-bağımlılık-bağlantılar seçeneği kullanımdan kaldırılmıştır.
yardstick17

15

Gereksinimler dosyası için sözdizimi burada verilmiştir:

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

Örneğin, şunu kullanın:

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

kurulumdan sonra kaynağın yapışmasını istiyorsanız.

Ya da sadece

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

sadece kurulmasını istiyorsanız.


Gereksinimler dosyası sözdiziminin URL'si değişti. Yeni URL: pip.pypa.io/en/latest/reference/…
küre

15

Hiçbir şifre istemi gerektirmeyen bir GitLab özel havuzunu otomatik olarak 'pip install' için bir yol buldum. Bu yaklaşım GitLab "Anahtarları Dağıt" ve bir SSH yapılandırma dosyası kullanır, böylece kişisel SSH anahtarlarınız dışındaki anahtarları kullanarak (benim durumumda, 'bot tarafından kullanılmak üzere) kullanabilirsiniz. Belki bir tür ruh GitHub'ı kullanarak doğrulayabilir.

Yeni bir SSH anahtarı oluşturun:

ssh-keygen -t rsa -C "GitLab_Robot_Deploy_Key"

Dosya olarak gösterilir; ~/.ssh/GitLab_Robot_Deploy_Keyve ~/.ssh/GitLab_Robot_Deploy_Key.pub.

~/.ssh/GitLab_Robot_Deploy_Key.pubDosyanın içeriğini kopyalayıp GitLab "Anahtarları Dağıt" iletişim kutusuna yapıştırın .

Yeni Dağıtım Anahtarını Test Edin

Aşağıdaki komut SSH'ye bağlantı kurmak için yeni konuşlandırma anahtarınızı kullanmasını bildirir. Başarılı olduğunuzda şu mesajı almalısınız: "GitLab'a Hoş Geldiniz, KullanıcıAdı!"

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

SSH Yapılandırma Dosyasını Oluşturma

Ardından, bir ~/.ssh/configdosya oluşturmak için bir düzenleyici kullanın . Aşağıdaki içeriği ekleyin. 'Host' değeri istediğiniz herhangi bir şey olabilir (unutmayın, çünkü daha sonra kullanacaksınız). HostName, GitLab örneğinizin URL'sidir. IdentifyFile, ilk adımda oluşturduğunuz SSH anahtar dosyasının yoludur.

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

SSH'yi Yapılandırma dosyasına yönlendirin

oxyum bize SSH ile pip kullanma reçetesini verdi :

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

SSH'nin yeni Dağıtım Anahtarımızı kullanmasını sağlamak için biraz değiştirmemiz gerekiyor. Bunu SSH'yi SSH yapılandırma dosyasındaki Host girişine işaret ederek yaparız. SSH yapılandırma dosyasında kullandığımız ana bilgisayar adının komutundaki 'gitlab.mycorp.com' adresini değiştirmeniz yeterlidir:

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

Paket şimdi herhangi bir parola istemi olmadan yüklenmelidir.

Referans A
Referans B


7

GitHub'dan yüklerken kullanabildim:

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

Ancak, sudopip'i çalıştırmak zorunda olduğum için , SSH anahtarları GitHub ile artık çalışmıyordu ve "Git klonu" "İzin reddedildi (publickey)" üzerinde başarısız oldu. Kullanmak git+httpskomutu sudo olarak çalıştırmama izin verdi ve GitHub'ın kullanıcı / şifremi sormasını sağladı.

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

Diğer kullanıcı hesaplarının projenize erişmesi gerekiyor mu? Değilse, nerdwaller'ın önerisini
Michael - Clay Shirky

7

Ayrıca , dosya ile kıvrılma için oturum açma kimlik bilgileri (oturum açma adı ve parola veya belirteç dağıtma) sağlayarak git + https: //github.com / ... URL'si aracılığıyla özel bir depo bağımlılığı yükleyebilirsiniz :.netrc

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

Bir CI sunucusu veya benzeri bir gereksinimler dosyasından bağımlılıkları yüklemek istiyorsanız , bunu yapabilirsiniz:

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

Benim durumumda, GIT_USER=gitlab-ci-tokenve kullandım GIT_PASS=${CI_JOB_TOKEN}.

Bu yöntemin belirgin bir avantajı vardır. Tüm bağımlılıklarınızı içeren tek bir gereksinim dosyanız var.


3

SSH'yi kullanmak istemiyorsanız, kullanıcı adını ve şifreyi HTTPS URL'sine ekleyebilirsiniz.

Aşağıdaki kod, şifrenizi içeren çalışma dizininde "pass" adında bir dosyanız olduğunu varsayar.

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

Bu, şifrenizi düz metin olarak bir yapılandırma dosyasına damgalar mı?
Michael - Clay Shirky'nin

0

oxyum en çözümü bu cevap için sorun değil. Sadece sudoanahtarlar kök için de saklanması gerektiği gibi kullanarak yüklerken dikkatli olmanız gerektiğini belirtmek istiyorum (örneğin, /root/.ssh).

Sonra yazabilirsiniz

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

6
Kolay çözüm: sudo ile kurulum yapmayın. Bunun yerine --userbayrağı veya bir sanal ağı kullanın.
nerdwaller

0

GitHub, GitLab, vb. Üzerinde kendi kitaplığınız / paketiniz varsa, örneğin v2.0 gibi kitaplığın somut bir sürümünü yürütmek için bir etiket eklemeniz gerekir ve ardından paketinizi yükleyebilirsiniz:

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

Bu benim için çalışıyor. Diğer çözümler benim için işe yaramadı.


0

İşte benim için çalışan hızlı bir yöntem. Repoyu çatallayın ve kendi GitHub hesabınızdan yükleyin.

pip install git+https://github.com/yourName/repoName

-1

Uzaktan kumandayı orijinal git clonekomuttan (veya git remote -v) kopyalamanız yeterlidir . Bunun gibi bir şey alacaksınız:

  • Bitbucket: git+ssh://git@bitbucket.org:your_account/my_pro.git

  • GitHub: git+ssh://git@github.com:your_account/my_pro.git

Ardından, alan adının yanındaki :ile değiştirmeniz gerekir /.

Yani şunu kullanarak yükleyin:

pip install git+ssh://git@bitbucket.org/your_account/my_pro.git

"Kopyala git clone command" ile ne demek istiyorsun ? Şunu mu demek istediniz: '' git clone 'komutunu kullanarak kopyalama' ? Veya "'git clone' komutunu kopyala" mı? Veya başka bir şey? (Lütfen yanıtınızı düzenleyerek yanıtlayın , burada yorumlarda bulunmayın (uygun şekilde). Şimdiden teşekkürler.).
Peter Mortensen

-2

Deneyebilirsin

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

olmadan ssh:.... Bu benim için işe yarıyor.


OP github istedi.
Karuhanga
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.