Делаем git diff --stat показывать полный путь к файлу

104

При выполнении git diff --statнекоторые файлы перечислены с полным путем из базы репозитория, но некоторые файлы перечислены как:

.../short/path/to/filename.  

То есть путь начинается с, ...и показан только короткий путь.

Я хотел бы git diffуказать полный путь ко всем файлам, чтобы он мог легко обрабатываться скриптом. Есть ли способ git diffвсегда показать полный путь

Бадри
источник

Ответы:

109

Команда git diffпринимает необязательные значения для --stat:

--stat[=<width>[,<name-width>[,<count>]]]
       Generate a diffstat. You can override the default output width for
       80-column terminal by --stat=<width>. The width of the filename
       part can be controlled by giving another width to it separated by a
       comma. By giving a third parameter <count>, you can limit the
       output to the first <count> lines, followed by ...  if there are
       more.

       These parameters can also be set individually with
       --stat-width=<width>, --stat-name-width=<name-width> and
       --stat-count=<count>.

(Для написания сценариев вы, возможно, захотите использовать git diff-treeнапрямую, поскольку это скорее команда «сантехники», хотя я подозреваю, что в любом случае у вас все будет хорошо. Обратите внимание, что вам понадобится тот же дополнительный текст, что и --statпри использовании git diff-tree. Существенная разница между использованием git diff«фарфора» "интерфейсная часть и команда git diff-treeсантехники - это git diffпоиск настроенных вами параметров для таких параметров, как diff.renamesрешение, следует ли выполнять обнаружение переименования. Что ж, плюс внешний интерфейс git diffбудет делать то же самое, что git diff-indexесли вы сравниваете фиксацию с индексом , например. Другими словами, git diff читает вашу конфигурацию и автоматически вызывает нужную сантехнику .)

торек
источник
6
git diff --numstat это то же самое, что и diff-tree
cmcginty
1
Обратите внимание, что для ограничения ширины последней части (+++ / ---) вы можете использовать отдельный --stat-graph-width=...переключатель. Следует также отметить , что установка максимума --stat-graph-width=и --stat-name-width=не достаточно, вы также должны установить --stat-width=достаточно большой , чтобы покрыть два.
jakub.g
@ jakub.g: хороший момент. Если немного покопаться в исходном коде git, это вошло в git 1.7.10.
torek
4
Есть ли способ сделать это глобальным? Печатать его каждый раз - безумие.
Руди,
@Rudie: увы, нет: есть переменная конфигурации, которую diff.statGraphWidthвы можете использовать для установки --stat-graph-widthзначения, но остальные по умолчанию соответствуют ширине вашего терминала. (Итак, альтернативный ответ: «да, просто сделайте окно терминала шириной в 1000 столбцов» :-))
torek
22

Для обработки сценария может быть лучше использовать одно из следующих:

# list just the file names
git diff --name-only
path/to/modified/file
path/to/renamed/file


# list the names and change statuses:
git diff --name-status
M       path/to/modified/file
R100    path/to/existing/file   path/to/renamed/file


# list a diffstat-like output (+ed lines, -ed lines, file name):
git diff --numstat
1       0       path/to/modified/file
0       0       path/to/{existing => renamed}/file

Каждый из них становится более удобным для надежной обработки сценария в сочетании с -zопцией, которая используется NULв качестве терминаторов полей.

Cmbuckley
источник
Согласно моим тестам, вы не можете получить полный путь к ресурсу с помощью этих команд. На данный момент я вижу только относительные пути для удаленных файлов. Я не знаю, относится ли это только к этим файлам.
GCallie
1
Все outpu будут возвращать пути относительно git rev-parse --show-toplevel. Первоначальная проблема относилась к усеченным путям, что является проблемой в diffstats, особенно для длинных имен файлов или низкого значения для --stat-name-width. Приведенные выше команды не будут усекать пути, но покажут «полный» путь по запросу, хотя по-прежнему относительно корня репозитория.
cmbuckley
18

Для пользователей Bash вы можете использовать $COLUMNSпеременную для автоматического заполнения доступной ширины терминала:

git diff --stat=$COLUMNS

Очень длинные имена путей все еще могут быть усечены; в этом случае вы можете уменьшить ширину части +++ / ---, используя --stat-graph-width, например, это ограничивает ее до 1/5 ширины терминала:

git show --stat=$COLUMNS --stat-graph-width=$(($COLUMNS/5))

Для более общего решения вы можете использовать выходные данные tput colsдля определения ширины терминала.

Джон Меллор
источник
2
Есть ли способ глобализации --stat=$COLUMNS,$COLUMNS? Печатать его каждый раз - безумие.
Руди,
@Rudie добавить export COLUMNSк вашему ~/.bashrc, и в вашем ~/.gitconfigUnder [alias]добавитьsmart-diff = ! "gitsmartdiff() { git diff $2 --stat=$COLUMNS,$COLUMNS; }; gitsmartdiff"
user151841
@ user151841 Только это меняет diff. Я хочу, чтобы он работал и для слияний, и для вытягивания и т. Д. (Невозможно даже вручную сделать это там.) Я не думаю, что GIT поддерживает это.
Руди
@Rudie Что ж, после завершения извлечения или слияния вы можете различать предыдущие и новые хэши.
user151841
2
@ user151841 Конечно, но слияние уже дает сводку статистики. Без параметров / конфиг. Было бы здорово, если бы все «сводки статистики» использовали одну и ту же конфигурацию.
Руди
4

Там есть вариант --name-only: git diff --name-only. Эта опция также поддерживается другими командами git, такими как showи stash.

Пути не сокращаются с опцией.

Евгений Павлюк
источник
0

Я создал следующий псевдоним git:

diffstat = ! "gitdiffstat() {  git diff --stat=$(tput cols) ${1:-master} ; }; gitdiffstat"

Он считывает количество столбцов из tput colsкоманды. По умолчанию используется сравнение master, но при желании вы можете указать другую ветку.

$ git diffstat
 .gitalias | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
user151841
источник
0

Я нашел простое решение: (работает только на * nix, извините, нет osx)

git diff --stat=$COLUMNS --relative | head -n -1 | cut -c 2- | xargs -d '\n' -P4 printf "$(pwd)/%s\n"

Эта версия работает для обоих, но не очень хорошо смотрится на osx.

git diff --stat=$COLUMNS --relative | sed -e '$ d' | cut -c 2- | xargs -n4 -I{} echo "$(pwd)/{}"
Хавьер Буцци
источник
-1

Я обнаружил, что поведение diff --stat изменилось где-то около git 1.7.10, где раньше он сокращал пути к файлам до фиксированной ширины по умолчанию - теперь он отображает столько, сколько позволяет окно вашего терминала. Если вы столкнулись с этой проблемой, убедитесь, что вы обновились до 1.8.0 или новее.

Алекс Сперлинг
источник