Можно ли использовать pip для установки пакета из частного репозитория github?

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

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

Ответ 1

Вы можете использовать схему URI git+ssh, но вы ДОЛЖНЫ установить имя пользователя:

pip install git+ssh://[email protected]/echweb/echweb-utils.git

См. [email protected] часть в URI?

PS: Также прочтите развернуть ключи.

PPS: В моей установке схема URI "git + ssh" работает только с "редактируемыми" требованиями:

pip install -e URI#egg=EggName

Запомнить. Измените символ :, который git remote -v печатает на символ / перед использованием удаленного адреса в команде pip:

$ git remote -v
origin  [email protected]: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

Ответ 2

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

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

EDIT: более современно вы можете просто сделать это (и -e будет означать, что вам не нужно фиксировать изменения до их отражения):

pip install -e C:\repo\directory

Ответ 3

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

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

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

Ответ 4

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

pip install git+ssh://[email protected]/username/projectname.git

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

Ответ 5

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

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

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

Ответ 6

Я нашел способ автоматически '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 [email protected]

Создайте файл конфигурации 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://[email protected]/my_name/my_repo.git

Нам просто нужно немного его изменить, чтобы SSH использовал наш новый ключ развертывания. Мы делаем это, указывая SSH на запись Host в файле конфигурации SSH. Просто замените "gitlab.mycorp.com" в команде на имя хоста, которое мы использовали в конфигурационном файле SSH:

pip install git+ssh://[email protected]/my_name/my_repo.git

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

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

Ответ 7

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

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

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

Ответ 8

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

pip install git+ssh://[email protected]/<username>/<projectname>.git#egg=<eggname>

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

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

Ответ 9

Вы также можете установить частную зависимость репо через 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"

Ответ 10

решение oxyum's одобрено для этого ответа, я просто хочу указать, что вам нужно быть осторожным, если вы устанавливаете с помощью sudo, поскольку ключи должны быть также хранится для корня (например, /root/.ssh).

Затем вы можете ввести

sudo pip install git+ssh://[email protected]/echweb/echweb-utils.git

Ответ 11

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

pip install [email protected]/my_name/my_repo.git

без SSH:... Это работает для меня.

Ответ 12

Если у вас есть собственная библиотека/пакет в github/gitlab и т.д., Вам нужно добавить тег для фиксации с конкретной версией библиотеки, например, v2.0, тогда вы можете установить свой пакет

pip install git+ssh://link/name/[email protected]

Это работает для меня. Другие решения не спомогли мне.

Ответ 13

Если вы не хотите использовать ssh, вы можете добавить имя пользователя и пароль в URL-адресе https.
Код ниже предполагает, что у вас есть файл с именем "pass" в рабочем каталоге, который содержит ваш пароль.

export PASS=$(cat pass)    
pip install git+https://<username>:[email protected]/echweb/echweb-utils.git

Ответ 14

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

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