跳转到主要内容

获取git信息存储库,直接从.git

项目描述

python-git-info

PyPi version

一个非常简单的项目,可以从您的项目git存储库中获取信息。此软件包没有任何依赖项;它直接从.git存储库中读取数据。

安装

只需执行pip install python-git-info。此项目应与python 2.7和3.x兼容。

使用方法

此应用将在当前目录中搜索.git目录(该目录始终包含在项目的根目录中)。如果找到,则使用该目录;否则,它将在父目录中递归搜索,直到找到.git为止。

有一个名为get_git_info()的单个函数,有一个可选的dir参数。如果您将其留空,它将从当前目录开始搜索.git目录;如果您为dir提供值,它将从该目录开始。如果一切正常,get_git_info将返回一个具有以下结构的字典,或者在发生意外或未找到.git文件夹时返回None


>> import gitinfo
>> gitinfo.get_git_info()

  {
    'parent_commit': 'd54743b6e7cf9dc36354fe2907f2f415b9988198', 
    'message': 'commit: Small restructuring\n', 
    'commiter': 'Serafeim <email@email.com>', 
    'commit_date': '2018-11-14 13:52:34', 
    'author': 'Serafeim <email@email.com>', 
    'author_date': '2018-11-14 13:52:34', 
    'commit': '9e1eec364ad24df153ca36d1da8405bb6379e03b',
    'refs': 'master'
  }

您还可以直接从命令行使用它,例如,获取当前目录的信息:python -c "import gitinfo; print(gitinfo.get_git_info())"

如果您将结构转换为json,您甚至可以使用jq进行一些有趣的操作。


python -c "import gitinfo, json; print(json.dumps(gitinfo.get_git_info()))" | jq .commit
"92c76134aa108de6fcd39462ed2c9bc72fad4d01"

请注意,refs 是当前分支。

工作原理

该项目将从您的当前分支的最新提交返回信息。为此,它将读取包含您当前分支的 .git/HEAD 文件(即类似于 ref: refs/heads/master 的内容)。然后,它将读取那里找到的文件(即 .git/refs/heads/master),以检索最新提交的实际 sha,例如 8f6223c849d4bba75f037aeeb8660d9e6e306862

该对象位于 .git/objects/8f/6223c849d4bba75f037aeeb8660d9e6e306862(请注意,前两个字符是目录名,其余是实际文件名)。这是一个 zlib 压缩文件夹。解压缩后,它具有简单的格式;我从 git 内部手册复制过来

提交对象的格式很简单:它指定了在该点项目的顶层树快照;如果有,指定父提交(上面描述的提交对象没有父提交);作者/提交者信息(使用您的 user.name 和 user.email 配置设置以及一个时间戳);一个空白行,然后是提交信息。

因此,一个示例提交信息文件可能如下所示

tree fa077d18fe3309aa12791dad2f733bfbb50fdee6
parent 943f6e8e3641ea38a9d9db3256944b46bcfc1f77
author Serafeim Papastefanos <spapas@example.com> 1562836041 +0300
committer Serafeim Papastefanos <spapas@example.com> 1562836041 +0300

prep new ver

“蛇的“包”

到目前为止,一切都似乎很阳光;不幸的是,这个过程中有一个“蛇罐”或者更好的说法是一个 pack:非平凡的 git 仓库会将 .git/objects 文件夹的内容压缩到一个以 .pack 结尾的文件中,以节省网络(和磁盘)空间。这个文件是存储在您的存储库中的所有(zlib 压缩的)对象的转储(包括当然提交信息),并附带一个 .idx 对象,它说明了每个对象在包文件中的位置。您可以在 .git/objects/pack 文件夹中找到这些文件(当然,如果您的存储库有这些文件的话)。

无论如何,读取 .idx 文件以找到您的提交索引,然后从 .pack 文件中读取该索引的过程并不简单;如果您想了解更多关于它的信息,您可以查看这个极好的资源:https://codewords.recurse.com/issues/three/unpacking-git-packfiles

或者您可以看看我在 pack_reader 模块中的代码,我试图添加大量注释以提高理解。

理由

这个项目可能看起来没有用或者非常有用,这取决于您如何将其部署到您的服务器上。如果您像我一样,在部署之前将每个更改集推送到您的版本控制系统(VCS),然后从远程服务器拉取更改以实际部署,那么您会发现这个项目是无价的:您可以轻松地将最新提交信息添加到您的 Web 应用程序中的某个位置,这样您就可以立即看到部署到每个服务器的哪个更改集,而无需实际登录到服务器并执行 git log

此外,重要的是要在这里指出,该项目是纯 Python 编写的,没有任何外部依赖项(甚至没有 git);这使得它在任何项目中安装和使用都变得非常容易。

变更

0.8.3

  • 使其能够处理空的 head 引用

0.8.2

  • 尝试 pypi github 操作

0.8.1

  • 修复 decode_delta 中的错误

0.8.0

  • 添加错误日志输出
  • 使用 black 格式化文件

0.7.6

  • 修复 get_head_commit 中的错误

0.7.5

  • 将当前分支添加为 refs

0.7.4

  • 添加 gh 操作以使用标签部署

0.7.3

  • 移除调试

0.7.2

  • 修复字节序错误

0.7.1

  • 改进多行消息的解析

0.7

  • 针对更多 git 仓库的多种修复

0.6.1

  • 移除不必要的打印语句

0.6

  • 现在它解析打包文件以检索提交对象,如果它被打包的话!

0.5

  • 将解析算法从使用 .git/logs 解析 .git/objects 文件夹中的实际提交对象。

0.4

  • 添加更多错误检查

0.3

  • 使其能够处理“..”

0.2

  • 初始

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分发

python-git-info-0.8.3.tar.gz (8.4 kB 查看哈希值)

上传时间

构建分发

python_git_info-0.8.3-py3-none-any.whl (8.9 kB 查看哈希值)

上传时间 Python 3

由支持