Von Gast (nicht überprüft) , 29 April 2026

Der Fall fur Pre-Push-Tests

Ein kaputter Push verschwendet die Zeit aller.

Der einfachste Pre-Push-Hook

# .git/hooks/pre-push
#!/usr/bin/env bash
set -e
npm test --silent
chmod +x .git/hooks/pre-push

Lesen, was gepusht wird

#!/usr/bin/env bash
while read local_ref local_sha remote_ref remote_sha; do
  if [ "$local_sha" = "0000000000000000000000000000000000000000" ]; then
    continue
  fi
  git checkout "$local_sha" -- .
  npm test
done

Selektive Test-Ausfuhrung

changed=$(git diff --name-only origin/main...HEAD)
affected=$(./scripts/find-affected-tests.sh "$changed")
npx jest $affected

Branch-bewusste Durchsetzung

protected_branches=("main" "release")
branch=$(git symbolic-ref --short HEAD)
if [[ " ${protected_branches[*]} " =~ " $branch " ]]; then
  echo "Refusing to push directly to $branch" >&2
  exit 1
fi

Husky fur geteilte Pre-Push-Hooks

# .husky/pre-push
npm test --silent
npm run typecheck --silent

Performance-Tipps

  • Tests parallel ausfuhren.
  • Unveranderte Tests uberspringen.
  • Transformationen cachen.
  • Schwere Integrationstests fur CI reservieren.

Umgehen

git push --no-verify

Server-seitige Hooks

# /srv/git/repo.git/hooks/pre-receive
#!/usr/bin/env bash
while read old new ref; do
  if ! gitleaks detect --redact --no-banner --staged 2>/dev/null; then
    echo "Push rejected: secrets detected" >&2
    exit 1
  fi
done

Die richtige Grenze

  • Pre-Commit: instantane Checks.
  • Pre-Push: Unit-Tests, voller Lint.
  • CI: Integrationstests, Smoke-Tests.