Можно ли использовать pip для установки пакета из частного репозитория GitHub? - PullRequest
293 голосов
/ 28 января 2011

Как следует из названия, я пытаюсь установить пакет 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

Возможно ли то, что я пытаюсь достичь, возможно? Если да, то как я могу это сделать?

Ответы [ 14 ]

304 голосов
/ 29 января 2011

Вы можете использовать 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
65 голосов
/ 21 января 2013

В качестве дополнительной техники, если у вас есть локальный клонированный локальный репозиторий, вы можете сделать:

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

РЕДАКТИРОВАТЬ: Более современно, вы можете просто сделать это (и -e будет означать, что вам не нужно фиксировать изменения, прежде чем они будут отражены):

pip install -e C:\repo\directory
45 голосов
/ 24 марта 2013

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

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

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

24 голосов
/ 21 сентября 2012

Также работает с Bitbucket:

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

В этом случае Пип будет использовать ваши SSH-ключи.

14 голосов
/ 25 сентября 2012

Синтаксис для файла требований приведен здесь:

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

, если вы просто хотите, чтобы она была установлена.

11 голосов
/ 03 мая 2017

Я нашел способ автоматически '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, имя пользователя!»

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

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

Ссылка A
Ссылка B

11 голосов
/ 31 августа 2016

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

GitHub не предлагает (в настоящее время по состоянию на август 2016 года) простой способ получить zip / tarball для частных репозиториев. Поэтому вам нужно указать setuptools, чтобы сообщить setuptools, что вы указываете на git-репо:

from setuptools import setup
import os
# get 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
7 голосов
/ 03 декабря 2013

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

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

НО, поскольку мне приходилось запускать pip как sudo, ключи SSH больше не работали с github, "git clonemsgstr "не удалось включить" Отказано в доступе (publickey) ".Использование git+https позволило мне выполнить команду от имени sudo, и github попросил у меня мой логин / пароль.

sudo pip install git+https://github.com/<username>/<projectname>.git#egg=<eggname>
5 голосов
/ 15 сентября 2016

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

Если вы хотите установить зависимости из файла требований на сервере 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}.

Этот метод имеет явное преимущество: у вас есть один файл требований, который содержит все ваши зависимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...