获取git信息存储库,直接从.git
项目描述
python-git-info
一个非常简单的项目,可以从您的项目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
- 初始