I use Git to track changes on my TEX files. When producing a PDF, it would be nice to include the current branch and commit ID somewhere in the document (e.g. on the title page or in a footer).
I know that the package gitinfo2 exists but I'd rather avoid adding any hooks to Git. Besides, I am aware of this question but I would prefer a solution that does not require enabling \write18
.
Given that the name of the current branch can be found in .git/HEAD
and the current commit ID is stored in .git/refs/heads/[name of branch]
, is it possible to embed this information in the final document?
Best Answer
As stated in the question, the branch name can be extracted from
.git/HEAD
and given[branch name]
, the commit ID can be found in.git/refs/heads/[branch name]
.The package
catchfile
provides the command\CatchFileDef
, which allows us to read.git/HEAD
into a macro. AsHEAD
has no file extension, MiKTeX users have to add a trailing dot to the file name:This assigns something like
ref: refs/heads/master
to\headfull
. As this string has a trailing whitespace character, we use\StrGobbleRight
from the xstring package to trim it:1In order to extract only the branch name (
master
in the example) from this string, we can use\StrBehind
:This saves the branch name in
\branch
. Finally, we can use\CatchFileDef
again, to save the commit ID in\commit
:There are some edge cases where
.git/refs/heads/\branch.
does not exist: After runninggit pack-refs
(which is a side effect ofgit gc --aggressive
, for example), the heads are packed into the file.git/packed-refs
instead of individualbranchname
files. As a workaround, check if the file exists before trying to read it:As a fallback, this creates the (not-so-useful) output "... (in packed-refs)" instead of a commit ID – but this only lasts until the next commit, when the file
heads/branchname
is recreated for the affected branch. (A more ambitious workaround could parsepacked-refs
, of course.)Full MWE:
Sample output:
1 Using the last optional argument of
\StrGobbleRight
(name
) to assign the trimmed string to a macro (\head
) is necessary to allow further manipulation of the string using thexstring
functions – see here for a discussion.