git: Afficher l'index diff dans le message de validation en tant que commentaire

109

Lorsqu'il est git commitouvert, l'éditeur de message affiche un bref statut, quelque chose comme ceci:

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Your branch is ahead of 'origin/master' by 26 commits.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   Showcase/src/com/gigantt/BorderArea.mxml
#   modified:   Showcase/src/com/gigantt/Client.mxml
#   modified:   Showcase/src/com/gigantt/GraphItem.mxml
#

Comment puis-je modifier git pour afficher également le diff à valider? Je suis conscient que cela peut être une longue différence, mais quand même ... si utile.

Assaf Lavie
la source
Qu'est-ce que vous essayez de faire pour avoir besoin des modifications répertoriées dans le message de validation? Vous avez peut-être un malentendu avec un outil en particulier et nous pourrons peut-être vous aider à contourner le problème réel.
Mark Rushakoff
1
est-ce que cela vous fournit des informations que vous n'obtenez pas avec 'git log -p'?
Jed Schneider
12
@Mark: L'OP veut que le diff soit commenté. C'est une version plus détaillée de l'indication commentée par défaut. @Jed: l'OP veut cette information dans le modèle de message de validation. Oui le git diff --cachedproduit, mais pourquoi exécuter une commande distincte si vous le souhaitez à chaque fois?
Cascabel
1
github.com/tpope/vim-fugitive/issues/149 suit ceci pour fugitif, au cas où vous vous poseriez la question. Si vous ne l'êtes pas, vous devriez l'être.
lkraav

Réponses:

149

L' indicateur --verbose(ou -v) pour git commitaffichera la différence de ce qui serait validé:

git commit --verbose

Alan Haggai Alavi
la source
3
il semble que le diff n'est pas commenté, aucun moyen d'en faire un commentaire par défaut?
Idan K
25
Les messages diff n'ont pas besoin d'être commentés, Idan; git sait les ignorer comme s'il s'agissait de commentaires.
Brandon Rhodes
@BrandonRhodes Comment dire à git bit qu'il ignore le diff? J'ai un script pour générer quelques lignes d'addition au format diff, mais il a été tronqué à partir de la première ligne
Dennis C
2
@IdanK, un avantage pour les lignes de diff qui ne sont pas commentées dans le modèle de message de validation est que la coloration du code vim fonctionne sur le contenu de diff ajouté (si les ajouts de type de fichier git sont installés pour vim). Si ces lignes de diff étaient commentées, cette coloration ne fonctionnerait pas.
Christopher
1
Ne tenez pas compte de mon commentaire précédent; le coupable était le plugin EditorConflig qui manipulait la ligne "Ne touchez pas la ligne au-dessus".
Daniel Liuzzi
31

Pas assez de réputation pour poster une réponse à la réponse d'Alan, mais pour Idan et n'importe qui d'autre, je viens de l'essayer et les lignes de diff dans le message de validation ne sont pas explicitement commentées. Cependant, ils n'apparaissent toujours pas dans le message final de validation, Dieu merci.

$ git commit --verbose

Dans mon éditeur:

Feeling a bit pessimistic now.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   README
#
diff --git a/README b/README
index af5626b..c62237e 100644
--- a/README
+++ b/README
@@ -1 +1 @@
-Hello, world!
+Goodbye, world!

(notez le manque de #précéder les lignes de diff)

Et puis le message de validation réel:

$ git log -n 1
commit ad21a2655ef6d8173c2df08dc9893055b26bc068
Author: Tom Jakubowski <[email protected]>
Date:   Thu Oct 27 19:12:54 2011 -0700

    Feeling a bit pessimistic now.

Évidemment, git showaffichera toujours le diff, mais c'est parce qu'il le fait toujours pour les commits. :)

tomjakubowski
la source
2
Dans les nouvelles versions de git (j'ai 2.3), le diff est préfixé par la ligne suivante: # ------------------------ >8 ------------------------- Je suppose que git supprime automatiquement tout ce qui apparaît après.
Jan Warchoł
Depuis au moins 2.4.1, je vois: # ------------------------> 8 ------------ ------------ # Ne touchez pas la ligne ci-dessus. # Tout ce qui suit sera supprimé. donc cela confirme ce que vous pensiez.
Anthony Panozzo
@AnthonyPanozzo Cela semble être cassé sur 2.5.3. Malgré le marqueur "Ne touchez pas la ligne au-dessus", le diff complet se retrouve quand même dans le message de validation.
Daniel Liuzzi
Fonctionne pour moi en 2.8.2
Anthony Panozzo
3
Pour définir cela à partir de la ligne de commande:git config --global commit.verbose true
Taylor Edmiston
10

Le moyen le plus simple de vous assurer que ce comportement est toujours présent est d'ajouter cette section à votre git configfichier:

[commit]
  verbose = true

Vous devrez peut-être configurer votre éditeur pour qu'il s'affiche réellement en mode diff (pour la coloration syntaxique). J'utilise Notepad2 comme remplacement du Bloc-notes Windows et -s diffdéfinit le jeu de couleurs de manière appropriée (rouge pour les lignes supprimées, etc.):

[core]
  editor = C:/Windows/system32/notepad.exe -s diff
Ryan Lundy
la source
9

J'ai mis les lignes suivantes dans .git / hooks / prepare-commit-msg pour obtenir un diff commenté:

#!/bin/bash

if [ "$2" == "" ] ; then
    git diff --staged -p --stat 2> /dev/null | awk '{ printf "#"; print}' >> "$1"  2>/dev/null
fi

De cette façon, vous pouvez non seulement commenter le diff, mais aussi ajouter plus d'informations (comme le fait l' option stat ).

Edit: De plus, git commit --verbose n'inclut pas le diff dans le message de commit de cette façon le ferait sans les #.

Michael
la source
4
Au lieu de commenter, vous pouvez utiliser # ------------------------ >8 ------------------------vous pouvez trouver plus de git-scm.com/docs/git-commit#git-commit-scissors
AB
8

Si vous souhaitez toujours voir la différence lorsque vous vous engagez, vous pouvez ajouter ce qui suit à votre ~/.gitconfigfichier:

[alias]
commit = commit -v
rouillé
la source
Vous pouvez, cependant - quelle version de git êtes-vous? Cela fonctionne pour moi avec la version 2.0.0
rusty
2
Votre réponse semble prometteuse mais ne fonctionne pas non plus pour moi. J'ai essayé git config --global alias.commit 'commit -v'et l'alias a été ajouté comme vous l'avez suggéré - simplement automatiquement. J'ai créé un autre alias nommé cvqui fonctionne comme prévu. Ma version git est 2.5.0 telle qu'elle est emballée dans Ubuntu 15.10.
Daniel Böhmer
6
Pour définir cela à partir de la ligne de commande:git config --global commit.verbose true
Taylor Edmiston