क्या निजी गिटहब रिपॉजिटरी से पैकेज स्थापित करने के लिए पाइप का उपयोग करना संभव है?


349

मैं एक निजी 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उम्मीद है कि पाइप प्रमाणित करने के लिए मेरी 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
यह निश्चित रूप से सही उत्तर नहीं है, लेकिन रेपो को मैन्युअल रूप से क्लोन करना फिर जीथब के बजाय लोकलहोस्ट को पाइप को इंगित करना आपको यह अतीत में मिलेगा यदि आप सिर्फ उत्पादक होने की कोशिश कर रहे हैं।
नौमिहेल्स 16

@nmicheals कि मैंने अब तक क्या किया है, लेकिन मुझे इसे अलग-अलग virtualenvs के साथ कई वेब साइटों पर तैनाती के लिए आवश्यकताओं की फ़ाइलों में डालना होगा।
एडम जे। फोर्स्टर

बस उसे यकीन है: आप पहले से ही github, सही पर ssh कुंजी समर्थन स्थापित किया है? अगर यह निश्चित रूप से काम नहीं कर रहा है .... क्या आपने git + git: // उपयोगकर्ता: pass@github.com / .... का उपयोग URI के रूप में करने की कोशिश की है?
जेसन लेब्रन

eval $(ssh-agent); ssh-add ~/.ssh/github_id_rsaपाइप का उपयोग करने की कोशिश करें और फिर pip.pypa.io/en/stable/reference/pip_install/#git
डैरेन वेबर

जवाबों:


375

आप git+sshयूआरआई योजना का उपयोग कर सकते हैं , लेकिन आपको एक उपयोगकर्ता नाम सेट करना होगा :

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

क्या आप git@भाग को URI में देखते हैं ?

पुनश्च: तैनाती कुंजियों के बारे में भी पढ़ें ।

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 @ भाग को याद कर रहा था। संयोग से कमांड 'पाइप इंस्टॉल git + ssh: //git@github.com/echweb/echweb-utils.git' ने काम किया, मुझे -e स्विच की आवश्यकता नहीं थी।
एडम जे। फोर्स्टर

2
आप उचित उपयोगकर्ता नाम
Stefano

2
यह मेरे लिए काम करता था, लेकिन अब ऐसा नहीं है, मैं git+ssh://git@github.com/echweb/echweb-utils.gitअपनी आवश्यकताओं की फाइल में भी सही योजना का उपयोग कर रहा हूं । मैंने यहां एक नया प्रश्न खोला: stackoverflow.com/questions/18883430/… । कोई भी मदद बहुत अच्छी रहेगी।
रॉबीजी

2
उत्तम। काम git+ssh://git@github.com/echweb/echweb-utils.gitमें लाना requirements.txtभी, जो कमाल है।
अवींद्र गोलचरण 13

2
यदि आप एक विशिष्ट शाखा से स्थापित करना चाहते हैं:pip install git+ssh://git@github.com/echweb/echweb-utils.git@branch-name
गिलहर्मे बेल्ट्रामिनी

73

एक अतिरिक्त तकनीक के रूप में, यदि आपके पास स्थानीय रूप से क्लोन किए गए निजी भंडार हैं, तो आप यह कर सकते हैं:

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

अधिक आधुनिक रूप से, आप बस ऐसा कर सकते हैं (और -eइसका मतलब यह होगा कि आपके प्रतिबिंबित होने से पहले आपको बदलाव करने की आवश्यकता नहीं है):

pip install -e C:\repo\directory

9
यह काफी मददगार था। जाहिरा तौर पर, स्थानीय परिवर्तनों को पाइप के माध्यम से स्थापित करने से पहले गिट-कमिटेड होना चाहिए।
रमैहसर

5
यह सच है - यह इसे git रिपॉजिटरी (। Init) से खींच रहा है, फाइलों की वर्किंग कॉपी नहीं।
स्कॉट स्टाफोर्ड

47

आप इसे इस तरह सीधे HTTPS URL से कर सकते हैं:

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

यह भी सिर्फ एक उदाहरण के लिए, Django परियोजना में आवश्यकताओं में उस लाइन को जोड़ने का काम करता है ।


19
हालांकि, निजी रिपॉज के लिए, यह कंसोल पर एक यूज़रनेम / पासवर्ड प्रॉम्प्ट को ट्रिगर करेगा, जो कि शायद आप नहीं चाहते हैं।
14

