Enterprise GIT – Automatisches Einfügen der Task-Nummer

Je länger man mit GIT arbeitet, desto einfacher kommt einem die Arbeit vor.

Man arbeitet irgendwann ganz automatisch mit Feature / Hotfix und Release-Branches und die Arbeit geht einfach flüssig von der Hand.

Stellen wir uns aber folgenes Szenario vor:

Ein Business-Owner stellt einen Bug ein mit etwa folgendem Wortlaut:

“Warum ist der Button XY denn wieder grau hinterlegt. Das war doch schon mal anders.”

Prio – Selbstverständlich – BLOCKER.

Um nachvollziehen zu können, wann diese Änderung gemacht wurde ist es fast unumgänglich, die Task-Nummer in der Commit-Message eines Commits zu hinterlegen. Ich selbst mache das (meistens), wenn ich denn dran denke. Eine “perfekte” Commit-Message sieht für mich so aus

[code]
[Task-4711] Changed Button Background Color to Gray

[/code]

Um nicht jedesmal daran denken zu müssen lässt sich das Ganze mit Hilfe von Git-Hooks automatisieren.

In jedem Git-Repository stellt GIT eine Reihe von “brauchbaren” Hooks zur Verfügung.

[code]

applypatch-msg.sample
post-update.sample
pre-commit.sample
prepare-commit-msg.sample
commit-msg.sample
pre-applypatch.sample
pre-rebase.sample
update.sample

[/code]

Um eine Commit-Message anzupassen, noch bevor der Commit gemacht wird kann der prepare-commit-msg-Hook verwendet werden.

Wie könnte das aussehen. Um eine Task-Nummer automatisch parsen zu können muss der Branch-Name ein bestimmtes Format haben.

Wir gehen davon aus, dass ein Feature-Branch in unserem Projekt immer die folgende Form hat

[code]

fb_task-4711_eine_beschreibung

[/code]

Daraus möchten wir gerne die Task-Nummer, also task-4711 extrahieren und vorne an unsere Commit-Message anhängen.

Ein kleines Bash-Skript, dass das bewerkstelligt habe ich hier zusammengestöpselt

[code]

#!/bin/sh

#author Martin Dilger – EffectiveTrainings.de
#get the original commit msg
orig_msg=$(cat $1)
#expects branchnames in the form fb_task-4711_some_description
branchName=$(git rev-parse –abbrev-ref HEAD)
#branches may start with fb_task and then have “-1234″
regexpForBranches=’^fb_task-[0-9]+_’

branchMatches=$(echo $branchName | grep -E $regexpForBranches)
if [ “$branchMatches” ] ;
then
echo “matched branch”;
#split branchname by underscore and take the second chunk
task=$(echo $branchName | cut -f 2  -d ‘_’)
#prepend task name to original msg
msg=”[$task] – $orig_msg”
echo “$msg” > “$1″
else
echo “[ATTENTION] – branch name does not match, no task number in branch but committing”;
fi

[/code]

Die Kommentare sprechen hoffentlich für sich.

Im Prinzip holen wir uns den aktuellen Branch-Namen mit git rev-parse –abbrev-ref HEAD und prüfen zunächst mit der Regular Expression ^fb_task-[0-9]+_ ob der Branch-Name überhaupt dem erwarteten Format entspricht. Ist das Pattern korrekt splitten wir den Branchnamen an “_” und kommen so an die Task-Nummer. (cut etc.. und wir nehmen das zweite Element).

Mit Hilfe von msg=”[$task] – $orig_msg” bauen wir uns eine neue Commit Message zusammen, in dem wir die Tasknummer einfach vorne anfügen und in die bereits bestehende Commit-Message einfügen mit echo “$msg” > “$1″

$1 in diesem Fall ist nichts anderes als ein File im .git-Verzeichnis, in dem die Commit-Message zwischengespeichet wird (das File heisst COMMIT_EDITMSG).

Spielen wir das Szenario mal durch:

[code]

git init
Initialized empty Git repository in /Users/martindilger/development/git/.git/

[/code]

Wir benennen die Datei prepare-commit-msg.sample im Verzeichnis .git/hooks in prepare-commit-msg um und aktivieren so den Hook.

Dann löschen wir alles in dieser Datei und kopieren das obige Skript hinein. Ggf. muss die Regular-Expression und das Cut-Skript an die jeweilige Branch-Naming-Struktur angepasst werden.

Wir mache einen ersten Commit den wir brauchen um überhaupt Branches anlegen zu können.

[code]

echo “mein commit” > test.txt; git add .; git commit -m “der erste commit”
[master (root-commit) 73ff1a4] der erste commit
1 file changed, 1 insertion(+)
create mode 100644 test.txt

[/code]

Wir erzeugen uns einen neuen Branch mit einem korrekten Namen

[code]

git checkout -b fb_task-4711-ganz-wichtig
Switched to a new branch ‘fb_task-4711-ganz-wichtig’

[/code]

und machen direkt einen Commit, und zwar ohne Task-Nummer

[code]

echo “ein neuer commit” > new.txt; git add new.txt; git commit -m “message ohne tasknummer”
matched branch
[fb_task-4711_ganz-wichtig 7e7446f] [task-4711] – message ohne tasknummer
1 file changed, 1 insertion(+)
create mode 100644 new.txt

[/code]

Mit git log sehen wir , dass die Tasknummer korrekt eingefügt wurde.

[code]

git log
Commit:  7e7446f03cd91f70d120aade24a6d33a3caa8abd
Author:  dilgerm <martin@effectivetrainings.de>
Date:    (38 seconds ago) 2013-04-18 21:55:46 +0200
Subject: [task-4711] – message ohne tasknummer

[/code]

Nun benennen wir den Branch um, und zwar in ein Format das nicht passt.

[code]

git branch -m fb-nicht-so-wichtig
~/development/…/test2$ git branch
* fb-nicht-so-wichtig
master

[/code]

Falls der Branchname nicht passt möchten wir auf keinen Fall, dass irgendwelcher “Blödsinn” in der Commit-Message landet. Deswegen der Check mit RegExp.

Wir machen einen letzten Commit

[code]

echo “ein neuerer commit” > new.txt; git add new.txt; git commit -m “message ohne tasknummer”
[ATTENTION] – branch name does not match, no task number in branch but committing
[fb-nicht-so-wichtig d5697df] message ohne tasknummer
1 file changed, 1 insertion(+), 1 deletion(-)

[/code]

und git log zeigt die Message ohne Änderung.

[code]

git log
Commit:  d5697dff5690083fd138d39820ebcdafd8cb29aa
Author:  dilgerm <martin@effectivetrainings.de>
Date:    (23 seconds ago) 2013-04-18 21:58:40 +0200
Subject: message ohne tasknummer

[/code]

War dieser Blogeintrag für Euch interessant? Vielleicht kann ich noch mehr für Euch tun – gerade im Bereich GIT biete ich interessante Trainings und Consulting an.

Einige interessante Einträge zum Thema GIT:

Besser GITs nicht Slides (Herbstcampus 2012)

Besser GITs nicht – Artikel im Java Magazin

 

Effective Trainings & Consulting - Martin Dilger



Hat Ihnen dieser Blog-Eintrag gefallen? Ich stelle in diesem Blog Informationen über Tools, Frameworks und Werkzeuge zur Verfügung, die mich produktiver machen. Vielleicht kann ich auch Ihnen helfen, produktiver zu werden.


Ich unterstütze Sie als freier Mitarbeiter bei der Entwicklung von Software-Projekten, Agiler Arbeit sowie Schulungen / Fortbildungen.


Jeden Tag ein bisschen produktiver - ab heute