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?

Adam J. Forster
sumber
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: [email protected] / .... 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
oxyum
sumber
3
Terima kasih untuk itu, saya baru saja melewatkan bagian git @. Kebetulan perintah 'pip install git + ssh: //[email protected]/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://[email protected]/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://[email protected]/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://[email protected]/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
Scott Stafford
sumber
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.

danius
sumber
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.

gnrfan
sumber
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.

Rachel
sumber
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
Maximilian
sumber
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 [email protected]

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://[email protected]/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

JS.
sumber
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>
jcarballo
sumber
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"
ei-grad
sumber
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.

AmirHossein
sumber
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
sam
sumber
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
Andres Romero
sumber
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.

zolty13
sumber
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
Coder Schrödinger
sumber
-1

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

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

Jadi instal menggunakan:

pip install git+ssh://git@bitbucket.org/your_account/my_pro.git
Mohideen bin Mohammed
sumber
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 [email protected]/my_name/my_repo.git

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

pengguna2235670
sumber
OP meminta github.
Karuhanga