Inserting git commit date without hooks

enter image description here

This is svn but any command line is the same.

Depending on your configuration you probably need

pdflatex --enable-write18 filename

to enable \write18 to be a hook to execute shell commands.

this writes to a temporary file using the shell escape, then inputs it

\documentclass{article}

\begin{document}

\immediate\write18{svn info \jobname.tex | grep "Changed Date" > \jobname.info }
\fbox{\input{\jobname.info}}

\end{document}

I ended up using a custom Makefile to insert the revision info.

When creating a Makefile instead of using the --enable-write18 compiler flag, you require people to use a specific compilation method. That sucks. But the same thing counts for write18, as people have to configure their compiler to allow possibly insecure access to their system. By using a Makefile, the security risk of write18 is reduced, while providing an almost cross-platform method of compiling your document (Make is available when using cygwin on Windows; cygwin usually comes with git anyways). To (intelligently) compile the document itself, you can use latexmk on Linux and OS X (comes with TeXLive) and texify on Windows (comes with MiKTeX).

This is the Makefile:

TARGET=main.pdf
LL=latexmk -pdf
CLEAN=latexmk -C

all: revision.tex $(TARGET)

pdf: revision.tex $(TARGET)

.PHONY : clean revision.tex $(TARGET)

revision.tex:
    echo "% Autogenerated, do not edit" > revision.tex
    echo "\\newcommand{\\revisiondate}{`git log -1 --format=\"%ad\" --date=short`}" >> revision.tex
    echo "\\newcommand{\\revision}{`git log -1 --format=\"%h\"`}" >> revision.tex

$(TARGET): $(TARGET:%.pdf=%.tex) $(SRC)
    $(LL) $<

clean:
    $(CLEAN)
    rm -f revision.tex

If people want to build the PDF directly from their favorite IDE, they can tell the IDE to trigger "make". This should work with most software. When you use vim for example, you can use a mapping like this:

map <leader>m :w<CR> :!make<CR><CR>

The Makefile creates a file called revision.tex which looks like this:

% Autogenerated, do not edit
\newcommand{\revisiondate}{2012-10-17}
\newcommand{\revision}{e8e5238}

To insert it into the main document, simply use \input{revision} and then insert \revisiondate or \revision at the desired place.


Here is an alternative solution that runs with gitinfo2. Hence I really like gitinfo2; the hooks mechanism proposed never satisfied me.

I ended up doing Makefile and shell scripts, but they weren't properly handled by my LaTeX editor and were not working on all platforms.

Finally, I ended up writing a kind of plugin for latexmk.

This plugin is named gitinfo2-latexmk and is available on GitHub

Disclaimer: I'm the author of that plugin.

The setup is pretty easy :

  • download the plugin gitinfo2.pm (Perl module)
  • add one line in your .latexmkrc file

Once these two small steps are done, no more boilerplate is needed. Each time you, or your LaTeX editor, run latexmk, the git information is ready for the package gitinfo2.