31

यह Bitbucket के साथ भी काम करता है :

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

पिप इस मामले में आपकी SSH कुंजियों का उपयोग करेगा।


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/...
क्षेत्र

15

मुझे SSH कुंजियों की तुलना में टोकन का उपयोग करना बहुत आसान लगा। मुझे इस पर बहुत अच्छे दस्तावेज़ नहीं मिले, इसलिए मैं मुख्य रूप से परीक्षण और त्रुटि के माध्यम से इस समाधान में आया। इसके अलावा, पाइप और सेटपूल से स्थापित करने के कुछ सूक्ष्म अंतर हैं; लेकिन इस तरह से दोनों के लिए काम करना चाहिए।

GitHub (वर्तमान में, अगस्त 2016 के अनुसार) निजी रिपॉजिटरी के जिप / टारबॉल प्राप्त करने का एक आसान तरीका प्रदान करता है। तो आपको सेटटुपूल को इंगित करने के लिए सेटटॉपटूल को इंगित करने की आवश्यकता है जो आप एक गिट रिपॉजिटरी की ओर इशारा कर रहे हैं:

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

नोटों की एक जोड़ी यहाँ:

  • निजी रिपॉजिटरी के लिए, आपको गिटहब के साथ प्रमाणित करने की आवश्यकता है; मैंने जो सबसे आसान तरीका पाया, वह है OAuth टोकन बनाना , उसे अपने वातावरण में छोड़ना और फिर URL के साथ शामिल करना
  • आपको लिंक के अंत में कुछ संस्करण संख्या (यहां है 0) शामिल करने की आवश्यकता है , भले ही PyPI पर कोई पैकेज न हो । इसके लिए वास्तविक संख्या होनी चाहिए, शब्द नहीं।
  • आपको git+यह बताने की जरूरत है कि सेटटॉप्स को यह बताने के लिए रिपॉजिटरी को क्लोन करना है, बजाय एक जिप / टारबॉल पर इशारा करने के
  • version एक शाखा, एक टैग या एक प्रतिबद्ध हैश हो सकता है
  • यदि आपको --process-dependency-linksपाइप से इंस्टॉल करना है तो आपको आपूर्ति करनी होगी

1
नोट setup.pyमें ठोस निर्भरता नहीं होनी चाहिए, केवल सार। यह एक ठोस निर्भरता को निर्दिष्ट कर रहा है setup.py
जॉर्ज लेइताओ

1
पाइप संस्करण 19.0 के रिलीज के साथ, --प्रोसेसर-निर्भरता-लिंक विकल्प को हटा दिया गया है।
यार्डस्टिक

14

