เป็นไปได้ไหมที่จะใช้ pip เพื่อติดตั้งแพ็กเกจจากแหล่งเก็บข้อมูลส่วนตัว GitHub?


349

ฉันพยายามติดตั้งแพ็กเกจ Python จากที่เก็บ GitHub ส่วนตัว สำหรับพื้นที่เก็บข้อมูลสาธารณะฉันสามารถออกคำสั่งต่อไปนี้ซึ่งทำงานได้ดี:

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

อย่างไรก็ตามถ้าฉันลองนี้สำหรับที่เก็บส่วนตัว:

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

ฉันได้รับผลลัพธ์ต่อไปนี้:

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

ฉันเดาว่าเป็นเพราะฉันพยายามเข้าถึงที่เก็บส่วนตัวโดยไม่ต้องมีการตรวจสอบสิทธิ์ใด ๆ ฉันจึงพยายามใช้ Git + sshหวังว่า pip จะใช้กุญแจสาธารณะ SSH ของฉันเพื่อตรวจสอบสิทธิ์:

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

สิ่งนี้ให้ผลลัพธ์ต่อไปนี้:

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

สิ่งที่ฉันพยายามที่จะประสบความสำเร็จเป็นไปได้แม้กระทั่ง? ถ้าเป็นเช่นนั้นฉันจะทำอย่างไร


2
แน่นอนว่ามันไม่ใช่คำตอบที่ถูกต้อง แต่การโคลน repo ด้วยตนเองจากนั้นชี้ pip ไปยัง localhost แทน github จะทำให้คุณผ่านมันไปได้ถ้าคุณแค่พยายามให้มีประสิทธิผล
nmichaels

@micheals นั่นคือสิ่งที่ฉันได้ทำไปแล้ว แต่ฉันจำเป็นต้องใส่สิ่งนี้ลงในไฟล์ข้อกำหนดสำหรับการใช้งานในเว็บไซต์จำนวนมากที่มี virtualenv แยกต่างหาก
อดัมเจ. ฟอสเตอร์

เพียงแค่เขาแน่ใจว่า: คุณได้ตั้งค่าการสนับสนุนคีย์ ssh บน gitHub ใช่ไหม? ถ้านั่นไม่ได้ผลแน่นอน ... คุณลองใช้ git + git: // user: pass@github.com / .... ในฐานะ URI หรือไม่?
Jason LeBrun

ลองใช้eval $(ssh-agent); ssh-add ~/.ssh/github_id_rsaและจากนั้นเรียกใช้การติดตั้ง pip ตามpip.pypa.io/en/stable/reference/pip_install/#git
Darren Weber

คำตอบ:


375

คุณสามารถใช้git+sshรูปแบบ URI แต่คุณต้องตั้งชื่อผู้ใช้:

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

คุณเห็นgit@ส่วนหนึ่งของ URI หรือไม่?

PS: อ่านเกี่ยวกับคีย์การนำไปใช้

PPS: ในการติดตั้งของฉันรูปแบบ "git + ssh" URI ใช้ได้กับข้อกำหนด "แก้ไขได้" เท่านั้น:

pip install -e URI#egg=EggName

เตือนความจำ : เปลี่ยน:อักขระที่git remote -vพิมพ์เป็น/อักขระก่อนใช้ที่อยู่ของรีโมตในpipคำสั่ง:

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

หากคุณลืมคุณจะได้รับข้อผิดพลาดนี้:

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

3
ขอบคุณที่ฉันเพิ่งหายไปส่วน git @ บังเอิญคำสั่ง 'pip install git + ssh: //git@github.com/echweb/echweb-utils.git' ใช้งานได้ฉันไม่ต้องการสวิตช์ -e
อดัมเจ. ฟอสเตอร์

2
นอกจากนี้คุณยังสามารถใช้ไฟล์. ssh / config เพื่อตั้งชื่อผู้ใช้ที่เหมาะสม
Stefano

2
สิ่งนี้เคยทำงานให้ฉัน แต่ตอนนี้ไม่ใช่ฉันยังใช้git+ssh://git@github.com/echweb/echweb-utils.gitแบบแผนที่ถูกต้องในไฟล์ข้อกำหนดของฉัน ผมเปิดคำถามใหม่ที่นี่: stackoverflow.com/questions/18883430/... ความช่วยเหลือใด ๆ จะดีมาก
Robeezy

