Apakah mungkin menggunakan pip untuk menginstal paket dari repositori GitHub pribadi?


349

Saya mencoba menginstal paket Python dari repositori GitHub pribadi. Untuk repositori publik, saya bisa mengeluarkan perintah berikut yang berfungsi dengan baik:

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

Namun, jika saya mencoba ini untuk repositori pribadi:

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

Saya mendapatkan output berikut:

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

Saya kira ini karena saya mencoba mengakses repositori pribadi tanpa memberikan otentikasi apa pun. Karena itu saya mencoba menggunakan Git + sshberharap pip akan menggunakan kunci publik SSH saya untuk mengotentikasi:

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

Ini menghasilkan output sebagai berikut:

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

Apakah yang saya coba capai bahkan mungkin? Jika demikian, bagaimana saya bisa melakukannya?


2
Ini tentu saja bukan jawaban yang benar, tetapi mengkloning repo secara manual kemudian mengarahkan pip ke localhost bukannya github akan membuat Anda melewati ini jika Anda hanya berusaha untuk menjadi produktif.
nmichaels

@nmicheals Itulah yang telah saya lakukan sejauh ini, tetapi saya harus memasukkan ini ke file persyaratan untuk ditempatkan di banyak situs web semua dengan virtualenvs terpisah.
Adam J. Forster

Hanya untuk dia yakin: Anda sudah mengatur dukungan kunci ssh di github, kan? Jika itu pasti tidak berhasil .... Sudahkah Anda mencoba menggunakan git + git: // user: pass@github.com / .... sebagai URI?
Jason LeBrun

Coba gunakan eval $(ssh-agent); ssh-add ~/.ssh/github_id_rsadan kemudian jalankan instalasi pip berikut pip.pypa.io/en/stable/reference/pip_install/#git
Darren Weber

Jawaban:


375

Anda dapat menggunakan git+sshskema URI, tetapi Anda harus menetapkan nama pengguna:

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

Apakah Anda melihat git@bagian itu ke dalam URI?

PS: Baca juga tentang kunci penyebaran .

PPS: Dalam instalasi saya, skema URI "git + ssh" hanya bekerja dengan persyaratan "yang dapat diedit":

pip install -e URI#egg=EggName

Ingat : Ubah :karakter yang git remote -vdicetak ke /karakter sebelum menggunakan alamat remote dalam pipperintah:

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

Jika Anda lupa, Anda akan mendapatkan kesalahan ini:

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

3
Terima kasih untuk itu, saya baru saja melewatkan bagian git @. Kebetulan perintah 'pip install git + ssh: //git@github.com/echweb/echweb-utils.git' bekerja, saya tidak memerlukan saklar -e.
Adam J. Forster

2
Anda juga dapat menggunakan file .ssh / config untuk menetapkan nama pengguna yang tepat
Stefano

2
Ini dulu berfungsi untuk saya tetapi sekarang tidak, saya bahkan menggunakan git+ssh://git@github.com/echweb/echweb-utils.gitskema yang benar dalam file persyaratan saya. Saya membuka pertanyaan baru di sini: stackoverflow.com/questions/18883430/… . Bantuan apa pun akan bagus.
Robeezy

2
Sempurna. Dimasukkan git+ssh://git@github.com/echweb/echweb-utils.gitke dalam requirements.txtkarya juga, yang luar biasa.
Avindra Goolcharan

2
Jika Anda ingin menginstal dari cabang tertentu:pip install git+ssh://git@github.com/echweb/echweb-utils.git@branch-name
Guilherme Beltramini

73

Sebagai teknik tambahan, jika Anda memiliki repositori pribadi yang diklon secara lokal, Anda dapat melakukan:

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

Secara lebih modern, Anda bisa melakukan ini (dan surat -ewasiat berarti Anda tidak perlu melakukan perubahan sebelum tercermin):

pip install -e C:\repo\directory

9
Ini cukup membantu. Rupanya, perubahan lokal harus git-commit sebelum mereka dapat diinstal melalui pip.
ramhiser

5
Itu benar - ini menariknya dari repositori git (dalam .git), BUKAN salinan file yang berfungsi.
Scott Stafford

