Можно ли использовать 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
Возможно ли то, что я пытаюсь сделать? Если да, как мне это осуществить?
5 ответ(ов)
Если у вас есть локально клонированный приватный репозиторий, вы можете воспользоваться следующим методом:
pip install git+file://c:/repo/directory
Более современный подход заключается в использовании слишком простого способа — просто выполните следующую команду (использование ключа -e
позволит вам не коммитить изменения перед их применением):
pip install -e C:\repo\directory
Этот способ хорош тем, что при внесении изменений в код они сразу же будут отражаться в вашем окружении без необходимости дополнительного коммита.
Если вы хотите установить зависимости из файла требований на 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}
.
Этот метод имеет явное преимущество: у вас есть единый файл требований, который содержит все ваши зависимости.
Если вам нужно сделать это в виде однострочника в командной строке, это также возможно. Я смог сделать это для развертывания на Google Colab:
- Создайте токен доступа (Personal Access Token): https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token
- Выполните команду:
pip install git+https://<USERNAME>:<PERSONAL_ACCESS_TOKEN>@github.com/<ACCOUNT>/<REPOSITORY>.git
Синтаксис для файла требований можно найти здесь:
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
если вы хотите, чтобы он был просто установлен.
Когда я устанавливал пакет с 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 запросил у меня имя пользователя и пароль.
Вот как выглядит команда с https
:
sudo pip install git+https://github.com/<username>/<projectname>.git#egg=<eggname>
Таким образом, если у вас возникают проблемы с SSH-ключами при использовании sudo
, попробуйте использовать HTTPS вместо SSH.
Установка пакета из ветки Git-репозитория с помощью pip
Узнать, какая версия пакета установлена с помощью pip
Как заставить pip переустановить текущую версию?
Как справиться с несколькими версиями Python и PIP?
Как исправить ошибку "error: externally-managed-environment" при использовании pip 3?