Zum Inhalt

LaTeX und Git - Git Information in LaTeX-Dokumenten verwenden

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

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.


ACHTUNG❗️ 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}}%
% ---

...

Option 2: variables.tex

siehe dazu Option 1: variables.tex

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