47

Anda dapat melakukannya langsung dengan URL HTTPS seperti ini:

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

Ini juga berfungsi hanya menambahkan baris itu di requirement.txt dalam proyek Django , misalnya.


19
Namun, untuk repo pribadi, ini akan memicu prompt nama pengguna / kata sandi di konsol, yang mungkin bukan yang Anda inginkan.
rascalking

31

Ini juga berfungsi dengan Bitbucket :

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

Pip akan menggunakan kunci SSH Anda dalam hal ini.


15

Sintaks untuk file persyaratan diberikan di sini:

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

Jadi misalnya, gunakan:

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

jika Anda ingin sumbernya bertahan setelah instalasi.

Atau hanya

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

jika Anda hanya ingin menginstalnya.


URL untuk sintaks file persyaratan telah berubah. URL baru adalah: pip.pypa.io/en/latest/reference/…
sphere

15

Saya merasa lebih mudah menggunakan token daripada kunci SSH. Saya tidak dapat menemukan dokumentasi yang bagus tentang ini, jadi saya menemukan solusi ini terutama melalui coba-coba. Selanjutnya, menginstal dari pip dan setuptools memiliki beberapa perbedaan yang halus; tetapi cara ini harus bekerja untuk keduanya.

GitHub tidak (saat ini, per Agustus 2016) menawarkan cara mudah untuk mendapatkan zip / tarball dari repositori pribadi. Jadi, Anda perlu mengarahkan setuptools untuk memberi tahu setuptools bahwa Anda menunjuk ke repositori 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)
        ]

Beberapa catatan di sini:

  • Untuk repositori pribadi, Anda perlu mengautentikasi dengan GitHub; cara paling sederhana yang saya temukan adalah membuat token OAuth , letakkan di lingkungan Anda, dan kemudian sertakan dengan URL
  • Anda perlu memasukkan beberapa nomor versi (di sini 0) di akhir tautan, meskipun tidak ada paket di PyPI . Ini harus berupa angka aktual, bukan kata.
  • Anda perlu kata pengantar dengan git+memberi tahu setuptools itu untuk mengkloning repositori, daripada menunjuk ke zip / tarball
  • version bisa berupa cabang, tag, atau hash komit
  • Anda perlu menyediakan --process-dependency-linksjika menginstal dari pip

1
Catatan setup.pytidak boleh mengandung dependensi konkret, hanya yang abstrak. Ini menentukan ketergantungan konkret pada setup.py.
Jorge Leitao

1
Dengan rilis pip versi 19.0, opsi --process-dependency-links sudah tidak digunakan lagi.
Alat ukur

14

