Контекст
Существует несколько разных (действительных) патчей для одного и того же изменения. Основным отличием является использование контекстных строк. Unified diff обычно использует три строки контекста до и после каждого изменения. Внутри git (иногда) использует ноль строк контекста, что может привести к различным измененным строкам.
Первое решение: внешний инструмент
Как уже описал @ karl-bielefeldt, можно передать результат git show
в grep -Pc '^\+(?!\+)'
или grep -Pc '^-(?!-)'
. Существует инструмент diffstat
, который делает именно это:
$git show c21ad76 -- contrib/hadoop-store-builder/src/java/voldemort/store/readonly/mr/HadoopStoreBuilderReducer.java | diffstat
HadoopStoreBuilderReducer.java | 57 +++++++++++++++++++++--------------------
1 file changed, 30 insertions(+), 27 deletions(-)
Второе решение: использовать разные контексты для патча
Выходной патч git show можно настроить. С опцией "-Ux" для x может быть указан контекст.
$git show -U0 c21ad76 -- contrib/hadoop-store-builder/src/java/voldemort/store/readonly/mr/HadoopStoreBuilderReducer.java | diffstat
HadoopStoreBuilderReducer.java | 47 +++++++++++++++++++++--------------------
1 file changed, 25 insertions(+), 22 deletions(-)
Это соответствует внутреннему git log --numstat
, потому что он использует контекст 0 для вычисления статистики. Обратите внимание, что это поведение собирается изменить в git версии 1.7.7. При этом numstat использует 3 строки контекста.