Чи можна використовувати 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
Це, звичайно, не є правильною відповіддю, але клонування репо вручну, потім вказівка ​​піп на localhost замість github дозволить вам пройти це, якщо ви просто намагаєтесь бути продуктивними.
nmichaels

@nmicheals Це те, що я робив до цих пір, але мені потрібно вкласти це у файли вимог для розгортання на багатьох веб-сайтах, все з окремими virtualenvs.
Адам Дж. Форстер

Просто він впевнений: ви вже встановили підтримку ssh для ключа github, правда? Якщо це точно не працює .... Ви спробували використовувати git + git: // user: pass@github.com / .... як URI?
Джейсон Лебрун

Спробуйте скористатись, 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: У моїй установці URI-схема "git + ssh" працює лише з вимогами "для редагування":

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
Це було дуже корисно. Мабуть, локальні зміни повинні бути git-commit'd, перш ніж їх можна буде встановити через pip.
ramhiser

5
Це правда - це витягування його з сховища git (in .git), а не робочих копій файлів.
Скотт Стаффорд

47

Ви можете це зробити безпосередньо за допомогою URL-адреси HTTPS так:

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

Наприклад, це також працює лише додаючи цей рядок до вимог.txt у проекті Django .


19
Однак для приватних репостів це призведе до запуску запиту на ім’я користувача / пароля на консолі, що, мабуть, не те, що ви хочете.
лукавство

31

Він також працює з Bitbucket :

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

Pip використовуватиме ваші SSH ключі в цьому випадку.


16

Мені було набагато простіше використовувати лексеми, ніж SSH-ключі. Я не міг знайти багато хорошої документації з цього приводу, тому я натрапив на це рішення головним чином шляхом спроб та помилок. Крім того, встановлення з pip та setuptools має деякі тонкі відмінності; але цей спосіб повинен працювати для обох.

GitHub (зараз, станом на серпень 2016 року) не пропонує простий спосіб отримати 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 немає жодного пакету . Це повинно бути фактичне число, а не слово.
  • Вам потрібно передмовити, git+щоб сказати setuptools, що це клонувати сховище, а не вказувати на zip / tarball
  • version може бути гілкою, тегом або хешем фіксації
  • Вам потрібно поставити --process-dependency-linksпри установці з pip

1
Примітка setup.pyне повинна містити конкретних залежностей, лише абстрактні. Це визначає конкретну залежність від setup.py.
Хорхе

1
З випуском pip версії 19.0 - опція -процес-залежність-посилання застаріла.
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/…
сфера

15

Я розібрався з способом автоматичного "встановлення файлів" приватного сховища 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 - це URL-адреса для вашого примірника GitLab. IdentifyFile - це шлях до файлу ключа SSH, який ви створили на першому кроці.

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

Наведіть SSH на файл конфігурації

оксид дав нам рецепт використання 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
Довідка B


7

Під час встановлення з GitHub я міг користуватися:

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

Але, оскільки мені довелося запустити pip sudo, ключі SSH вже не працювали з GitHub, і "git clone" не вдався до "Permissions disabled (publickey)". Використання git+httpsдозволило мені запустити команду як sudo, і GitHub запитав мене про мого користувача / пароль.

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

Чи потрібні інші облікові записи користувачів для доступу до вашого проекту? Якщо ні, то ви виявили пропозицію недоброзичливця?
Майкл - Де Клей Ширкий

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, ви можете додати ім’я користувача та пароль у URL-адресі HTTPS.

Код нижче передбачає, що у робочому каталозі, який містить ваш пароль, у вас є файл під назвою "пройти".

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

Чи цей штемпель вашого пароля в простому тексті у якомусь конфігураційному файлі?
Майкл - Де Клей Ширкі

0

Для цієї відповіді добре відповідати розчин оксиду . Я просто хочу зазначити, що вам потрібно бути обережними, якщо ви встановлюєте, використовуючи, sudoоскільки ключі також повинні зберігатися для root (наприклад, /root/.ssh).

Потім ви можете набрати

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

6
Просте рішення: не встановлюйте судо. Замість цього використовуйте --userпрапор або virtualenv.
nerdwaller

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). У вас вийде щось подібне:

  • 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

Що ви маєте на увазі під "скопіювати команду git clone" ? Ви маєте на увазі "копіювати за допомогою команди" git clone " ? Або "скопіюйте команду" git clone " ? Або щось інше? (Будь ласка, дайте відповідь, відредагувавши свою відповідь , а не тут, у коментарях (якщо потрібно). Дякую заздалегідь.).
Пітер Мортенсен

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.