pip 意外没有安装带有分支/提交固定的最新版本的 git 包

Posted

技术标签:

【中文标题】pip 意外没有安装带有分支/提交固定的最新版本的 git 包【英文标题】:pip unexpectedly not installing latest version of git package with branch/commit pinning 【发布时间】:2015-07-18 05:50:23 【问题描述】:

我有一个 requirements.txt 文件,其中包含以下行(以及其他内容):

git+https://github.com/lead-ratings/sexmachine.git@master#egg=SexMachine

当我这样做时

pip install -r requirements.txt

我明白了

Requirement already satisfied (use --upgrade to upgrade): SexMachine from git+https://github.com/lead-ratings/sexmachine.git@master#egg=SexMachine in /home/myuser/virtual_env/lib/python2.7/site-packages (from -r requirements.txt (line 38))

并且包没有更新到主版本。实际上,它保留了我之前在 requirements.txt 中列出的 PyPI 的一些旧版本。

如果我在固定中指定提交或使用--no-cache-dir 标志,它也不起作用。我正在使用 pip 6.1.1。

如果我使用 --upgrade 标志,那么它可以工作。但是,钉扎的意义何在?如果确实没有,为什么会说“要求已经满足”?

【问题讨论】:

【参考方案1】:

Pip 仅根据版本号(在 setup.py 中)决定是否满足要求。在您的情况下,您之前安装的 pypi 版本与 sexmachine 的主分支具有相同的版本号,所以 pip 什么也没做。

似乎处理这个问题的方法是始终传递-U / --upgrade 标志:

pip install -r requirements.txt -U

维护者的位置在#2835中给出:

这里 pip 的行为是正确的,我们无法确定来自包内部的项目/文件的版本号。如果他们想支持可独立识别的任意标签,他们应该让他们的 setup.py 基于此进行自我调整。

【讨论】:

但是 requirements.txt 中的分支/提交部分有什么意义呢?有人会认为 pip 正在使用指定的修订版。这真的很令人困惑。我为此打开了github.com/pypa/pip/issues/2837。 Pip 克隆分支/提交,然后查看它的 setup.py 中指定的版本号。我同意这种行为令人困惑,但在考虑了一段时间后,我倾向于同意维护者的观点。如果这是您想要的行为,那么指定 -U 确实没有什么害处,如果 vcs 要求具有相同的行为(始终更新),无论是否通过了 -U 标志,这都会有点奇怪。 但是如果我已经安装了,比如说scikit-learn==0.15,然后把requirements.txt改成scikit-learn==0.16.1,运行pip install -r requirements.txt,新版本就下载安装好了。混淆来自于将@rev 视为不是固定的。我认为这应该记录下来,因为它会导致很多错误。 同意。我已经使用这个功能很长时间了,直到遇到一个问题,迫使我阅读源代码并发现我一直误解了它是如何工作的。【参考方案2】:

在我的情况下,即使 -U--upgrade 也不起作用。 Pip 还需要 setup.py 中的版本不同才能安装新版本。通过更新 setup.py 中的包版本,它可以工作。

【讨论】:

【参考方案3】:

当我为 GitHub 上固定到特定提交的包创建带有 pip 安装的 conda 环境时,我遇到了类似的问题。然后我想用pip 将它固定到另一个提交来更新这个包。 -U 标志没有帮助。但是,--force-reinstall 标记确实如此。

【讨论】:

以上是关于pip 意外没有安装带有分支/提交固定的最新版本的 git 包的主要内容,如果未能解决你的问题,请参考以下文章

pip 安装最新版本

github怎样清除历史提交,保留最新提交

Git 简介和下载安装

如何升级到python3版本并且安装pip3及ipython3

sh 将意外提交从主分支移动到新分支

求教ubuntu 如何安装最新版本的 python pip 等工具