2
สมบูรณ์ นำgit+ssh://git@github.com/echweb/echweb-utils.gitไปใช้กับrequirements.txtงานด้วยซึ่งยอดเยี่ยมมาก
Avindra Goolcharan

2
หากคุณต้องการติดตั้งจากสาขาเฉพาะ:pip install git+ssh://git@github.com/echweb/echweb-utils.git@branch-name
Guilherme Beltramini

73

ในฐานะที่เป็นเทคนิคเพิ่มเติมหากคุณมีการโคลนพื้นที่เก็บข้อมูลส่วนตัวในประเทศคุณสามารถทำ:

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

ยิ่งทันสมัยคุณสามารถทำสิ่งนี้ได้ (และความ-eตั้งใจจะทำให้คุณไม่ต้องทำการเปลี่ยนแปลงใด ๆ ก่อนที่จะสะท้อนออกมา)

pip install -e C:\repo\directory

9
สิ่งนี้มีประโยชน์มาก เห็นได้ชัดว่าการเปลี่ยนแปลงในท้องถิ่นจะต้องคอมไพล์กระทำก่อนที่จะสามารถติดตั้งผ่าน pip
ramhiser

5
มันเป็นความจริง - มันกำลังดึงมันออกมาจากที่เก็บ git (เป็น. git) ไม่ใช่สำเนาที่ใช้งานได้ของไฟล์
Scott Stafford

47

คุณสามารถทำได้โดยตรงด้วย HTTPS URL ดังนี้:

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

นอกจากนี้ยังใช้งานต่อท้ายบรรทัดนั้นใน requirements.txt ในโครงการDjangoเช่น


19
อย่างไรก็ตามสำหรับ repos ส่วนตัวนี้จะทริกเกอร์ชื่อผู้ใช้ / รหัสผ่านบนคอนโซลซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ
rascalking

31

มันทำงานร่วมกับBitbucket :

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

Pip จะใช้คีย์ SSH ของคุณในกรณีนี้


16

ฉันพบว่าการใช้โทเค็นง่ายกว่าคีย์ SSH มากขึ้น ฉันไม่สามารถหาเอกสารที่ดีเกี่ยวกับเรื่องนี้ได้ดังนั้นฉันจึงพบวิธีแก้ปัญหานี้ส่วนใหญ่ผ่านการลองผิดลองถูก นอกจากนี้การติดตั้งจาก pip และ setuptools มีความแตกต่างเล็กน้อย แต่วิธีนี้ควรใช้ได้ผลกับทั้งคู่

GitHub ทำไม่ได้ (ปัจจุบันจนถึงเดือนสิงหาคม 2559) เสนอวิธีง่ายๆในการรับ zip / tarball ของที่เก็บส่วนตัว ดังนั้นคุณต้องชี้ setuptools เพื่อบอก setuptools ว่าคุณกำลังชี้ไปที่ที่เก็บ 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)
        ]

คู่ของบันทึกย่อที่นี่:

  • สำหรับที่เก็บส่วนตัวคุณต้องตรวจสอบสิทธิ์กับ GitHub วิธีที่ง่ายที่สุดที่ฉันพบคือการสร้างโทเค็นOAuthวางสิ่งนั้นลงในสภาพแวดล้อมของคุณแล้วรวมไว้ใน URL
  • คุณจำเป็นต้องมีบางหมายเลขรุ่น (ที่นี่เป็น0) ในตอนท้ายของการเชื่อมโยงที่แม้ว่าจะมีไม่ได้แพคเกจใด ๆ บนPyPI PyPIต้องเป็นตัวเลขจริงไม่ใช่คำ
  • คุณจำเป็นต้องนำหน้าด้วยgit+เพื่อบอก setuptools เพื่อทำการโคลนที่เก็บแทนที่จะชี้ไปที่ zip / tarball
  • version อาจเป็นสาขาแท็กหรือแฮชการกระทำ
  • คุณต้องจัดหา--process-dependency-linksถ้าติดตั้งจาก pip

