Подтвердить что ты не робот

Использование специального инструмента сравнения с `git show`

С помощью git я могу установить собственный инструмент сравнения, который используется для определенных расширений файлов, следующим образом: .git/config

[diff "csv_diff"]
    command = Tools/csv_diff

и это в .gitattributes (в корне репозитория)

*.csv diff=csv_diff

Это работает при использовании git diff, но это не работает с git show. Мой вопрос: как я могу использовать настраиваемый инструмент с git show?

4b9b3361

Ответ 1

Похоже, вы ищете опцию --ext-diff.

Здесь git show docs говорят об этом:

- доб-Diff

Разрешить выполнение внешнего помощника diff. Если вы установите внешний драйвер diff с gitattributes, вам нужно использовать этот параметр с git-log. и друзей.

Ответ 2

Как и @LucasTrzesniewski, вы можете использовать --ext-diff из командной строки для установки diff для текущего сеанса.

Вы также можете использовать . gitattributes, чтобы установить git -diff perfile.

A git реализация diff существует из двух частей:

  • Определение в $GIT_DIR/config или $HOME/.gitconfig
  • Связи между файлом и определением в gitattributes

Git имеет выбор для этого проекта, чтобы отделить исполняемый код от исходного кода, это делает невозможным выполнение git clone или другой git команды любого вредоносного кода.

Написание определения

Чтобы написать определение, мы начинаем с заголовка, состоящего из [diff "namehere"], затем следует разрыв строки.

Следующая строка состоит из определения команды, эта строка выглядит следующим образом: command = commandlinehere. Затем эта команда вызывается с 7 аргументами, если она запущена, они документированы для среды GIT_EXTERNAL_DIFF в документах.

GIT_EXTERNAL_DIFFКогда переменная среды GIT_EXTERNAL_DIFF set, вызываемая им программа вызывается вместо вызова diff описано выше. Для пути, который добавляется, удаляется или изменяется, GIT_EXTERNAL_DIFF вызывается с 7 параметрами:

path old-file old-hex old-mode new-file new-hex new-mode where:

< old | new > -file - это файлы, которые GIT_EXTERNAL_DIFF может использовать для чтения содержимое < old | new > ,

< old | new > -hex представляют собой 40-гексдигитные SHA-1 хеши,

< old | new > -mode - это восьмеричное представление файловых режимов.

Параметры файла могут указывать на рабочий файл пользователей (например, new-file в "git -diff-files" ),/dev/null (например, old-file, когда новый файл) или временный файл (например, старый файл в индексе). GIT_EXTERNAL_DIFF не следует беспокоиться о том, чтобы отменить временный файл, он удаляется при выходе GIT_EXTERNAL_DIFF.

Для несвязанного пути GIT_EXTERNAL_DIFF вызывается с 1 параметр, <path> .

Для каждого пути GIT_EXTERNAL_DIFF вызывается две переменные среды, GIT_DIFF_PATH_COUNTER и GIT_DIFF_PATH_TOTAL.

Общий пример выглядит следующим образом:

[diff "jcdiff"]
command = j-c-diff

Запись gitattributes

Нам нужно изменить наши gitattributes, чтобы использовать наш пользовательский драйвер. Файл gitattributes состоит из синтаксиса, подобного filename value [value2 [value3 [value4 [...]]]].

<сильные > Примеры:

*           diff=jcdiff

Мы используем наш специальный git diff для каждого файла.

*.java      diff=javadiff
*.python    diff=pythondiff

Используйте javadiff для java файлов, pythondiff для файлов python.

*           diff=globaldiff
*.java      diff=javadiff

Используйте javadiff для java файлов, globaldiff для оставшихся файлов.

Настройка git для автоматического набора --ext-diff

Вы можете добавить псевдоним, используя git config alias.showobject 'show --ext-diff', чтобы определить новую команду под названием git showobject, которая автоматически использует наш фильтр.

Ответ 3

В качестве альтернативного ответа для других в поиске использования инструмента сравнения, такого как meld с git show

git difftool --tool=meld HEAD~..HEAD

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

Чтобы показать конкретную фиксацию или ветвь, я создал этот псевдоним в своем ~/.gitconfig

[alias]
    showm = "!f(){ if [ -z $1 ]; then c='HEAD'; else c=$1; fi; git difftool --tool=meld -y $c~..$c; }; f"

Это запустит meld для отображения различий, введенных этим фиксатором:

git showm <branch or hash>

Без аргумента он будет использовать HEAD по умолчанию:

git showm

В качестве бонуса вы можете следить за этим псевдонимом bash, чтобы получить завершение табуляции для имен веток, добавив это в ~/.bashrc

alias showm='git showm'
__git_complete showm _git_show