是否有可能使用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