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

Как использовать --color-words с git add --patch?

При отличных файлах я предпочитаю использовать git diff --color-words. Есть ли способ сделать этот формат по умолчанию для diff при использовании git add --patch или git add --interactive?

4b9b3361

Ответ 1

Создание того, что VonC сказал:

Начиная с Git 2.9, вы можете использовать эту команду для цветных слов во время add --patch:

git -c interactive.diffFilter="git diff --color-words" add -p

Это устанавливает переменную interactive.diffFilter для вызова add -p, не затрагивая дальнейшие вызовы. Для меня это идеально, потому что я обычно обычно запускаю add -p, но иногда хочу запустить его с помощью --color-words.

Вы можете легко добавить псевдоним для этой команды следующим образом:

git config --global alias.addcw '-c interactive.diffFilter="git diff --color-words" add -p'

Ответ 2

Недавно я решил эту проблему, но она требует модификации Perl script в git. Однако это легко и не требует особого мастерства.

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

  • Скопируйте git-add--interactive из вашей установки куда-нибудь в переменную среды PATH и переименуйте ее git-add--interactive-words.
  • Отредактируйте строку примерно на половину пути, чтобы изменить
          @colored = run_cmd_pipe("git", @diff_cmd, qw(--color --), $path);
    на
           @colored = run_cmd_pipe("git", @diff_cmd, qw(--color --color-words --), $path);
  • Теперь вы можете запустить git add-interactive--words для выполнения эквивалента git add --interactive с раскрашенным разложением на основе слов.
  • Однако объединение git add --patch с этим неудобно, потому что вам нужно передать новые script правильные параметры. К счастью, вы можете создать псевдоним магических слов в .gitconfig:
    [alias]
    iaddpw = add--interactive-words --patch=stage --
    , что означает, что git iaddpw выполняет эквивалент git add --interactive --patch с раскрашенным разложением на основе слов.

Ответ 3

С git 2.9 (июнь 2016) у вас будет новый вариант: interactive.diffFilter.

См. Фиксацию 0114384 (27 февраля 2016 г.) Джеффом Кингом (peff).
(Слияние с Юнио С Хамано - gitster - в совершении 2052c52, 03 апреля 2016 года)

add --interactive: разрешить специальные программы выделения add --interactive

Селектор патчей hack для добавления --interactive знает, как задавать git для раскрашенных различий и сопоставлять их с неокрашенными различиями, которые мы применяем. Но нет никакого способа для тех, кто использует инструмент diff-filter, например diff-highlight вкладчика, чтобы увидеть их нормальное выделение.

Этот патч позволяет пользователям определять произвольную команду оболочки, чтобы передать расцветку diff. Точный вывод не должен иметь значения (поскольку мы просто показываем результат людям), если он совместим с исходным текстом (так что расщепление hunk также может разделить раскрашенную версию).

Затем вы можете передать этот diff на diff --color-words.

Как прокомментировал Эндрю Дуфресне, сообщение в блоге GitHub относится к вкладке contrib/diff-highlight:

Вы можете использовать " --color-words ", чтобы выделить только измененные части строк. Однако это часто бывает трудно прочитать для кода, поскольку он теряет структуру строки, и вы получаете нечетно отформатированные биты.

Вместо этого этот сценарий обрабатывает линейно-ориентированный diff, находит пары строк и выделяет разные сегменты.

Результат делает дополнительный акцент на измененной части строки:

diff colors

Что касается этих различий, фильтр " diff-highlight " (в contrib/) научился выводить " git log --graph " лучше.

См. Commit 4551fbb, commit 009a81e, commit fbcf99e, commit 7ce2f4c, commit e28ae50, совершить 53ab9f0, совершить 5013acc (21 марта 2018 года) Джеффом Кингом (peff).
(Слияние с Юнио С Хамано - gitster - в совершении d19e556, 10 апреля 2018 года)

Подробнее см. В разделе " diff-highlight: обнаружение --graph по --graph "


Примечание: перед Git 2.17 (Q2 2018) " interactive.diffFilter ", используемый " git add -i ", должен сохранять взаимно однозначное соответствие между его вводом и выводом, но он не был применен и вызвал путаницу конечного пользователя,

Теперь мы, по крайней мере, должны убедиться, что результат фильтрации имеет такое же количество строк, что и его вход, для обнаружения сломанного фильтра.

См. Commit 42f7d45, commit af3570e (03 марта 2018 года) Джеффом Кингом (peff).
(Слияние с Юнио С Хамано - gitster - в совершении c5e2df0, 14 марта 2018 года)

Ответ 4

Принимая ответ от ответа VonC. Ниже приведены подробные --interactive по использованию --interactive введенной в git 2.9.

Добавьте diff-highlight в PATH.

cd ~/bin
curl -LO "https://raw.githubusercontent.com/git/git/master/contrib/diff-highlight/diff-highlight"
chmod u+x diff-highlight

Перезагрузите свою оболочку, если вам нужно.

Затем настройте Git для фильтрации ваших различий, когда он показывает их в пейджере:

git config --global pager.log 'diff-highlight | less'
git config --global pager.show 'diff-highlight | less'
git config --global pager.diff 'diff-highlight | less'
git config --global interactive.diffFilter diff-highlight

Это --word-diff дополнительный акцент на измененную часть строки, которая почти такая же, как --word-diff.

Преимущество заключается в том, что вы получаете слово diff везде, где git log --patch или git add -p.

Demonstration of diff-highlight in git log --patch

Ответ 5

Как упоминалось ранее, добавление diff-highlight в interactive.diffFilter конфигурационный ключ является самым простым вариантом (с Git 2.9). Следующий комманд делает трюк в Debian/Ubuntu без копирования сценариев, изменения разрешений или каретки $PATH:

git config interactive.diffFilter "perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight"

Вещи вроде git -c interactive.diffFilter="git diff --color-words" add -p или git config interactive.diffFilter "git diff --color-words" не работают должным образом: add -p всегда продолжает предлагать первый измененный файл.

Ответ 6

Решение

Используйте diff-highlight | less -FRX --tabs=4 diff-highlight | less -FRX --tabs=4 как ваш diffFilter:

git -c interactive.diffFilter="diff-highlight | less -FRX --tabs=4" add --patch

Подробнее о diff-highlight: source, quick primer

Homebrew

Если вы используете Homebrew (OS X), вы можете поместить следующее в свой .gitconfig (чтобы использовать уже установленный diff-highlight):

    [interactive]
        diffFilter = "$(git --exec-path | sed 's/libexec/share/')/contrib/diff-highlight/diff-highlight | less -FRX --tabs=4"

1-1 между входом и выходом

Начиная с git 2.17, слово diff solution должно поддерживать соответствие 1-1 между входными и выходными линиями, чтобы избежать:

$ git -c interactive.diffFilter="git diff --word-diff --color" add --patch
fatal: mismatched output from interactive.diffFilter
hint: Your filter must maintain a one-to-one correspondence
hint: between its input and output lines.

diff-so-fancy пока не поддерживает это: https://github.com/so-fancy/diff-so-fancy/issues/35

Ответ 7

В файле $(HOME)/. gitconfig добавьте этот

[color]
        diff = auto
        interactive = auto

Это должно быть сделано.