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

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

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

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

4b9b3361

Ответ 1

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

Perl-скрипт diff-highlight Perl производит вывод, настолько похожий на скриншоты 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 файла 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'

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

diff-so-fancy output

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

dsf() { git diff --no-index --color "[email protected]" | diff-so-fancy; }

Например:

dsf original changed-file

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

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

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

Ответ 6

как говорит @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 как .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)+'

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

Во-первых: добавьте diff-highlight к вашему пути

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_HOME в каталог установки git base на вашем компьютере.

Windows

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

cd / && pwd -W

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

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

Linux

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

Ответ 10

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

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

Ответ 11

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

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

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