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


349

我正在尝试从私有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

我正在努力实现的目标是否可能?如果是这样,我该怎么办?


2
当然,这不是正确的答案,但是如果您只是想提高工作效率,那么手动克隆仓库,然后将pip指向localhost而不是github,将使您摆脱困境。
nmichaels 2011年

@nmicheals到目前为止,这就是我要做的事情,但是我需要将其放入需求文件中,以便在许多具有单独的virtualenv的网站上进行部署。
亚当·福斯特

可以肯定的是:您已经在github上设置了ssh密钥支持,对吗?如果那绝对不行....您是否尝试过使用git + git:// user:pass@github.com / ....作为URI?
詹森·勒布朗

尝试使用eval $(ssh-agent); ssh-add ~/.ssh/github_id_rsa,然后按照pip.pypa.io/en/stable/reference/pip_install/#git
Darren Weber

Answers:


375

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

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

git@在URI中看到该部分了吗?

PS:另请参阅有关部署密钥

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

pip install -e URI#egg=EggName

切记:在命令中使用遥控器的地址之前:,请将要git remote -v打印的/字符更改为字符pip

$ 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

3
谢谢,我只是缺少git @部分。顺便说一句,'pip install git + ssh://git@github.com/echweb/echweb-utils.git'命令起作用了,我不需要-e开关。
亚当·福斯特

2
您还可以使用.ssh / config文件设置正确的用户名
Stefano

2
这曾经对我有用,但现在不起作用,我什至git+ssh://git@github.com/echweb/echweb-utils.git在我的需求文件中使用正确的方案。我在这里打开了一个新问题:stackoverflow.com/questions/18883430/…。任何帮助都会很棒。
Robeezy

2
完善。把git+ssh://git@github.com/echweb/echweb-utils.gitrequirements.txt的作品也是如此,这是真棒。
Avindra Goolcharan'2

2
如果要从特定分支机构安装:pip install git+ssh://git@github.com/echweb/echweb-utils.git@branch-name
Guilherme Beltramini,2017年

73

作为另一项技术,如果您在本地克隆了专用存储库,则可以执行以下操作:

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

更现代的是,您可以执行此操作(这-e将意味着您不必在更改被反映之前就提交更改):

pip install -e C:\repo\directory

9
这很有帮助。显然,本地更改必须通过git-commit'才能通过pip安装。
ramhiser

5
没错-是从git存储库(在.git中)中提取文件,而不是从文件的工作副本中提取文件。
Scott Stafford 2014年

47

您可以使用HTTPS URL直接执行此操作,如下所示:

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

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


19
但是,对于私有存储库,这将在控制台上触发用户名/密码提示,这可能不是您想要的。
2015年

31

它也可以与Bitbucket一起使用

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

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



15

我发现使用令牌比使用SSH密钥容易得多。我在这方面找不到很多好的文档,因此我主要是通过反复试验来遇到此解决方案。此外,从pip和setuptools安装有一些细微的差异。但是这种方式对两者都适用。

GitHub尚未提供(目前,截至2016年8月)提供了一种获取私有存储库zip / tarball的简便方法。因此,您需要指向setuptools来告诉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中
  • 即使在PyPI上没有任何软件包,您也需要在链接末尾包含一些版本号(在此处0)。这必须是实际数字,而不是单词。
  • 您需要以 git+序号告诉setuptools它是克隆存储库,而不是指向zip / tarball
  • version 可以是分支,标签或提交哈希
  • --process-dependency-links如果从pip安装,则需要提供

1
注意setup.py不应包含具体的依赖关系,而应仅包含抽象的依赖关系。这是对的具体依赖setup.py
豪尔赫·雷涛

1
随着pip版本19.0的发布,不赞成使用--process-dependency-links选项。
yardstick17

14

我想出了一种自动“点安装”不需要密码提示的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的“部署密钥”对话框中。

测试新的部署密钥

以下命令告诉SSH使用新的部署密钥来建立连接。成功后,您将收到消息:“欢迎使用GitLab,用户名!”

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

创建SSH配置文件

接下来,使用编辑器创建~/.ssh/config文件。添加以下内容。“主机”值可以是您想要的任何值(请记住它,因为稍后会使用它)。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使用我们的新Deploy Key。为此,我们将SSH指向SSH配置文件中的Host条目。只需将命令中的“ gitlab.mycorp.com”替换为我们在SSH配置文件中使用的主机名即可:

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

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

参考文献A
参考文献B


7

从GitHub安装时,我可以使用:

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

但是,由于我必须以pip as身份运行sudo,所以SSH密钥不再可与GitHub一起使用,并且“ git clone”在“权限被拒绝(公共密钥)”上失败。使用git+https允许我以sudo的身份运行命令,并让GitHub询问我的用户名/密码。

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

其他用户帐户是否需要访问您的项目?如果没有,您是否发现了纳德沃勒的建议?
Michael-Clay Shirky在哪里

7

您还可以通过提供登录凭据(登录名和密码,或部署令牌)通过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"

5

如果要从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}

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


3

如果您不想使用SSH,则可以在HTTPS URL中添加用户名和密码。

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

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

0

oxyum的解决方案可以解决此问题。我只想指出,如果您使用进行安装,则需要小心,sudo因为密钥也必须存储为root(例如,/root/.ssh)。

然后你可以输入

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

6
简单的解决方案:不要安装sudo。而是使用--user标志或virtualenv。
nerdwaller

0

如果您在GitHub,GitLab等上拥有自己的库/软件包,则必须添加一个标签以提交该库的具体版本,例如v2.0,然后可以安装软件包:

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

这对我有用。其他解决方案对我不起作用。


0

这是一种对我有用的快速方法。只需分叉存储库,并使用您自己的GitHub帐户进行安装即可

pip install git+https://github.com/yourName/repoName

-1

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

  • 位桶: 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

“复制git clone命令”是什么意思?您的意思是“使用'git clone'命令复制”吗?还是“复制'git clone'命令”?或者是其他东西?(请通过编辑您的答案来回答,而不是在注释中(适当时在此处)。预先感谢。)
彼得·莫滕森

-2

你可以试试

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

没有ssh:...。这对我行得通。


OP要求github。
Karuhanga
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.