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

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


person Adam J. Forster    schedule 28.01.2011    source источник
comment
Это, конечно, неправильный ответ, но клонирование репо вручную с последующим указанием pip на localhost вместо github поможет вам пройти через это, если вы просто пытаетесь работать продуктивно.   -  person nmichaels    schedule 28.01.2011
comment
@nmicheals Это то, что я сделал до сих пор, но мне нужно поместить это в файлы требований для развертывания на многих веб-сайтах с отдельными виртуальными именами.   -  person Adam J. Forster    schedule 28.01.2011
comment
На всякий случай: вы уже настроили поддержку ключей ssh ​​на github, верно? Если это определенно не работает .... Вы пробовали использовать git + git: // user: [email protected] / .... в качестве URI?   -  person Jason LeBrun    schedule 29.01.2011
comment
Попробуйте использовать eval $(ssh-agent); ssh-add ~/.ssh/github_id_rsa, а затем выполните установку pip, следуя pip.pypa.io/en/ стабильный / ссылка / pip_install / # git   -  person Darren Weber    schedule 16.02.2019


Ответы (17)


Вы можете использовать схему git+ssh URI, но вы должны установить имя пользователя. Обратите внимание на часть git@ в URI:

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

Также прочтите о ключах развертывания.

PS: В моей установке схема 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
person oxyum    schedule 29.01.2011
comment
Спасибо, мне просто не хватало части git @. Кстати, команда pip install git + ssh: //[email protected]/echweb/echweb-utils.git сработала, мне не нужен переключатель -e. - person Adam J. Forster; 31.01.2011
comment
вы также можете использовать файл .ssh / config для установки правильного имени пользователя - person Stefano; 12.04.2013
comment
Раньше это работало для меня, но теперь нет, я даже использую правильную схему git+ssh://[email protected]/echweb/echweb-utils.git в моем файле требований. Я открыл здесь новый вопрос: stackoverflow.com/questions/18883430/. Любая помощь была бы замечательной. - person Robeezy; 19.09.2013
comment
Это то, что мне нужно сделать с нашим внутренним (корпоративным) развертыванием github. Задокументирована ли где-нибудь часть git @? Я потратил некоторое время на поиск, прежде чем нашел ваш пост; это определенно не похоже на часть документации pip. Мне любопытно. И спасибо! - person m.kocikowski; 05.03.2014
comment
Это не специфично для pip, поэтому не является частью pip doc. Я знаю это, потому что хорошо разбираюсь в unix / ssh / git и настраиваю хостинг репо в эпоху pre-github (и pre-git). git @ part можно найти в поле github SSH clone URL для любого репо, в котором у вас есть доступ на запись. - person oxyum; 05.03.2014
comment
@ m.kocikowski git @ является частью URL-адреса. URL-адреса являются стандартными и не зависят от конкретного пакета: tools.ietf.org/html/rfc3986 - person WhyNotHugo; 26.07.2014
comment
Имеет ли значение, какое имя пользователя вы используете? - person AnnanFay; 04.11.2014
comment
Да, вы должны использовать только имя пользователя git для ssh-доступа к github и большинству других хостингов VCS. Все файлы сохраняются под одним системным пользователем (git), а разрешения управляются не ОС, а внутренним программным обеспечением. Чтобы различать пользователей, специальный ssh-daemon использует ключ, который использовался для авторизации. - person oxyum; 05.11.2014
comment
Идеально. Помещение git+ssh://[email protected]/echweb/echweb-utils.git в requirements.txt тоже работает, и это здорово. - person Avindra Goolcharan; 29.02.2016
comment
Если вам нужно запустить это из сценария (например: для развертывания ...), вы можете указать, какой ключ SSH использовать с переменной среды GIT_SSH_COMMAND="ssh -i ~/.ssh/my-deploy-key" - person Laurent S; 20.12.2016
comment
Не удалось определить название требования, укажите его с помощью # egg = - person User; 16.01.2017
comment
Если вы хотите установить из определенной ветки: pip install git+ssh://[email protected]/echweb/echweb-utils.git@branch-name - person Guilherme Beltramini; 27.06.2017
comment
/ for: был трюк. - person Jacob Lee; 06.05.2021

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

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

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

pip install -e C:\repo\directory
person Scott Stafford    schedule 21.01.2013
comment
Это было очень полезно. По-видимому, локальные изменения должны быть выполнены с помощью git-commit'd, прежде чем их можно будет установить через pip. - person ramhiser; 29.10.2013
comment
Это правда - он извлекает его из репозитория git (в .git), а НЕ из рабочих копий файлов. - person Scott Stafford; 24.10.2014

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

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

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

person danius    schedule 24.03.2013
comment
Однако для частных репозиториев это вызовет запрос имени пользователя / пароля на консоли, что, вероятно, не то, что вам нужно. - person rascalking; 27.07.2017

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

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

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

person gnrfan    schedule 21.09.2012

Я обнаружил, что использовать токены намного проще, чем ключи 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
person Maximilian    schedule 31.08.2016
comment
Примечание setup.py не должно содержать конкретных зависимостей, только абстрактные. Это указывает конкретную зависимость от setup.py. - person Jorge Leitao; 12.01.2019
comment
С выпуском pip версии 19.0 параметр --process-dependency-links устарел. - person yardstick17; 29.01.2019

