是否可以使用pip从私有github存储库安装包?

时间:2011-01-28 16:52:32

标签: python git github pip

正如标题所示,我试图从私有github仓库安装一个python包。对于公共存储库,我可以发出以下命令,该工作正常:

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

有谁知道我想要达到的目标是否可能?如果是这样,请告诉我怎么做?

18 个答案:

答案 0 :(得分:294)

您可以使用git+ssh URI方案,但必须设置用户名:

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

git@ 部分纳入URI?

PS:另请阅读deploy keys

PPS:在我的安装中,“git + ssh”URI方案仅适用于“可编辑”要求:

pip install -e URI#egg=EggName

记住:在使用:命令中的远程地址之前,将git remote -v打印的/字符更改为pip字符:< / p>

$ 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

答案 1 :(得分:64)

作为一种额外的技术,如果您在本地克隆了私有存储库,则可以执行以下操作:

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

编辑:更现代化,您可以这样做(-e意味着您不必在反映之前提交更改):

pip install -e C:\repo\directory

答案 2 :(得分:45)

您可以使用HTTPS URL直接执行此操作:

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

例如,这也只是在django项目的requirements.txt中附加该行。

答案 3 :(得分:24)

也适用于Bitbucket:

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

在这种情况下,Pip将使用您的SSH密钥。

答案 4 :(得分:14)

需求文件的语法如下:

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

如果您只是想安装它。

答案 5 :(得分:11)

我找到了一种自动化的方法来安装&#39;一个不需要密码提示的GitLab私有存储库。这种方法使用GitLab&#34; Deploy Keys&#34;和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&#34;部署密钥&#34;对话框。

测试新部署密钥

以下命令告诉SSH使用新的部署密钥来设置连接。成功之后,您应该收到消息:&#34;欢迎使用GitLab,用户名!&#34;

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

创建SSH配置文件

接下来,使用编辑器创建~/.ssh/config文件。添加以下内容。主持人&#39;价值可以是你想要的任何东西(只记得它,因为你以后会用它)。 HostName是GitLab实例的URL。 IdentifyFile是您在第一步中创建的SSH密钥文件的路径。

Host GitLab
  HostName gitlab.mycorp.com
  IdentityFile ~/.ssh/GitLab_Robot_Deploy_Key

将SSH指向Config文件

@oxyum向我们提供了使用pip和SSH的方法:

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

我们只需稍微修改它以使SSH使用我们新的Deploy Key。我们通过将SSH指向SSH配置文件中的Host条目来实现。只需更换&#39; gitlab.mycorp.com&#39;在我们在SSH配置文件中使用的主机名的命令中:

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

现在应该在没有密码提示的情况下安装软件包。

Reference A
Reference B

答案 6 :(得分:11)

我发现使用令牌比使用SSH密钥更容易。我在这方面找不到很好的文档,所以主要通过试用和解决方案来解决这个问题。错误。此外,从pip&amp; amp; setuptools有一些微妙的差异;但这种方式应该适用于两者。

GitHub(目前,截至2016年8月)提供了一种简单的方法来获取私人回购的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可以是分支,标记或提交哈希
  • 如果从pip
  • 安装,则需要提供--process-dependency-links

答案 7 :(得分:7)

当我从github安装时,我可以使用:

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

但是,因为我必须以sudo运行pip,所以SSH密钥不再使用github,“git clone”在“Permission denied(publickey)”上失败。使用git+https允许我以sudo的身份运行命令,让github问我用户/密码。

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

答案 8 :(得分:5)

您还可以通过git+https://github.com/... URL为curl提供enter image description here的登录凭据(登录名和密码或部署令牌),通过{{3}} URL安装私人仓库依赖项:

.netrc

答案 9 :(得分:3)

例如,如果您需要在命令行单行代码中执行此操作,则也可以。我能够在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

答案 10 :(得分:1)

如果要从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-tokenGIT_PASS=${CI_JOB_TOKEN}

此方法有一个明显的优势,您只有一个包含所有依赖项的需求文件。

答案 11 :(得分:0)

oxyum's解决方案可以解决这个问题,我只是想指出,如果使用sudo进行安装则需要小心,因为必须为root存储密钥(例如{{ 1}})。

然后你可以输入

/root/.ssh

答案 12 :(得分:0)

你可以尝试

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

没有ssh:......那对我有用。

答案 13 :(得分:0)

如果您在github / gitlab等上有自己的库/数据包,则必须添加标记以提交具体版本的库,例如v2.0然后你可以安装你的数据包

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

这对我有用。其他解决方案对我没用。

答案 14 :(得分:0)

如果不想使用ssh,则可以在https url中添加用户名和密码。
下面的代码假定您在工作目录中有一个包含密码的名为“ pass”的文件。

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

答案 15 :(得分:0)

只需从原始git clone命令(或从git remote -v)复制遥控器。您将得到如下内容:

  • Bitbucket: git+ssh://git@bitbucket.org:your_account/my_pro.git

  • GitHub: git+ssh://git@github.com:your_account/my_pro.git

下一步,您需要将 : 替换为域名旁边的 /

因此请使用:

pip install git+ssh://git@bitbucket.org/your_account/my_pro.git

答案 16 :(得分:0)

这是一种对我有用的快速方法。只需分叉存储库并使用

从您自己的GitHub帐户安装它
pip install git+https://github.com/yourName/repoName

答案 17 :(得分:0)

我的案例比答案中描述的大多数案例都要复杂。我是 Github 组织中两个私有存储库 repo-Arepo-B 的所有者,并且需要在 pip install repo-A、{{3} 的 python 单元测试期间repo-B }.

我为解决此任务而遵循的步骤:

  • 为我的帐户创建了一个 as a Github action。至于它的权限,我只需要保留默认的,即repo - 完全控制私有仓库
  • repo-B 下创建了一个 Personal Access Token,将我的个人访问令牌粘贴到其中并将其命名为 PERSONAL_ACCESS_TOKEN这很重要,因为与 repository secret 提出的解决方案不同,我不需要在 github 操作 .yml 文件中明确公开我宝贵的原始个人访问令牌。立>
  • 最后,我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
相关问题