git: показать разницу индекса в сообщении фиксации как комментарий

109

В git commitоткрытом редакторе сообщений отображается краткий статус, например:

# 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
#

Как я могу настроить git, чтобы также отображалась разница, которую нужно зафиксировать? Я понимаю, что это может быть длинное различие, но все же ... очень полезно.

Ассаф Лави
источник
Что вы пытаетесь сделать, чтобы вам нужны изменения, перечисленные в сообщении фиксации? Возможно, у вас возникло недопонимание с конкретным инструментом, и мы сможем помочь вам решить настоящую проблему.
Марк Рушаков
1
Это дает вам некоторую информацию, которую вы не получаете с помощью 'git log -p'?
Джед Шнайдер
12
@Mark: OP хочет, чтобы diff закомментировал. Это более подробная версия закомментированной подсказки по умолчанию. @Jed: OP хочет эту информацию в шаблоне сообщения фиксации. Да git diff --cachedпроизводит его, но зачем запускать отдельную команду, если она вам нужна каждый раз?
Cascabel
1
github.com/tpope/vim-fugitive/issues/149 следует за беглым, если вам интересно. Если нет, то должно быть.
lkraav

Ответы:

149

--verbose(Или -v) флаг для git commitотобразит дифф , что будет совершено:

git commit --verbose

Алан Хаггай Алави
источник
3
кажется, что разница не закомментирована, есть ли способ сделать ее комментарием по умолчанию?
Idan K
25
Сообщения diff не нужно комментировать, Идан; git знает, как игнорировать их, как если бы они были комментариями.
Brandon Rhodes,
@BrandonRhodes Как сказать, что git bit игнорирует разницу? У меня есть сценарий для генерации нескольких дополнительных строк в формате diff, но он был усечен из первой строки
Dennis C
2
@IdanK, преимущество того, что строки diff не закомментированы в шаблоне сообщения фиксации, заключается в том, что окраска кода vim работает с добавленным содержимым diff (если у вас установлены дополнения типа файла git для vim). Если бы эти разностные линии были закомментированы, эта окраска не сработала бы.
Кристофер
1
Не обращайте внимания на мой предыдущий комментарий; Виновником был плагин EditorConflig, который возился со строкой «Не трогайте строку выше».
Daniel Liuzzi
31

Недостаточно репутации, чтобы опубликовать ответ на ответ Алана, но для Идана и всех остальных я просто попробовал это, и строки diff в сообщении фиксации явно не закомментированы. Однако, слава богу, они по-прежнему не отображаются в окончательном сообщении о фиксации.

$ git commit --verbose

В моем редакторе:

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!

(обратите внимание на отсутствие #строк разницы в начале)

А затем фактическое сообщение фиксации:

$ git log -n 1
commit ad21a2655ef6d8173c2df08dc9893055b26bc068
Author: Tom Jakubowski <tom@crystae.net>
Date:   Thu Oct 27 19:12:54 2011 -0700

    Feeling a bit pessimistic now.

Очевидно, по- git showпрежнему будет отображаться разница, но это потому, что она всегда отображается для коммитов. :)

Tomjakubowski
источник
2
В новых версиях git (у меня 2.3) к diff добавляется следующая строка: # ------------------------ >8 ------------------------- Я предполагаю, что git автоматически удаляет все, что появляется после него.
Ян Вархол
По крайней мере, с версии 2.4.1 я вижу: # ------------------------> 8 ------------ ------------ # Не трогайте строку выше. # Все, что ниже, будет удалено. так что это подтверждает то, о чем вы думали.
Энтони Паноццо
@AnthonyPanozzo Кажется, это не работает на 2.5.3. Несмотря на наличие маркера «Не трогать строку выше», полное различие все равно попадает в сообщение фиксации.
Daniel Liuzzi
Работает у меня в 2.8.2
Энтони Паноццо
3
Чтобы установить это из командной строки:git config --global commit.verbose true
Тейлор
10

Самый простой способ убедиться, что такое поведение всегда присутствует, - добавить этот раздел в свой git configфайл:

[commit]
  verbose = true

Возможно, вам потребуется настроить редактор для отображения в режиме сравнения (для выделения синтаксиса). Я использую Notepad2 в качестве замены Блокнота Windows и соответствующим образом -s diffустанавливаю цветовую схему (красный для удаленных строк и т. Д.):

[core]
  editor = C:/Windows/system32/notepad.exe -s diff
Райан Ланди
источник
9

Я поместил следующие строки в .git / hooks / prepare-commit-msg, чтобы получить закомментированный diff:

#!/bin/bash

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

Таким образом, вы можете не только закомментировать разницу, но и добавить дополнительную информацию (как это делает параметр stat ).

Изменить: Также git commit --verbose не включает разницу в сообщение о фиксации, таким образом можно было бы обходиться без #s.

Майкл
источник
4
Вместо того, чтобы комментировать, # ------------------------ >8 ------------------------вы можете найти больше git-scm.com/docs/git-commit#git-commit-scissors
AB
8

Если вы хотите всегда видеть разницу при фиксации, вы можете добавить в свой ~/.gitconfigфайл следующее:

[alias]
commit = commit -v
ржавый
источник
Однако вы можете - на какой у вас версии git? Это работает для меня с версией 2.0.0
ржавый
2
Ваш ответ выглядит многообещающим, но мне тоже не подходит. Я попробовал, git config --global alias.commit 'commit -v'и псевдоним был добавлен, как вы предложили - просто автоматически. Я создал еще один псевдоним, cvкоторый работает как и ожидалось. Моя версия git - 2.5.0, как и в Ubuntu 15.10.
Даниэль Бёмер
6
Чтобы установить это из командной строки:git config --global commit.verbose true
Тейлор