Выделите измененные строки и измененные байты в каждой измененной строке

Проект с открытым исходным кодом Trac имеет отличную подсветку различий - он выделяет измененные строки и измененные байты в каждой измененной строке! См. https://trac.transmissionbt.com/changeset/12148 или http://trac.gajim.org/changeset/297ad7711d20bfee1491768640d9bc5384464363 для примеров.

Есть ли способ использовать ту же цветовую подсветку (т.е. измененные строки и измененные байты) в терминале bash, git или vim для вывода diff (patch-файл)?

14 ответов

Я поделился подсказкой, которая может помочь, вот она https://coderwall.com/p/ydluzg

diff-highlight Сценарий Perl contrib производит вывод, настолько похожий на скриншоты Trac, что вполне вероятно, что Trac его использует:

Установить с помощью:

wget https://raw.githubusercontent.com/git/git/fd99e2bda0ca6a361ef03c04d6d7fdc7a9c40b78/contrib/diff-highlight/diff-highlight && chmod +x diff-highlight

Переместить файл diff-highlight к ~/bin/ каталог (или везде, где ваш $PATH есть), а затем добавьте следующее к вашему ~/.gitconfig:

[pager]
        diff = diff-highlight | less
        log = diff-highlight | less
        show = diff-highlight | less

Установка @cirosantilli в единственном экземпляре:

cd ~/bin
curl -O https://raw.githubusercontent.com/git/git/fd99e2bda0ca6a361ef03c04d6d7fdc7a9c40b78/contrib/diff-highlight/diff-highlight
chmod +x diff-highlight
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 diff или же git log и, возможно, другие, используйте опцию --word-diff=color (Есть также другие режимы для различий слов BTW)

diff-so-fancy это diff - хайлайтер предназначен для глазных яблок человека.

Удаляет ведущие + / - которые раздражают для вырезать / вставить и делает четкие разделы между файлами.

цветной git (слева) против diff-so-fancy (справа - обратите внимание на основные моменты уровня персонажа):

Отличный выход

Если вы хотите diff-so-fancy (правая сторона) вывод, но не ограничивается файлами в git хранилище, добавьте следующую функцию в ваш .bashrc использовать его на любых файлах:

dsf() { git diff --no-index --color "$@" | diff-so-fancy; }

Например:

dsf original changed-file

Подсветка уровня персонажа и стандарт diff формат

Если вам не нравится нестандартное форматирование diff-so-fancy, но все же хочу на уровне персонажа git выделение, использование diff-highlight который займет git выход и производить действительно красивый стандарт diff -формат вывода:

скриншот diff-highlight

Использовать его по умолчанию из git добавь в свой .gitconfig:

[color "diff-highlight"]
  oldNormal = red bold
  oldHighlight = red bold 52
  newNormal = green bold
  newHighlight = green bold 22

[pager]
  diff = diff-highlight | less -FRXsu --tabs=4

[pager] раздел рассказывает git направить свою уже окрашенную продукцию в diff-highlight которая расцветает на уровне персонажа, а затем распределяет выходные данные в меньшем количестве (если требуется), а не просто используя значение по умолчанию less,

Это намного проще в 2019 году

Байтовые различия теперь распространяются вместе с официальными git, Вам просто нужно найти, где он установлен на вашем компьютере и включить его.

Первый: ссылка diff-highlight в каталог bin, чтобы его можно было найти в вашем PATH

GIT_HOME=/usr/local/opt/git/
ln -s ${GIT_HOME}/share/git-core/contrib/diff-highlight/diff-highlight /usr/local/bin/diff-highlight

Второе: включите в вашей конфигурации Git

git config --global interactive.diffFilter diff-highlight # Use on interactive prompts
git config --global pager.diff "diff-highlight | less"    # Use on git diff
git config --global pager.log  "diff-highlight | less"    # Use on git log
git config --global pager.show "diff-highlight | less"    # Use on git show

Если вы не используете macOS или не устанавливали git через brew, установите GIT_HOME перед установкой в ​​каталог git base install на вашем компьютере.

Windows

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

cd / && pwd -W

Затем используйте путь из этой команды в качестве GIT_HOME, Здесь вы найдете альтернативные методы поиска директории установки Git в Windows.

Я лично не проверял это на Windows, но это должно работать

Linux

Ботан. Если вы еще не знаете, где установлен git, тогда ll $(which git) или же locate git должно помочь

Требуемое поведение теперь доступно в самом git (как было отмечено в комментарии naught101). Чтобы включить его, вам нужно настроить пейджер на

perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less

где /usr/share/doc/git/contrib/diff-highlight/diff-highlight расположение сценария подсветки в Ubuntu 13.10 (я понятия не имею, почему он находится в doc папка). Если его нет в вашей системе, попробуйте использовать locate diff-highlight найти его. Обратите внимание, что скрипт подсветки не является исполняемым (по крайней мере, на моем компьютере), поэтому необходимо perl,

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

[pager]
    log = perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less
    show = perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less
    diff = perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less

Я добавил это как новый ответ. Комментарий naught101 похоронен, и потому что настройка не так тривиальна, как это должно быть, и, по крайней мере, в той версии Ubuntu, что у меня есть инструкции в README, не работают.

Я использую --color-words вариант, и он прекрасно работает для меня:

