Выделите измененные строки и измененные байты в каждой измененной строке
Проект с открытым исходным кодом 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
-формат вывода:
Использовать его по умолчанию из 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 отдают приоритет эффективности.