2012-05-11 3 views
3

J'essaie de faire une commande deploy dans mon Makefile, qui écrase simplement à la branche deployment, puis pousse cette branche à origin. Toutefois, la commande doit arrêter/échouer avec un message d'erreur lorsque l'arborescence de travail n'est pas vide.Comment forcer un dépôt git propre dans un fichier makefile?

Quelque chose comme ce qui suit:

deploy: 

    status=$(git status --porcelain) 
    test "x$(status)" = "x" 
    git branch -f deployment 
    git push origin deployment 

Malheureusement, ce test et variable d'état ne semble pas fonctionner comme voulu.

Comment pourrait-on y parvenir? Suis-je en effet censé utiliser test?

+1

Dans un makefile, chacune de ces commandes s'exécutera dans un shell séparé. $ (Status) sera aussi la valeur du statut de la variable dans le makefile, pas dans le shell. –

Répondre

11

Utilisez git diff-index pour vérifier si la prise en pension est sale:

deploy: 
     git diff-index --quiet HEAD 
     git branch -f deployment 
     git push origin deployment 

Si vous voulez vérifier les variables shell dans un makefile, vous devez vous assurer que vous vérifiez la valeur de la variable dans la même enveloppe que la celui dans lequel il est défini. Faire invoquera chaque commande dans une enveloppe séparée, de sorte que vous devez faire quelque chose comme:

deploy: 
     @status=$$(git status --porcelain); \ 
     if test "x$${status}" = x; then \ 
      git branch -f deployment; \ 
      git push origin deployment; \ 
     else \ 
      echo Working directory is dirty >&2; \ 
     fi 

Notez le double « $ », le point-virgule, et les continuités de ligne.

+0

Merci pour votre aide. Je ne suis pas sûr de savoir si je devrais utiliser le premier code ou le second. Lorsque j'utilise la seconde, j'obtiens 'make: *** [deploy] Error 1' mais ça ne me dit pas vraiment ce qui ne va pas où. Comment est-ce que je sortirais la valeur de 'status' après la première ligne pour voir si c'est correct? Aussi, pourquoi utilisez-vous '&&' pour tout sauf la première ligne? – Tom

+1

Les && ne sont pas vraiment nécessaires. L'utilisation de && fait court-circuiter le shell et n'invoque pas la commande git branch/git, mais les laisser à l'extérieur provoquerait l'abandon de make après le test et n'invoquerait pas la branche/push. Je les ai juste mis dans la variété. Pour voir la valeur de l'état, ajoutez la ligne "echo $$ status; \" après la ligne qui définit l'état. –

+0

Merci, ça fonctionne. J'ai probablement besoin d'en savoir plus sur Makefiles et le shell. Pourriez-vous me dire comment produire un message d'erreur comme "le répertoire de travail n'est pas propre" quand le test échoue? – Tom

Questions connexes