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

我试图从一个私有的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

我想要达到的目标可能吗?如果有,我该怎么做?

358319 次浏览

你可以使用git+ssh URI方案,但你必须设置一个用户名。注意URI中的git@部分:

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

也可以阅读部署的钥匙

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

pip install -e URI#egg=EggName

还记得:在使用pip命令中的远程地址之前,将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

它也适用于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

如果你只是想安装它。

作为一个额外的技术,如果你有本地克隆的私有存储库,你可以这样做:

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

更现代的说法是,你可以这样做(而-e将意味着你不必在更改被反映之前提交更改):

pip install -e C:\repo\directory

你可以像这样直接使用HTTPS URL:

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

例如,这也可以在Django项目的requirements.txt中添加这一行。

当我从GitHub安装时,我能够使用:

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

但是,由于我必须作为sudo运行pip, SSH密钥不再与GitHub一起工作,并且“git克隆”在“权限被拒绝(publickey)”上失败。使用git+https允许我作为sudo运行命令,并让GitHub询问我的用户/密码。

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

oxyum的解决方案是OK的这个答案。我只是想指出,如果你使用sudo进行安装,你需要小心,因为密钥也必须存储在根目录下(例如,/root/.ssh)。

然后你可以打字

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

我发现使用令牌比使用SSH密钥容易得多。我找不到太多关于这方面的好的文档,所以我主要是通过反复试验找到这个解决方案的。此外,从pip和setuptools安装有一些细微的区别;但这种方法应该对双方都有效。

GitHub(目前,截至2016年8月)没有提供一个简单的方法来获得私有存储库的压缩/压缩包。所以你需要告诉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可以是一个分支,一个标签,或者一个提交散列
  • 如果从pip安装,则需要提供--process-dependency-links

你也可以通过git + https://github.com/..。 URL通过.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"

我想出了一个不需要密码提示就能自动“pip安装”GitLab私有存储库的方法。这种方法使用GitLab“部署密钥”和一个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 git@gitlab.mycorp.com

2 .创建SSH配置文件

接下来,使用编辑器创建~/.ssh/config文件。添加如下内容。'Host'值可以是您想要的任何值(请记住它,因为稍后将使用它)。HostName是到GitLab实例的URL。IdentifyFile是在第一步中创建的SSH密钥文件的路径。

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

将SSH指向配置文件

Oxyum给了我们在SSH中使用pip的方法:

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

我们只需要稍微修改一下,让SSH使用我们新的部署密钥。我们通过将SSH指向SSH配置文件中的Host条目来做到这一点。只需将命令中的'gitlab.mycorp.com'替换为我们在SSH配置文件中使用的主机名:

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

现在安装包时应该没有任何密码提示。

< p > 引用一个
引用B < / p >

你可以试试

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,可以在HTTPS URL中添加用户名和密码。

下面的代码假设在工作目录中有一个名为“pass”的文件,其中包含您的密码。

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

如果你想在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}

这种方法有明显的优点。您有一个包含所有依赖项的需求文件。

只需从原始的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

如果需要在命令行一行程序中执行此操作,也可以这样做。我能够这样做部署在谷歌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

我的情况比答案中描述的大多数情况都要复杂。我是Github组织中两个私有存储库repo_Arepo_B的所有者,在repo_B作为一个Github行动python单元测试期间需要pip install repo_A

我解决这个问题的步骤是:

  • 为我的帐户创建了个人访问令牌。至于它的权限,我只需要保持默认的权限,即。repo -完全控制私有存储库
  • repo_B下创建了库的秘密,将我的个人访问令牌粘贴在那里,并将其命名为PERSONAL_ACCESS_TOKEN这很重要是因为,与杰米提出的解决方案不同,我不需要显式地在github动作.yml文件中暴露我宝贵的原始个人访问令牌。
  • 最后,pip install包从源通过HTTPS ( SSH),如下所示:
export PERSONAL_ACCESS_TOKEN=$\{\{ secrets.PERSONAL_ACCESS_TOKEN }}


pip install git+https://${PERSONAL_ACCESS_TOKEN}@github.com/MY_ORG_NAME/repo_A.git