Можно ли использовать 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

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

13 ответов


можно использовать 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 печатает на / символ перед использованием адреса пульта в :

$ 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

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

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

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

pip install -e C:\repo\directory

вы можете сделать это непосредственно с URL HTTPS, как это:

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

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


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

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

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


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

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

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


я нашел, что гораздо проще использовать токены, чем ключи 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

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

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

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

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

я понял, как автоматически "pip install" частный репозиторий 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 "развернуть ключи".

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

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

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

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

затем используйте редактор для создания . Добавьте следующее содержимое. Значение 'Host' может быть любым вы хотите (просто помните об этом, потому что вы будете использовать его позже). Имя хоста-это 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 на Хост в файл SSH конфиг. Просто замените ...gitlab.mycorp.com ' в команде имени хоста, которое мы использовали в конфигурационном файле SSH:

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

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

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


вы также можете установить зависимость частного РЕПО через git+https://github.com/... URL, предоставив учетные данные для входа (логин и пароль, или развернуть маркер) для curl С :

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"

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

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

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


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

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

без ssh:... Это моя работа.


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

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

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


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

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