git-worktree-precommit-hook-flutter-failure

Par divinevideo · divine-mobile

Correction des échecs du hook git pre-commit dans les projets Flutter lors de l'utilisation de git worktrees. À utiliser lorsque : (1) le hook pre-commit avec `flutter analyze` échoue lors d'un `git commit` mais réussit quand on le lance manuellement, (2) la sortie du hook affiche « Resolving dependencies... » puis échoue immédiatement sans aucune erreur d'analyse réelle, (3) vous travaillez dans un git worktree (créé via `git worktree add`). Cause racine : git définit `GIT_DIR` sur un chemin de style worktree pendant l'exécution du hook, ce qui casse `flutter pub get` (appelé en interne par `flutter analyze`). Correction : annuler la définition de `GIT_DIR`, `GIT_INDEX_FILE` et `GIT_WORK_TREE` avant les commandes flutter/dart dans le hook.

npx skills add https://github.com/divinevideo/divine-mobile --skill git-worktree-precommit-hook-flutter-failure

Échec du hook pre-commit Git Worktree avec Flutter

Problème

Lors de l'utilisation de git worktree pour le développement parallèle, les hooks pre-commit qui exécutent flutter analyze échouent lors du git commit même si :

  • Exécuter flutter analyze directement dans le worktree réussit sans problème
  • Exécuter le script du hook pre-commit manuellement réussit
  • Le hook réussit dans le checkout du repo principal

Cause racine

Git définit les variables d'environnement GIT_DIR, GIT_INDEX_FILE et GIT_WORK_TREE lors de l'exécution du hook. Dans un worktree, GIT_DIR pointe vers .git/worktrees/<name>/ au lieu de .git/. Quand flutter analyze exécute en interne flutter pub get, pub échoue avec ce chemin GIT_DIR de style worktree et ne peut pas résoudre les dépendances.

L'échec est invisible quand le hook utilise 2>/dev/null sur stderr — vous voyez seulement « Resolving dependencies... » puis le message d'échec, l'erreur réelle étant supprimée.

Contexte / Conditions de déclenchement

  • Utilisation de git worktree add pour le développement parallèle de branches
  • Le hook pre-commit exécute flutter analyze ou dart analyze
  • La sortie du hook affiche « Resolving dependencies... » puis échoue immédiatement
  • Aucune erreur d'analyse réelle n'est signalée
  • Le hook utilise set -e (sortie en cas d'erreur)
  • 2>/dev/null peut masquer la cause réelle de l'échec

Diagnostic

Reproduisez l'échec exact en simulant l'environnement du hook de git :

# Ceci ÉCHOUERA (simule l'exécution du hook dans le worktree)
GIT_DIR=/path/to/main/.git/worktrees/<name> \
  flutter analyze --no-fatal-infos 2>/dev/null

# Ceci RÉUSSIRA (sans variables d'environnement git)
flutter analyze --no-fatal-infos

Solution

Ajoutez unset GIT_DIR GIT_INDEX_FILE GIT_WORK_TREE au hook pre-commit après toutes les commandes git mais avant toute commande flutter/dart.

#!/bin/bash
set -e

cd "$(git rev-parse --show-toplevel)/mobile"

# Opérations git (elles ONT BESOIN des variables d'environnement git)
STAGED_DART_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.dart$' || true)

if [ -z "$STAGED_DART_FILES" ]; then
    echo "No Dart files staged, skipping checks"
    exit 0
fi

# Désactivez les variables d'environnement git AVANT d'exécuter les commandes flutter/dart.
# Git les définit lors de l'exécution du hook, et flutter pub get
# (appelé en interne par flutter analyze) échoue sur les chemins GIT_DIR
# de style worktree.
unset GIT_DIR GIT_INDEX_FILE GIT_WORK_TREE

# Maintenant les commandes flutter/dart fonctionnent dans le repo principal et les worktrees
dart format --output=none --set-exit-if-changed lib test
flutter analyze --no-fatal-infos

Points clés :

  • Le unset DOIT venir après git diff --cached (qui a besoin de GIT_INDEX_FILE)
  • Le unset DOIT venir avant flutter analyze et dart format
  • Supprimez 2>/dev/null de flutter analyze pour que les erreurs soient visibles

Vérification

  1. Apportez une modification dans un git worktree
  2. Mettez en scène le fichier : git add <file>
  3. Committez : git commit -m "test" — le hook devrait réussir
  4. Vérifiez que le même hook fonctionne toujours dans le checkout du repo principal

Notes

  • Ceci affecte tout outil qui exécute en interne pub get ou interagit avec git lors de l'exécution du hook (pas seulement flutter analyze)
  • dart format peut aussi être affecté dans certaines configurations
  • L'appel git rev-parse --show-toplevel en haut du hook fonctionne correctement avec GIT_DIR défini — il se résout à la racine du worktree
  • Désactivez les variables seulement quand vous avez terminé avec les opérations git

Skills similaires