Saya menemukan cara untuk secara otomatis 'menginstal' repositori pribadi GitLab yang tidak memerlukan prompt kata sandi. Pendekatan ini menggunakan GitLab "Menyebarkan Kunci" dan file konfigurasi SSH, sehingga Anda dapat menggunakan menggunakan kunci selain kunci SSH pribadi Anda (dalam kasus saya, untuk digunakan oleh bot '). Mungkin seseorang yang baik hati dapat memverifikasi menggunakan GitHub.

Buat kunci SSH Baru:

ssh-keygen -t rsa -C "GitLab_Robot_Deploy_Key"

File akan muncul sebagai ~/.ssh/GitLab_Robot_Deploy_Keydan ~/.ssh/GitLab_Robot_Deploy_Key.pub.

Salin dan tempel konten dari ~/.ssh/GitLab_Robot_Deploy_Key.pub file ke dalam dialog "Deploy Keys" GitLab.

Uji Kunci Penyebaran Baru

Perintah berikut memberi tahu SSH untuk menggunakan kunci penyebaran baru Anda untuk mengatur koneksi. Jika berhasil, Anda harus mendapatkan pesan: "Selamat datang di GitLab, UserName!"

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

Buat File Konfigurasi SSH

Selanjutnya, gunakan editor untuk membuat ~/.ssh/configfile. Tambahkan konten berikut. Nilai 'Host' dapat berupa apa saja yang Anda inginkan (ingat saja, karena Anda akan menggunakannya nanti). HostName adalah URL ke instance GitLab Anda. IdentifyFile adalah jalur ke file kunci SSH yang Anda buat pada langkah pertama.

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

Arahkan SSH ke file Konfigurasi

oxyum memberi kami resep untuk menggunakan pip dengan SSH:

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

Kami hanya perlu memodifikasinya sedikit agar SSH menggunakan Kunci Penyebaran baru kami. Kami melakukannya dengan mengarahkan SSH ke entri Host di file konfigurasi SSH. Cukup ganti 'gitlab.mycorp.com' pada perintah ke nama host yang kami gunakan dalam file konfigurasi SSH:

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

Paket sekarang harus menginstal tanpa prompt kata sandi.

Referensi A
Referensi B


7

Ketika saya menginstal dari GitHub saya dapat menggunakan:

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

Tapi, karena saya harus menjalankan pip as sudo, kunci SSH tidak lagi bekerja dengan GitHub, dan "git clone" gagal pada "Izin ditolak (publickey)". Menggunakan git+httpsmemungkinkan saya untuk menjalankan perintah sebagai sudo, dan meminta GitHub meminta pengguna / kata sandi saya.

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

Apakah akun pengguna lain perlu mengakses proyek Anda? Jika tidak, sudahkah
Michael - Di mana Clay Shirky

7

Anda juga dapat menginstal dependensi repositori pribadi melalui git + https: //github.com / ... URL dengan memberikan kredensial masuk (login dan kata sandi, atau menggunakan token) untuk digulung dengan .netrcfile:

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

Jika Anda ingin menginstal dependensi dari file persyaratan dalam server CI atau yang serupa, Anda dapat melakukan ini:

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

Dalam kasus saya, saya menggunakan GIT_USER=gitlab-ci-tokendan GIT_PASS=${CI_JOB_TOKEN}.

Metode ini memiliki keunggulan yang jelas. Anda memiliki file persyaratan tunggal yang berisi semua dependensi Anda.


3

Jika Anda tidak ingin menggunakan SSH, Anda bisa menambahkan nama pengguna dan kata sandi di URL HTTPS.

Kode di bawah ini mengasumsikan bahwa Anda memiliki file bernama "pass" di direktori kerja yang berisi kata sandi Anda.

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

Apakah ini mencap kata sandi Anda di plaintext ke beberapa file konfigurasi?
Michael - Di mana Clay Shirky

0

solusi oxyum tidak masalah untuk jawaban ini. Saya hanya ingin menunjukkan bahwa Anda perlu berhati-hati jika Anda menginstal menggunakan sudokarena kunci juga harus disimpan untuk root (misalnya,/root/.ssh ).

Maka Anda bisa mengetik

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

6
Solusi mudah: jangan instal dengan sudo. Alih-alih menggunakan --userbendera atau virtualenv.
nerdwaller

0

Jika Anda memiliki pustaka / paket Anda sendiri di GitHub, GitLab, dll., Anda harus menambahkan tag untuk melakukan dengan versi konkret pustaka, misalnya, v2.0, dan kemudian Anda dapat menginstal paket Anda:

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

Ini bekerja untuk saya. Solusi lain tidak berhasil untuk saya.


0

Inilah metode cepat yang bekerja untuk saya. Cukup garpu repo dan instal dari akun GitHub Anda sendiri

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

-1

Cukup salin remote dari git cloneperintah asli (atau dari git remote -v). Anda akan mendapatkan sesuatu seperti ini:

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

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

Selanjutnya, Anda perlu mengganti :dengan di /sebelah nama domain.

Jadi instal menggunakan:

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

Apa yang Anda maksud dengan "perintah copy git clone" ? Apakah maksud Anda "salin menggunakan perintah 'git clone'" ? Atau "salin perintah 'git clone'" ? Atau sesuatu yang lain? (Harap balas dengan mengedit jawaban Anda , bukan di sini dalam komentar (sebagaimana mestinya). Terima kasih sebelumnya.).
Peter Mortensen

-2

Anda boleh mencoba

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

tanpa ssh:.... Itu bekerja untuk saya.


OP meminta github.
Karuhanga
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.