Можно ли использовать 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
Это, конечно, неправильный ответ, но клонирование репозитория вручную, а затем указание pip на 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
Даррен Вебер,

Ответы:


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/… . Любая помощь будет отличной.
Роби

2
Отлично. Ввод git+ssh://git@github.com/echweb/echweb-utils.gitв requirements.txtработу тоже, что потрясающе.
Авиндра Гулчаран

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
Это было довольно полезно. Очевидно, локальные изменения должны быть git-commit'd, прежде чем они могут быть установлены через pip.
ramhiser

5
Это правда - он извлекает его из репозитория git (в .git), а НЕ из рабочих копий файлов.
Скотт Стаффорд,

47

Вы можете сделать это непосредственно с URL-адресом HTTPS следующим образом:

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

Это также работает, просто добавляя эту строку в файл require.txt , например, в проекте Django .


19
Для частных репозиториев, однако, это вызовет запрос имени пользователя / пароля на консоли, что, вероятно, не то, что вам нужно.
гулял

31

Он также работает с Bitbucket :

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

Пип будет использовать ваши 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при установке из пипса

1
Примечание setup.pyне должно содержать конкретных зависимостей, только абстрактные. Это указывает на конкретную зависимость от setup.py.
Хорхе Лейтао

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/…
сфера

15

Я нашел способ автоматически 'pip установить' частный репозиторий GitLab, который не требует ввода пароля. Этот подход использует GitLab «Deploy Keys» и файл конфигурации 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 «Deploy Keys».

Протестируйте новый ключ развертывания

Следующая команда указывает SSH использовать ваш новый ключ развертывания для установки соединения. В случае успеха вы должны получить сообщение: «Добро пожаловать в GitLab, UserName!»

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

Создайте файл конфигурации SSH

Затем используйте редактор для создания ~/.ssh/configфайла. Добавьте следующее содержимое. Значение 'Host' может быть любым, чем вы хотите (просто запомните это, потому что вы будете использовать его позже). HostName - это URL-адрес вашего экземпляра GitLab. IdentifyFile - это путь к файлу ключа SSH, который вы создали на первом шаге.

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

Укажите SSH на файл конфигурации

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

Теперь пакет должен быть установлен без запроса пароля.

Ссылка А
Ссылка Б


7

Когда я устанавливал с GitHub, я мог использовать:

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

Но, поскольку мне пришлось запускать pip as sudo, ключи SSH больше не работали с GitHub, и «git clone» завершился ошибкой «Permission denied (publickey)». Использование git+httpsпозволило мне выполнить команду от имени sudo, и GitHub попросил у меня мой логин / пароль.

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

Нужны ли другим учетным записям для доступа к вашему проекту? Если нет, то обнаружили ли вы предложение ботаника?
Майкл - Где Клэй Ширки

7

Вы также можете установить зависимость частного репозитория через URL-адрес git + https: //github.com / ..., указав учетные данные для входа (логин и пароль или токен развертывания) для curl с .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.

Код ниже предполагает, что у вас есть файл с именем «pass» в рабочем каталоге, который содержит ваш пароль.

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
Простое решение: не устанавливать с sudo. Вместо этого используйте --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 " ? Или что-то другое? (Пожалуйста, ответьте, отредактировав свой ответ , а не здесь, в комментариях (при необходимости). Заранее спасибо.).
Питер Мортенсен

-2

Вы можете попробовать

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

без ssh:.... Это подходит для меня.


ОП запросил github.
Каруханга
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.