如果我使用https://pip.pypa.io/en/stable/reference/pip_install/#git从git安装软件包 签出的具体提交是否记录在某处?
答案 0 :(得分:4)
您可以使用knittl's idea查找最近的提交 - 下面的唯一修改是解决您将git树与已安装的软件包进行比较的事实,而不是git存储库:
由于安装的包可能缺少git的一些目录结构
存储库,为git repo创建一个新目录。我将使用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提交。
如果git历史记录很长,您可能希望将git rev-list --all
修改为一系列提交。例如,使用git rev-list tag1..tag2
在两个标记之间进行搜索。如果您大致了解软件包的安装时间,那么您可能会对使用的标签有一个很好的猜测。使用git tag
显示可能的标记的名称。
有关更多选项,请参阅the docs。
答案 1 :(得分:2)
一种可能的替代方法是使用pip install --editable
。在这种情况下,pip
会将repo克隆到$PREFIX/src/$egg_name
(其中$PREFIX
是您的virtualenv目录或当前工作目录),然后只需创建并egg-link
指向该路径。这样,您就可以轻松检查克隆仓库的当前版本。
另一方面,以这种方式安装的软件包可能具有与以常规方式安装的软件包不同的文件结构。所以在某些情况下,这不会起作用。
答案 2 :(得分:1)
不是。如果您只是想知道 - 在已安装分支的头部查找提交。如果要安装特定提交 - 请为提交命名。例如:
pip install git+https://github.com/sqlobject/sqlobject.git@623a5802#egg=sqlobject
答案 3 :(得分:0)
我可以轻松找到我的软件包的提交哈希。
我使用了Cookie Cutter工具来生成我的python包结构。当我从GitLab存储库安装软件包时,在我的Python <package-name>-<version>.dist-info
目录中会生成一个名为Lib
的目录。
有一个文件direct_url.json
记录了存储库的commit_id:
我真的不知道这是从git repo进行安装还是由Cookie Cutter设置生成的工件时的通用解决方案。