是否有可能使用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
我想这是因为我正在尝试访问私有存储库,而不提供任何身份validation。 因此,我试图使用git + ssh希望pip可以使用我的ssh公钥进行身份validation:
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
有没有人知道我试图达到甚至可能吗? 如果可以,请告诉我如何?
你可以使用git+ssh
URIscheme,但你必须设置用户名:
pip install git+ssh://git@github.com/echweb/echweb-utils.git
看到git@
部分到URI?
PS:还阅读关于部署密钥 。
PPS:在我的安装中,“git + ssh”URIscheme只适用于“可编辑”的要求:
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
作为一种附加技术,如果您有本地克隆的私有存储库,则可以执行以下操作:
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中追加这行。
也适用于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密钥容易得多。 我找不到很好的文档,所以主要是通过试验和错误的方式来find这个解决scheme。 此外,从pip和setuptools安装有一些细微的差异; 但这种方式应该为两者工作。
GitHub不(现在,截至2016年8月)提供了一个简单的方法来获得私人回购的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进行身份validation; 我发现的最简单的方法是创build一个oauth标记,将其放入您的环境中,然后将其包含在URL中
- 即使PyPI上没有包,也需要在链接的末尾包含一些版本号(这里是
0
)。 这必须是一个实际的数字,而不是一个字。 - 你需要用
git+
作为前言来告诉setuptools克隆repo,而不是指向一个zip / tarball -
version
可以是分支,标签或提交哈希 - 如果从pip安装,则需要提供
--process-dependency-links
当我从github安装时,我能够使用:
pip install git+ssh://git@github.com/<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>
您还可以通过提供login凭据(login名和密码,或部署令牌)来使用.netrc
文件进行curl ,从而通过git + https://github.com / … URL安装私人回购依赖项:
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的“部署密钥”和一个SSHconfiguration文件,所以你可以使用除个人SSH密钥(在我的情况下,为“机器人”使用)以外的密钥进行部署。 也许有人可以用GitHub来validation。
创build一个新的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的“部署密钥”对话框中。
testing新的部署密钥
以下命令告诉SSH使用您的新部署密钥来build立连接。 成功之后,您应该看到以下消息:“欢迎使用GitLab,UserName!”
ssh -T -i ~/.ssh/GitLab_Robot_Deploy_Key git@gitlab.mycorp.com
创buildSSHconfiguration文件
接下来,使用编辑器创build一个~/.ssh/config
文件。 添加以下内容。 “主机”的价值可以是任何你想要的(只要记住它,因为你将在以后使用它)。 HostName是你的GitLab实例的URL。 IdentifyFile是您在第一步中创build的SSH密钥文件的path。
Host GitLab HostName gitlab.mycorp.com IdentityFile ~/.ssh/GitLab_Robot_Deploy_Key
将SSH指向configuration文件
@oxyum给了我们与SSH使用点子的配方:
pip install git+ssh://git@gitlab.mycorp.com/my_name/my_repo.git
我们只需要修改一下,使SSH使用我们的新部署密钥。 我们通过将SSH指向SSHconfiguration文件中的主机条目来实现这一点。 只需将命令中的“gitlab.mycorp.com”replace为我们在SSHconfiguration文件中使用的主机名:
pip install git+ssh://git@GitLab/my_name/my_repo.git
该软件包现在应该没有密码提示安装。
参考A
参考文献B
oxyum的解决scheme是可以的这个答案,我只想指出,你需要小心,如果你正在安装使用sudo
键也必须存储为根(例如/root/.ssh
)。
然后你可以input
sudo pip install git+ssh://git@github.com/echweb/echweb-utils.git