मैंने एक GitLab निजी रिपॉजिटरी को स्वचालित रूप से 'पाइप इंस्टॉल' करने का एक तरीका निकाला है जिसमें कोई पासवर्ड प्रॉम्प्ट की आवश्यकता नहीं है। यह दृष्टिकोण GitLab "डिप्लॉय कीज़" और एक SSH कॉन्फ़िगरेशन फ़ाइल का उपयोग करता है, इसलिए आप अपनी व्यक्तिगत SSH कुंजी (मेरे मामले में, 'बॉट द्वारा उपयोग के लिए) के अलावा अन्य कुंजियों का उपयोग करके तैनात कर सकते हैं। शायद किसी प्रकार की आत्मा 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, UserName में आपका स्वागत है!"

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

SSH कॉन्फ़िगरेशन फ़ाइल बनाएँ

अगला, ~/.ssh/configफ़ाइल बनाने के लिए संपादक का उपयोग करें । निम्नलिखित सामग्री जोड़ें। 'होस्ट' का मूल्य कुछ भी हो सकता है जिसे आप चाहते हैं (बस इसे याद रखें, क्योंकि आप इसे बाद में उपयोग करेंगे)। HostName आपके GitLab उदाहरण के लिए URL है। पहले चरण में बनाई गई SSH कुंजी फ़ाइल के लिए IdentifyFile पथ है।

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

SSH को कॉन्फ़िगरेशन फ़ाइल में इंगित करें

ऑक्सीम ने हमें SSH के साथ पाइप का उपयोग करने के लिए नुस्खा दिया :

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

हमें SSH को अपनी नई तैनाती कुंजी का उपयोग करने के लिए इसे थोड़ा संशोधित करने की आवश्यकता है। हम SSH कॉन्फ़िगरेशन फ़ाइल में SSH को होस्ट प्रविष्टि की ओर इंगित करके करते हैं। बस 'gitlab.mycorp.com' कमांड को उस होस्ट नाम के लिए कमांड में रखें, जिसका हमने SSH कॉन्फ़िगरेशन फ़ाइल में उपयोग किया था:

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

पैकेज अब बिना किसी पासवर्ड संकेत के स्थापित होना चाहिए।

संदर्भ ए
संदर्भ बी


7

जब मैं GitHub से स्थापित कर रहा था तब मैं उपयोग करने में सक्षम था:

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

लेकिन, चूंकि मुझे पाइप चलाना था sudo, इसलिए एसएसएच कीज़ गीथहब के साथ काम नहीं कर रही थी और "अनुमति खंडन (पबलीके)" पर "गिट क्लोन" विफल हो गया। का उपयोग कर git+httpsमुझे sudo के रूप में कमांड चलाएँ, और GitHub मुझे मेरे उपयोगकर्ता / पासवर्ड के लिए पूछने की अनुमति दी।

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

क्या अन्य उपयोगकर्ता खातों को आपकी परियोजना तक पहुंचने की आवश्यकता है? यदि नहीं, तो क्या आपने nerdwaller का सुझाव
माइकल - जहां

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-tokenऔर GIT_PASS=${CI_JOB_TOKEN}

इस पद्धति का स्पष्ट लाभ है। आपके पास एक एकल आवश्यकता फ़ाइल है जिसमें आपकी सभी निर्भरताएँ हैं।


3

यदि आप SSH का उपयोग नहीं करना चाहते हैं, तो आप HTTPS URL में उपयोगकर्ता नाम और पासवर्ड जोड़ सकते हैं।

नीचे दिया गया कोड मानता है कि आपके पास काम करने वाली निर्देशिका में "पास" नामक एक फाइल है जिसमें आपका पासवर्ड है।

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

क्या यह आपके पासवर्ड को कुछ कॉन्फ़िगरेशन फ़ाइल में प्लेनटेक्स्ट पर मुहर लगाता है?
माइकल -

0

इस जवाब के लिए ऑक्सीम का घोल ठीक है। मैं केवल यह बताना चाहता हूं कि यदि आप उपयोग कर रहे हैं तो आपको सावधानी बरतने की जरूरत है sudoक्योंकि कुंजी को रूट के लिए भी संग्रहीत किया जाना चाहिए (उदाहरण के लिए, /root/.ssh)।

फिर आप टाइप कर सकते हैं

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

6
आसान समाधान: sudo के साथ नहीं जमाना। इसके बजाय --userध्वज या एक virtualenv का उपयोग करें ।
nddwaller

0

यदि आपके पास GitHub, GitLab, आदि पर आपकी अपनी लाइब्रेरी / पैकेज है, तो आपको लाइब्रेरी के एक ठोस संस्करण के साथ प्रतिबद्ध होने के लिए एक टैग जोड़ना होगा, उदाहरण के लिए, v2.0, और फिर आप अपना पैकेज स्थापित कर सकते हैं:

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

यह मेरे लिए काम करता है। अन्य समाधानों ने मेरे लिए काम नहीं किया है।


0

यहाँ एक त्वरित विधि है जो मेरे लिए काम करती है। बस रेपो को कांटा और अपने स्वयं के GitHub खाते से इसे स्थापित करें

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

-1

बस मूल git cloneकमांड (या से git remote -v) के रिमोट को कॉपी करें । आपको कुछ इस तरह मिलेगा:

  • बिट बकेट: 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 क्लोन कमांड" से आपका क्या अभिप्राय है ? क्या आपका मतलब है "कॉपी क्लोन कमांड का उपयोग करके" ? या "'प्रतिरूप क्लोन' कमांड की प्रतिलिपि बनाएँ" ? या कुछ और? (कृपया अपने उत्तर को संपादित करके जवाब दें , यहाँ टिप्पणियों में नहीं (जैसा उचित हो) अग्रिम धन्यवाद।)
पीटर मोर्टेंसन

-2

आप कोशिश कर सकते हैं

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

बिना ssh:...। ये मेरे लिए सही है।


ओपी ने जीतूब से अनुरोध किया।
करुहांगा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.