1
หมายเหตุsetup.pyไม่ควรมีการขึ้นต่อกันที่เป็นรูปธรรมมีเพียงนามธรรม setup.pyนี้จะระบุพึ่งพาคอนกรีต
Jorge Leitao

1
ด้วยการเปิดตัว pip เวอร์ชั่น 19.0 ตัวเลือก --process-dependency-links จะถูกคัดค้าน
yardstick17

15

ไวยากรณ์สำหรับไฟล์ข้อกำหนดได้รับที่นี่:

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

ตัวอย่างเช่นใช้:

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

ถ้าคุณต้องการให้แหล่งที่มาติดรอบหลังจากการติดตั้ง

หรือเพียงแค่

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

หากคุณเพียงต้องการให้ติดตั้ง


URL สำหรับไวยากรณ์ไฟล์ข้อกำหนดมีการเปลี่ยนแปลง URL ใหม่คือ: pip.pypa.io/en/latest/reference/…
sphere

15

ฉันคิดหาวิธีในการ 'ติดตั้ง pip' โดยอัตโนมัติในที่เก็บส่วนตัว GitLab ที่ไม่ต้องใช้รหัสผ่าน วิธีนี้ใช้ GitLab "ปรับใช้คีย์" และไฟล์กำหนดค่า SSH ดังนั้นคุณสามารถปรับใช้โดยใช้ปุ่มอื่นนอกเหนือจากคีย์ SSH ส่วนตัวของคุณ (ในกรณีของฉันเพื่อใช้งานโดย 'bot) บางทีคนที่ใจดีก็สามารถยืนยันได้โดยใช้ GitHub

สร้างคีย์ SSH ใหม่:

ssh-keygen -t rsa -C "GitLab_Robot_Deploy_Key"

ไฟล์ควรแสดงขึ้นเป็นและ~/.ssh/GitLab_Robot_Deploy_Key~/.ssh/GitLab_Robot_Deploy_Key.pub

คัดลอกและวางเนื้อหาของ~/.ssh/GitLab_Robot_Deploy_Key.pubไฟล์ลงในกล่องโต้ตอบ "ปรับใช้คีย์" ของ GitLab

ทดสอบคีย์การปรับใช้ใหม่

คำสั่งต่อไปนี้บอก SSH ให้ใช้คีย์ปรับใช้ใหม่ของคุณเพื่อตั้งค่าการเชื่อมต่อ ในความสำเร็จคุณควรได้รับข้อความ: "ยินดีต้อนรับสู่ GitLab, ชื่อผู้ใช้!"

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

สร้างไฟล์การกำหนดค่า SSH

จากนั้นใช้เครื่องมือแก้ไขเพื่อสร้าง~/.ssh/configไฟล์ เพิ่มเนื้อหาต่อไปนี้ ค่า 'โฮสต์' สามารถเป็นอะไรก็ได้ที่คุณต้องการ (แค่จำไว้เพราะคุณจะใช้มันในภายหลัง) ชื่อโฮสต์คือ URL ของอินสแตนซ์ GitLab ของคุณ IdentifyFile คือพา ธ ไปยังไฟล์คีย์ SSH ที่คุณสร้างในขั้นตอนแรก

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

ชี้ SSH ไปที่ไฟล์ Configuration

oxyum ให้สูตรแก่เราในการใช้ pip กับ SSH:

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

เราเพียงแค่ต้องปรับเปลี่ยนเล็กน้อยเพื่อให้ SSH ใช้คีย์การปรับใช้ใหม่ของเรา เราทำเช่นนั้นโดยชี้ SSH ไปยังรายการ Host ในไฟล์กำหนดค่า SSH เพียงแค่แทนที่ 'gitlab.mycorp.com' ในคำสั่งเป็นชื่อโฮสต์ที่เราใช้ในไฟล์กำหนดค่า SSH:

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

แพ็คเกจนี้ควรติดตั้งโดยไม่ต้องใส่รหัสผ่านใด ๆ

การอ้างอิง A
การอ้างอิงข


7

เมื่อฉันติดตั้งจาก GitHub ฉันสามารถใช้:

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

แต่เนื่องจากฉันต้องเรียกใช้ pip เหมือนsudoกันคีย์ SSH ไม่ทำงานกับ GitHub อีกต่อไปและ "git clone" ล้มเหลวใน "การอนุญาตถูกปฏิเสธ (publickey)" การใช้git+httpsอนุญาตให้ฉันเรียกใช้คำสั่งเป็น sudo และให้ GitHub ถามฉันสำหรับผู้ใช้ / รหัสผ่าน

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

บัญชีผู้ใช้อื่น ๆ จำเป็นต้องเข้าถึงโครงการของคุณหรือไม่? ถ้าไม่คุณได้ค้นพบข้อเสนอแนะของ nerdwall หรือไม่?
Michael - ที่ไหน Shirky Clay

7

นอกจากนี้คุณยังสามารถติดตั้งการพึ่งพาที่เก็บส่วนตัวผ่านทางgit + https: //github.com / ... URL โดยการให้ข้อมูลการเข้าสู่ระบบ (เข้าสู่ระบบและรหัสผ่านหรือปรับใช้โทเค็น) สำหรับขดกับ.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

หากคุณต้องการติดตั้งการอ้างอิงจากไฟล์ข้อกำหนดภายในเซิร์ฟเวอร์CIหรือเหมือนกันคุณสามารถทำได้:

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

ในกรณีของฉันฉันใช้และGIT_USER=gitlab-ci-tokenGIT_PASS=${CI_JOB_TOKEN}

วิธีนี้มีข้อได้เปรียบที่ชัดเจน คุณมีไฟล์ข้อกำหนดเดียวซึ่งมีการอ้างอิงทั้งหมดของคุณ


3

หากคุณไม่ต้องการใช้ SSH คุณสามารถเพิ่มชื่อผู้ใช้และรหัสผ่านใน HTTPS URL

รหัสด้านล่างจะถือว่าคุณมีไฟล์ชื่อ "pass" ในไดเรกทอรีทำงานที่มีรหัสผ่านของคุณ

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

สิ่งนี้ประทับตรารหัสผ่านของคุณเป็นข้อความธรรมดาในไฟล์กำหนดค่าบางส่วน
Michael - Where's Clay Shirky

0

ทางออกของ oxyumนั้นใช้ได้สำหรับคำตอบนี้ ฉันแค่ต้องการชี้ให้เห็นว่าคุณต้องระวังหากคุณกำลังติดตั้งโดยใช้sudoเพราะต้องเก็บกุญแจไว้ในรูทด้วย (เช่น/root/.ssh )

จากนั้นคุณสามารถพิมพ์

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

6
วิธีแก้ปัญหาง่าย ๆ : อย่าติดตั้งด้วย sudo ใช้--userแฟล็กหรือ virtualenv แทน
nerdwaller

0

หากคุณมีไลบรารี่ / แพ็กเกจของคุณเองบน GitHub, GitLab ฯลฯ คุณต้องเพิ่มแท็กเพื่อคอมมิทด้วยไลบรารี่เวอร์ชันที่เป็นรูปธรรมเช่น v2.0 และจากนั้นคุณสามารถติดตั้งแพ็คเกจของคุณได้:

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

มันใช้งานได้สำหรับฉัน โซลูชันอื่น ๆ ใช้ไม่ได้สำหรับฉัน


0

นี่เป็นวิธีที่รวดเร็วสำหรับฉัน เพียงแค่แยก repo และติดตั้งจากบัญชี GitHub ของคุณเองด้วย

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

-1

เพียงแค่คัดลอกรีโมตจากgit cloneคำสั่งดั้งเดิม(หรือจากgit remote -v) คุณจะได้รับสิ่งนี้:

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

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

ถัดไปคุณจะต้องแทนที่:ด้วย/ถัดจากชื่อโดเมน

ดังนั้นติดตั้งโดยใช้:

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

คุณหมายถึงอะไรโดย"คำสั่ง copy git clone" ? คุณหมายถึง"copy โดยใช้คำสั่ง 'git clone'หรือไม่ หรือ"คัดลอกคำสั่ง 'git clone'"หรือไม่ หรืออย่างอื่น? (โปรดตอบกลับโดยแก้ไขคำตอบของคุณไม่ใช่ที่นี่ในความคิดเห็น (ตามความเหมาะสม) ขอบคุณล่วงหน้า)
Peter Mortensen

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.