Я придумал способ автоматической установки частного репозитория 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, 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://git@GitLab/my_name/my_repo.git

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

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

person JS.    schedule 02.05.2017

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

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

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

person Rachel    schedule 25.09.2012
comment
Изменился URL-адрес синтаксиса файла требований. Новый URL-адрес: pip.pypa.io/en / latest / reference / - person sphere; 22.05.2015
comment
egg - жесткое требование? Я пытаюсь установить через ssh частный пакет Python с ключом развертывания, но получаю ответ ERROR: Command errored out with exit status 128. - person Alex F; 13.10.2020

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

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

person AmirHossein    schedule 04.04.2019

Вы также можете установить зависимость частного репозитория через http://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"
person ei-grad    schedule 15.09.2016

Если вы не хотите использовать SSH, вы можете добавить имя пользователя и пароль в URL-адрес HTTPS.

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

export PASS=$(cat pass)
pip install git+https://<username>:[email protected]/echweb/echweb-utils.git
person sam    schedule 19.07.2018
comment
Это ставит ваш пароль в виде открытого текста в какой-то файл конфигурации? - person Michael; 16.06.2020

Если вам нужно сделать это, скажем, в однострочном режиме командной строки, это тоже возможно. Я смог сделать это для развертывания в Google Colab:

  1. Создайте токен персонального доступа: https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token
  2. Бег: pip install git+https://<PERSONAL ACCESS TOKEN>@github.com/<USERNAME>/<REPOSITORY>.git
person Jamie    schedule 14.08.2020
comment
Вы можете добавить комментарий, отметив, что ваш токен доступа будет в виде открытого текста и доступен для всех, кто может прочитать конфигурацию пункта. - person Michael; 18.08.2020
comment
Кроме того, теперь, когда я думаю об этом, ваш ответ является своего рода дубликатом этого ответа четырехлетней давности. - person Michael; 18.08.2020

Когда я устанавливал с 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>
person jcarballo    schedule 02.12.2013
comment
Нужен ли другим учетным записям пользователей доступ к вашему проекту? Если нет, то обнаружили ли вы предложение ботаника? - person Michael; 06.04.2017
comment
egg - жесткое требование? Я пытаюсь установить через ssh частный пакет Python с ключом развертывания, но получаю ответ ERROR: Command errored out with exit status 128. - person Alex F; 13.10.2020

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

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

sudo pip install git+ssh://[email protected]/echweb/echweb-utils.git
person Andres Romero    schedule 12.01.2015
comment
Простое решение: не устанавливайте с помощью sudo. Вместо этого используйте флаг --user или virtualenv. - person nerdwaller; 12.11.2015

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

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

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

person zolty13    schedule 24.05.2018

Просто скопируйте пульт из исходной команды git clone (или из git remote -v). У вас получится что-то вроде этого:

Затем вам нужно заменить : на / рядом с именем домена.

Итак, установите, используя:

pip install git+ssh://[email protected]/your_account/my_pro.git
person Mohideen bin Mohammed    schedule 04.11.2019
comment
Что вы имеете в виду под командой copy git clone? Вы имеете в виду копировать с помощью команды git clone? Или скопируйте команду git clone? Или что-то другое? (Пожалуйста, ответьте, отредактировав свой ответ, а не здесь, в комментариях (при необходимости). Заранее спасибо.). - person Peter Mortensen; 12.12.2019
comment
если вы посетите веб-сайт репозитория и нажмете кнопку клонирования вверху, BB и github покажут вам команду клонирования для репо. - person florian; 28.07.2020

Мой случай был немного сложнее, чем большинство описанных в ответах. Я был владельцем двух частных репозиториев repo-A и repo-B в организации Github, и мне нужно было pip install repo-A во время python юнит-тестов repo-B, как действие Github.

Шаги, которые я предпринял для решения этой задачи:

  • Создан Токен личного доступа для моей учетной записи. Что касается его разрешений, мне нужно было оставить только те, что по умолчанию, т. Е. репо - полный контроль над личными репозиториями.
  • Создан секрет репозитория в repo-B , вставил туда свой токен личного доступа и назвал его PERSONAL_ACCESS_TOKEN. Это было важно, потому что, в отличие от решения, предложенного Джейми, мне не нужно было явно выставить мой драгоценный необработанный токен личного доступа внутри файла .yml действия github.
  • Наконец, я pip install обработал пакет из исходного кода через HTTPS следующим образом export PERSONAL_ACCESS_TOKEN=${{ secrets.PERSONAL_ACCESS_TOKEN }} && pip install git+https://${PERSONAL_ACCESS_TOKEN}@github.com/MY_ORG_NAME/MY_REPO_NAME.git
person pcko1    schedule 25.12.2020

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

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

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

person user2235670    schedule 05.03.2018
comment
OP запросил github. - person Karuhanga; 02.01.2020
comment
Я нашел это полезным. - person jan groth; 23.05.2021