Zum Inhalt

LaTeX und Git - Git Information in LaTeX-Dokumenten verwenden

Git-Informationen, wie Branch, Tags, etc. lassen sich automatisch in LaTeX-Dokumenten übernehmen und anzeigen.

Codeberg

--8<-- "docs/assets/banners/latex-banner.md

Da es durchaus sinnvoll ist bei der Erstellung von (großen) und wichtigen Dokumenten eine Versionsverwaltung, wie z.B. Git, zu verwenden, können diese Informationen auch auf das PDF-Dokument gedruckt werden.

Das ermöglicht einen zuverlässigen Audit Trail und Versionen lassen sich einfach nachvollziehen.

Option 1: Ohne zusätzliche Pakete

Es ist dabei zu beachten, dass der .git-Ordner im gleichen Verzeichnis wie die LaTeX-Dateien liegt.

Für dies LaTeX-Dokument können die Git-Informationen über diesen Weg nicht ausgelesen werden, da der .git ein Ordner oberhalb liegt. Bei einem LaTeX-Lauf können die Git-Informationen nicht ausgelesen werden.

Fehlerhafte Ordnerstruktur in diesem Repo:

|.git
|--/latex-templates/template-for-your-thesis
|
|--latex-templates/letter-simple
|
|--latex-templates/letter-serial

Korrekte Anordnung der Ordner:

|.git
|bibs/
|einstell/
|figs/
|glossar/
|texs/
|variables/
|diplomarbeit.tex
|...

Option 1: einstell.tex

In die Datei einstell.tex wurde der Abschnitt eingefügt. Dadurch werden ein paar neue Befehle erstellt und die Informationen aus den Dateien im Order .git abgerufen.

Es werden die Git-Informationen abgerufen:

  • Branch
  • Tags
  • Commit Message
  • Commit ID
\usepackage{ifthen}

% --- Git Information
% Inspired by 
% https://tex.stackexchange.com/questions/455396/how-to-include-the-current-git-commit-id-and-branch-in-my-document

\newcommand{\dotGitHEAD}{}
\newcommand{\branch}{}
\newcommand{\commit}{}
\newcommand{\commitmessage}{}
\newcommand{\tags}{}

\makeatletter\let\myfilehandle\@inputcheck\makeatother

\openin\myfilehandle=.git/HEAD\relax

\begingroup\endlinechar-1
  \global\read\myfilehandle to \dotGitHEAD
\endgroup
\closein\myfilehandle

\newcommand\GetBranch{}
\def\GetBranch ref: refs/heads/#1\relax{\renewcommand{\branch}{#1}}

\expandafter\GetBranch\dotGitHEAD\relax

\openin\myfilehandle=.git/refs/heads/\branch\relax

\begingroup\endlinechar-1
  \global\read\myfilehandle to \commit
\endgroup
\closein\myfilehandle

%Commit Message
\openin\myfilehandle=.git/COMMIT_EDITMSG

\begingroup\endlinechar-1
  \global\read\myfilehandle to \commitmessage
\endgroup
\closein\myfilehandle
% ------------------

Option 1: titel.tex

In der Datei titel.tex werden die Variablen eingefügt, um die Git-Informationen dort anzuzeigen.

...
  % Fusstext

  {\bf GIT INFORMATION} \\[5mm]
  {Branch: \branch \: - \: Version: \tags \: - \: Commit Message ID: \commitmessage \: - \: Commit ID: \commit} \\[5mm]

  {\ifthenelse{\equal{\mainbranch}{\branch}}%
  {\LARGE{FINAL VERSION}}%
  {\LARGE{DRAFT}}} \\[5mm]

\orterstellung, den \tagerstellung. \monaterstellung \  \jahrerstellung
...

Option 1: diplomarbeit.tex

In der Hauptdatei diplomarbeit.tex werden die Informationen in den fancyfoot eingefügt, damit die Git-Daten auf jeder Seite im Footer aufgebracht werden:

...
\fancyfoot[L]{\tiny{\autor \\ \email}}%

\fancyfoot[C]{%
  % Print Draft On Title Page based on Git Branch
  % see variables/variables.tex for definition of your Git main branch
  \ifthenelse{\equal{\mainbranch}{\branch}}%
  {\large{VERSION: \tags }}%
  {\large{- DRAFT -}}
 }%

\fancyfoot[R]{\tiny{\today{} \: - Git Branch: \branch \\ \commit}}%
...

Option 1: variables.tex

Die Variable für den Namen des Hauptbranches ist in der Datei variables/variables.tex einzufügen.

Im Standard wird der Name main verwendet.

\newcommand{\mainbranch}{main}

Gib mir gerne einen Kaffee ☕ aus ❗️

Wenn dir meine Beiträge gefallen und geholfen haben, dann kannst du mir gerne einen Kaffee ☕️ ausgeben.

Donation via PayPalDonation via LiberaPay

Donation via Bitcoin
Bitcoin Address: bc1qfuz93hw2fhdvfuxf6mlxlk8zdadvnktppkzqzj

Option 2: Mit dem Paket gitinfo2

Das Paket gitinfo2 stellt eine Vielzahl an Optionen zur Verfügung, um die Git-Informationen in das eigene Dokument zu überführen.

