Выделите измененные строки и измененные байты в каждой измененной строке
Проект с открытым исходным кодом Trac имеет отличную подсветку diff - он подсвечивает измененные строки и измененные байты в каждой измененной строке! Смотрите здесь или здесь для примеров.
Есть ли способ использовать ту же цветовую подсветку (т.е. измененные строки и измененные байты) в терминале bash, git
или vim
для вывода diff (patch файл)?
Ответы
Ответ 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
для получения дополнительной информации и команд.