Um die Regeln für Commit-Nachrichten und Branches strikt einzuhalten, kann ein pre-push-Hook vor einem Push verwendet werden, um sicherzustellen, dass alle Regeln eingehalten werden.
#!/bin/bash
# Fehlerbehandlung aktivieren
set -e
# Funktion zur Prüfung der Commit-Nachrichten
check_commit_message() {
local commit_message="$1"
# Überspringe Merge-Commits
if [[ $commit_message =~ ^Merge\ branch\ '.*'$ ]]; then
echo "Merge-Commit erkannt, überspringe Commit-Nachricht-Prüfung."
return 0
fi
# Regex für Commit-Nachricht (Scope optional)
if [[ ! $commit_message =~ ^(feat|fix|docs|style|refactor|perf|test|chore|revert)(\([a-zA-Z0-9_-]+\))?:\ ]]; then
echo "Commit-Nachricht entspricht nicht den Richtlinien."
echo "Gültige Formate: <type>(<scope>): <subject> oder <type>: <subject>"
echo "Beispiele:"
echo " feat(auth): add authentication module"
echo " fix: resolve alignment issue"
return 1
fi
}
# Funktion zur Prüfung des Branch-Namens
check_branch_name() {
local branch="$1"
if [[ $branch =~ ^VIS-[0-9]+-[a-z0-9-]+$ ]]; then
return 0
elif [[ $branch =~ ^release/v[0-9]+\.[0-9]+(\.[0-9]+)?$ ]]; then
return 0
else
echo "Branch '$branch' entspricht nicht den erlaubten Mustern: 'VIS-[NUMMER]-[Fehler]' oder 'release/vX.X.X'."
return 1
fi
}
# Funktion zur Prüfung des Source-Branches
check_source_branch() {
local branch="$1"
local merge_base
# Finde den gemeinsamen Merge-Base mit develop
merge_base=$(git merge-base "$branch" develop)
if [[ -z $merge_base ]]; then
echo "Fehler: Branch '$branch' hat keinen gemeinsamen Commit mit 'develop'."
return 1
fi
# Prüfe, ob der aktuelle Branch direkt von develop erstellt wurde
if git log --oneline "$merge_base"..HEAD | grep -q .; then
echo "Branch '$branch' wurde korrekt von 'develop' erstellt."
return 0
else
echo "Fehler: Branch '$branch' scheint nicht von 'develop' abgeleitet zu sein."
return 1
fi
}
# Prüfe alle zu pushenden Commits
while read local_ref local_sha remote_ref remote_sha; do
branch=$(git rev-parse --abbrev-ref "$local_ref")
echo "Prüfe Branch '$branch'..."
# 1. Branch-Name prüfen
if ! check_branch_name "$branch"; then
exit 1
fi
# 2. Ursprung prüfen
if ! check_source_branch "$branch"; then
exit 1
fi
# 3. Commit-Nachrichten prüfen
echo "Prüfe Commit-Nachrichten..."
for commit in $(git rev-list "$remote_sha".."$local_sha"); do
commit_message=$(git log -1 --pretty=%B "$commit")
if ! check_commit_message "$commit_message"; then
echo "Fehler in Commit $commit."
exit 1
fi
done
echo "Branch '$branch' und Commits sind gültig."
done
exit 0