【问题标题】:How can I know which commit was used when installing a pip package from git?从 git 安装 pip 包时,我如何知道使用了哪个提交?
【发布时间】:2018-01-22 16:30:45
【问题描述】:

如果我使用 https://pip.pypa.io/en/stable/reference/pip_install/#git 从 git 安装一个包 签出的特定提交是否记录在某处?

【问题讨论】:

  • pip freeze 显示什么?
  • setup.py 的版本,不够具体

标签: python git pip


【解决方案1】:

事实并非如此。如果你只想知道——在已安装分支的头部查找提交。如果你想安装一个特定的提交——命名这个提交。例如:

pip install git+https://github.com/sqlobject/sqlobject.git@623a5802#egg=sqlobject

【讨论】:

  • 我想知道一个已经安装的模块的提交,并且从那时起更多的提交被添加到了分支中
  • 那你就不走运了。
【解决方案2】:

您可以使用knittl's idea 来查找最近的提交——下面唯一的修改是为了解决您将 git 树与已安装的包而不是 git 存储库进行比较的事实:

由于安装的包可能缺少一些git的目录结构 存储库,为 git 存储库创建一个新目录。我以html5lib 为例:

mkdir ~/tmp/html5lib
cd ~/tmp/html5lib/
git init

现在获取 git 树:

git remote add foreign https://github.com/html5lib/html5lib-python
git fetch foreign

将安装好的包复制到git repo中:

rsync -a ~/.virtualenvs/muffy/lib/python3.4/site-packages/html5lib ~/tmp/html5lib/

运行 git diff 将 repo 的当前状态(以及已安装包的代码)与 git 树中的每个修订版进行比较:

for REV in $(git rev-list --all); do
    echo $(git diff --shortstat foreign/master $REV) $REV ;
done | sort -n

这按更改的文件数排序,然后是插入数,然后是删除数。 输出将如下所示:

1 file changed, 3 insertions(+), 1 deletion(-) 17499b9763a090f7715af49555d21fe4b558958b
2 files changed, 10 insertions(+), 8 deletions(-) ec674a97243e76da43f06abfd0a891308f1ff801
3 files changed, 17 insertions(+), 12 deletions(-) 1a28d721091a2c433c6e8471d14cbb75afd70d1c
4 files changed, 18 insertions(+), 13 deletions(-) ff6111cd82191a2eb963d6d662c6da8fa2e7ddde
6 files changed, 19 insertions(+), 19 deletions(-) ea0fafdbff732b1272140b696d6948054ed1d6d2

每一行的最后一项是相关的 git commit。

如果 git 历史很长,您需要将 git rev-list --all 修改为一系列提交。例如,使用git rev-list tag1..tag2 在两个标签之间进行搜索。如果您知道安装包的大致时间,您可能会很好地猜测要使用哪些标签。使用git tag 显示可能标签的名称。 更多选项请参见the docs

【讨论】:

    【解决方案3】:

    一种可能的替代方法是使用pip install --editable。在这种情况下,pip 会将 repo 克隆到$PREFIX/src/$egg_name(其中$PREFIX 是您的virtualenv 目录或当前工作目录),然后只需创建并egg-link 指向该路径。这样,您就可以轻松检查克隆存储库的当前版本。

    另一方面,以这种方式安装的软件包可能与以常规方式安装的软件包具有不同的文件结构。所以在某些情况下这是行不通的。

    【讨论】:

      【解决方案4】:

      我可以很容易地找到我的一个包的提交哈希。

      我使用Cookie Cutter 工具来生成我的python 包结构。当我从 GitLab 存储库安装包时,会在我的 Python Lib 目录中生成一个名为 <package-name>-<version>.dist-info 的目录。

      有一个文件direct_url.json 记录了仓库的commit_id:

      我真的不知道这是从 git repo 进行安装时的通用解决方案,还是 Cookie Cutter 设置生成的工件。

      【讨论】:

        猜你喜欢
        • 2017-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-30
        • 1970-01-01
        相关资源
        最近更新 更多