$ git diff --color-words | less -RS

Как говорит @dshepherd:

Требуемое поведение теперь доступно в самом git

Но diff-highlight находится в DOC и недоступен из оболочки.
Установить diff-highlight в ваш ~/bin выполните следующие действия (это сохранит ваш набор):

$ locate diff-highlight
$ cd /usr/share/doc/git/contrib/diff-highlight  #or path you locate
$ sudo make
$ mv diff-highlight ~/bin

Затем настройте свой .gitconfig как говорит официальный документ:

[pager]
    log  = diff-highlight | less
    show = diff-highlight | less
    diff = diff-highlight | less

UPD
Также вы можете попробовать следующий на последнем git без какой-либо установки:

git diff --color-words=.

Более сложный:

git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'

В ответ на похожий, но немного другой вопрос я предлагаю использовать Delta — современный инструмент постобработки diff, специально поддерживающий особое стремление к выделению одновременно и слов, и строк.

Delta легко настраиваетсярежимами эмуляции для diff-highlightа также diff-so-fancy) и включает в себя множество функций , отсутствующих в других инструментах: параллельные представления, подсветку синтаксиса и выделение цветом конфликтов слияния и git blameвыход .

В документации Delta также есть обзор связанных проектов , в котором упоминаются еще несколько специальных инструментов, которые могут выделять как слова, так и строки.

Emacs имеет функцию ediff-patch-buffer, которая должна удовлетворить ваши потребности.

Откройте файл без исправлений в emacs типа ESC-x, ediff-patch-buffer.

Следуйте инструкциям, и вы увидите выделенное сравнение исправленных и оригинальных версий вашего файла.

Согласно вашему комментарию следующее даст вам решение bash, требующее только dwdiff:

#!/bin/bash
paste -d'\n' <(dwdiff -2 -L -c <(cat $2) <(patch $2 -i $1 -o -)) <(dwdiff -1 -L -c <(cat $2) <(patch $2 -i $1 -o -))| uniq

Diffy

GitLab использует Diffy https://github.com/samg/diffy (Ruby) для получения результатов, аналогичных GitHub и diff-highlight:

введите описание изображения здесь

Diffy сам создает diff, используя тот же алгоритм ad Git, и поддерживает различные типы выходных данных, включая HTML-вывод, который использует GitLab:

gem install diffy
echo '
  require "diffy"    
  puts Diffy::Diff.new("a b c\n", "a B c\n").to_s(:html)
' | ruby

Выход:

<div class="diff">
  <ul>
    <li class="del"><del>a <strong>b</strong> c</del></li>
    <li class="ins"><ins>a <strong>B</strong> c</ins></li>
  </ul>
</div>

Обратите внимание, как strong был добавлен в измененные байты.

Примечание: это дубликат того, что находится здесь: Как улучшить выделение различий в git?. Публикую свой ответ и здесь, так как он может быть полезен некоторым людям, которые напрямую находят эту ветку:)

Как было сказано в некоторых предыдущих ответах, это возможно только с помощью git. Я публикую это, так как инструкции могут быть немного проще в зависимости от вашей системы, но это похоже на несколько других ответов.

Одно решение, которое полностью полагается на git и его вклад. Для этого не требуются дополнительные файлы, кроме того, что поставляется с git. Все объяснения относятся к Ubuntu (проверено на 18.04LTS), должно работать аналогично в других системах Linux:

  • Найдите фрагмент кода diff-highlight contrib git:
find -L /usr -name diff-highlight -type f

в моей системе единственный правильный ответ:

/usr/share/doc/git/contrib/diff-highlight/diff-highlight
  • Сделайте соответствующий скрипт Perl исполняемым. В моем случае мне нужно было сделать:
sudo chmod +x /usr/share/doc/git/contrib/diff-highlight/diff-highlight
  • Обновите свой ~/.gitconfig чтобы получить желаемый результат, добавив (обратите внимание, что это ТАБЛИЦЫ, а не 4 пробела):
[color "diff-highlight"]
    oldNormal = red
    oldHighlight = red 52
    newNormal = green
    newHighlight = green 22
  • Наслаждайтесь результатом (примечание: это только для окраски различий + выделения, у меня, конечно же, есть другие вещи для подсказки:)).

Мой плагин vim vim-gitgutter делает это при предварительном просмотре различий. Простой пример вы можете увидеть на скриншоте в файле readme.

Код, вычисляющий внутристрочные различия, находится здесь .

vimdiff file1 file2 будет отображать различие в символах между двумя файлами.

vimdiff - это инструмент сравнения, включенный в vim. (Vim должен быть скомпилирован с опцией +diff, чтобы убедиться, что вы можете проверить с :version)

Вы также можете запустить его изнутри vim. Увидеть :help diff для получения дополнительной информации и команд.

Да, Vim делает это, включая выделение текста, измененного внутри строки.
Увидеть :h diff а также :h 08.7 для получения более подробной информации о том, как различать файлы.

Vim использует довольно простой алгоритм подсветки. Он ищет в строке первый измененный символ, а затем последний измененный символ и просто выделяет все символы между ними.
Это означает, что вы не можете иметь несколько выделений на строку - многие решения по дизайну в Vim отдают приоритет эффективности.

Другие вопросы по тегам