Выделите измененные строки и измененные байты в каждой измененной строке - PullRequest
73 голосов
/ 16 марта 2011

Проект с открытым исходным кодом Trac имеет отличную подсветку различий & mdash; он выделяет измененные строки и измененные байты в каждой измененной строке! См. здесь или здесь для примеров.

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

Ответы [ 11 ]

49 голосов
/ 01 марта 2013

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

enter image description here

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

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'
34 голосов
/ 20 марта 2011

При использовании git diff или git log и, возможно, других, используйте опцию --word-diff=color (есть и другие режимы для сравнения слов, кстати)

12 голосов
/ 15 сентября 2016

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

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

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

diff-so-fancy output

Если вы хотите вывод 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 screenshot

Чтобы использовать егопо умолчанию от 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, который окрашивает в cуровень характера, а затем распределяет выходные данные в меньшем количестве (при необходимости), чем просто используя значение по умолчанию less.

10 голосов
/ 11 мая 2011

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

$ git diff --color-words | less -RS
9 голосов
/ 15 сентября 2014

Требуемое поведение теперь доступно в самом 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 не работает.

7 голосов
/ 17 января 2019

Утилита для различий на основе байтов распространяется с официального Git начиная с v1.7.8 1 . Вам просто нужно найти, где он установлен на вашем компьютере и включить его.

Найти, где установлен Git

  • MacOS с установленным Git через Homebrew : Это /usr/local/opt/git
  • Windows с Git для Windows : Запустите cd / && pwd -W, чтобы найти каталог установки.
  • Linux: ботаник. Если вы еще не знаете, где установлен Git, тогда ll $(which git) или locate git должны помочь.

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

GIT_HOME='/usr/local/opt/git/'  # Use the value from the first step.
ln -s "${GIT_HOME}/share/git-core/contrib/diff-highlight/diff-highlight" \
      '/usr/local/bin/diff-highlight'

Включите его в вашем Git config

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

1 Вот версия v1.7.8 , но с тех пор было сделано много изменений .

4 голосов
/ 26 января 2018

как @ 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)+'
1 голос

Diffy

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

enter image description here

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 был добавлен в измененные байты.

1 голос
/ 21 марта 2011

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
0 голосов
/ 16 марта 2011

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

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

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

...