Package: python-git-info
python-git-infoA very simple project to get information from the git repository of your project.
This package does not have any dependencies; it reads directly the data from the
.git repository.InstallationJust do apip install python-git-info. This project should work with both python 2.7 and 3.x.UsageThis app will search the current directory for a.gitdirectory (which is
always contained inside the root directory of a project). If one is found
it will be used; else it will search the parent directory recursively until a.gitis found.There's a single function nameget_git_info()with an optionaldirparameter.
If you leave it empty it will start the.gitdirectory search from the current directory,
if you provide a value fordirit will start from that directory. Theget_git_infowill return a dictionary with the following structure if everything works ok orNoneif something fishy happend or no.gitfolder was found:>> 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'
  }You can also use it directly from the command line, f.e to get the info from the current directory:python -c "import gitinfo; print(gitinfo.get_git_info())".You can even do some funny stuff with jq if you convert that struct to json:python -c "import gitinfo, json; print(json.dumps(gitinfo.get_git_info()))" | jq .commit
"92c76134aa108de6fcd39462ed2c9bc72fad4d01"Notice thatrefsis the current branch.How it worksThis project will return the info from the latest commit of yourcurrentbranch. To do this, it will read the.git/HEADfile which contains your current branch (i.e something likeref: refs/heads/master). It will then read the file it found there (i.e.git/refs/heads/master) to retrieve the actual sha of the latest commit, something like8f6223c849d4bba75f037aeeb8660d9e6e306862.This object is located in.git/objects/8f/6223c849d4bba75f037aeeb8660d9e6e306862(notice
the first two characters are a directory name and the rest is the actual filename). This
is a zlib compressed folder. After it is uncompressed it has a simple format; I'm
copying from the git internals manual:The format for a commit object is simple: it specifies the top-level tree for the snapshot of the project at that point; the parent commits if any (the commit object described above does not have any parents); the author/committer information (which uses your user.name and user.email configuration settings and a timestamp); a blank line, and then the commit message.So a sample commit message file would be something like this:tree fa077d18fe3309aa12791dad2f733bfbb50fdee6
parent 943f6e8e3641ea38a9d9db3256944b46bcfc1f77
author Serafeim Papastefanos <spapas@example.com> 1562836041 +0300
committer Serafeim Papastefanos <spapas@example.com> 1562836041 +0300

prep new verThe "pack" of snakesUntil now everything seems like sunshine; unfortunately there's a can of snakes in this process or better apackof snakes: Non trivial git repositories will
compress the contents of their.git/objectsfolder to save network (and disk) space to a file ending with.pack. This file is a dump of all the (zlib compressed)
object your repository contains (including the commit messages of course) and is accompanied by a.idxobject which says where each object can be found in the
pack file. You can find these files in.git/objects/packfolder (if your repository has them of course).In any case, the process of reading the.idxfile to find the index of your commit and then reading that from the.packfile is not trivial; if you want
to learn more about it you can check out this excellent resource:https://codewords.recurse.com/issues/three/unpacking-git-packfilesOr you can take a look at my code at thepack_readermodule which I tried to heavily comment to improve understanding.RationaleThis project may seem useless or very useful, depending on the way you deploy to your servers. If you, like me, push every changeset to your VCSbeforedeploying and then pull the changes from the remote server to actually deploy then you'll find this project priceless: You can easily add the latest commit information to somewhere in your web application so you'll be able to see immediately which changeset is deployed to each server without the need to actually login to the server and do agit log.Also it is important to add here that this project is pure python and does not have
any external dependencies (not evengit); making it very easy to install and
use in any project.Changes0.8.3Make it work with empty head refs0.8.2Try the pypi github action0.8.1Fix bug in decode_delta0.8.0Add logging output for errorsUse black to format files0.7.6Fix bug with get_head_commit0.7.5Add current branch asrefs0.7.4Add gh action to deploy with tags0.7.3Remove debug0.7.2Fix endianess bug0.7.1Improve parsing of multi-line messages0.7Various fixes to support more git repositories0.6.1Remove non-needed print stmts0.6It now parses the pack file to retrieve the commit object if it is packed!0.5Change the parsing algorithm from using.git/logsto parse the real commit object inside the.git/objectsfolder.0.4Add more error checks0.3Make it work with '..'0.2Initial