Bevor es aber losgeht, sind nach der Installation des Pakets noch ein paar Skripte im Ordner .git/hooks anzulegen.

Die Skripte erstellen eine neue Datei .git/gitHeadInfo.gin und aktualisieren bei einem neuen commit, checkout, merge automatisch die Metadaten.

Auf diese Datei greift dann das Paket gitinfo2 zurück, um die Daten abzurufen und in das LaTeX-Dokument zu überführen.

Eine Vorlage (post-xxx-sample.txt) für die Skript-Datei ist im Ordner von gitinfo2 zu finden, oder es kann von der ctan-Website heruntergeladen werden.

Die Datei post-xxx-sample.txt ist dreimal zu kopieren und umzubenennen in

  • post-checkout
  • post-commit
  • post-merge

und gesammelt in das Verzeichnis .git/hook zu kopieren.

Die Rechte für die drei Skripte ist so anzupassen, dass sie auf -rwxr-x-r-x gestellt sind.

chmod +x post-checkout post-commit post-merge

Danach können die Befehle von gitinfo2 genutzt werden und die entsprechenden Abschnitte in den Dateien ergänzt werden.

Warning

Ich verwende eine Kombination aus beiden Optionen, da ich mit dem Paket ifthen Abfragen erstellt habe.

Option 2: einstell.tex

\usepackage{ifthen}
\usepackage{gitinfo2}

% --- Git Information
% Inspired by 
% https://tex.stackexchange.com/questions/455396/how-to-include-the-current-git-commit-id-and-branch-in-my-document

\newcommand{\dotGitHEAD}{}
\newcommand{\branch}{}
\newcommand{\commit}{}
\newcommand{\commitmessage}{}

\makeatletter\let\myfilehandle\@inputcheck\makeatother

\openin\myfilehandle=.git/HEAD\relax

\begingroup\endlinechar-1
  \global\read\myfilehandle to \dotGitHEAD
\endgroup
\closein\myfilehandle

\newcommand\GetBranch{}
\def\GetBranch ref: refs/heads/#1\relax{\renewcommand{\branch}{#1}}

\expandafter\GetBranch\dotGitHEAD\relax

\openin\myfilehandle=.git/refs/heads/\branch\relax

\begingroup\endlinechar-1
  \global\read\myfilehandle to \commit
\endgroup
\closein\myfilehandle

%Commit Message
\openin\myfilehandle=.git/COMMIT_EDITMSG

\begingroup\endlinechar-1
  \global\read\myfilehandle to \commitmessage
\endgroup
\closein\myfilehandle
% ------------------

Option 2: titel.tex

\titelseite{
  % Fenstertext

  {\LARGE \bf \maintitle} \\[15mm]
  {\large \subtutitle} \\[15mm]
  %{\large \bf \autor} \\[5mm]

  \bigskip

  {\bf GIT INFORMATION} \\[5mm]
  {\bf Branch: \gitBranch} \\[5mm]
  {\bf Version/Tag: \gitRel} \\[5mm]
  {Commit Message: \commitmessage} \\[5mm]
  {Commit Hash: \gitAbbrevHash} \\[5mm]
  {Author: \gitAuthorName \: - \gitAuthorEmail} \\[5mm]
  {Committer: \gitCommitterName \: - \gitCommitterEmail} \\[15mm]

  \bigskip

  % Print Draft On Title Page based on Git Branch
  % see variables/variables.tex for definition of your Git main branch
  \ifthenelse{\equal{\mainbranch}{\branch}}%
  {\large{FINAL VERSION}}%
  {\large{DRAFT}}\\[5mm]

  {\large{\gitAuthorDate}} \\[5mm]
}{
  % Fusstext
%Juli 2022
}

Option 2: diplomarbeit.tex

...

% --- Benutzerdefinierte Fußzeile -------------------------------------
% Durch Aktivieren von fancyfoot werden wird die definierte Fußzeile, wie z.B. die Seitenzahlen, überschrieben.
% Kann verwendet werden, um Entwürfe und/oder Versionen eindeutig zu kennzeichnen

% ---
% Git Details
\fancyfoot[L]{\tiny{\gitAuthorName \\ \gitAuthorEmail}}%

\fancyfoot[C]{%
  % Print Draft On Title Page based on Git Branch
  % see variables/variables.tex for definition of your Git main branch
  \ifthenelse{\equal{\mainbranch}{\branch}}%
  {\large{VERSION: \gitRel }}%
  {\large{- DRAFT -}}
 }%

\fancyfoot[R]{\tiny{
  \gitAuthorDate \\ %
  Git Branch: \gitBranch \\ %
  \gitAbbrevHash %
  }}%
% ---

% ---
% Without Git Details

%\fancyfoot[L]{\tiny{\autor \\ \email}}%

%\fancyfoot[C]{\LARGE{DRAFT}}%

%\fancyfoot[R]{\tiny{\today{} \: - Git Branch: \branch \\ \commit}}%
% ---

...

Gib mir gerne einen Kaffee ☕ aus ❗️

Wenn dir meine Beiträge gefallen und geholfen haben, dann kannst du mir gerne einen Kaffee ☕️ ausgeben.

Donation via PayPalDonation via LiberaPay

Donation via Bitcoin
Bitcoin Address: bc1qfuz93hw2fhdvfuxf6mlxlk8zdadvnktppkzqzj