В проекте с открытым исходным кодом Trac есть отличный инструмент для выделения различий - он выделяет измененные строки и измененные байты в каждой измененной строке! См. Примеры здесь или здесь .
Есть ли способ использовать одну и ту же цветовую подсветку (например, измененные строки и измененные байты ) в терминале bash git
или vim
для вывода diff (файл патча)?
Ответы:
Сценарий
diff-highlight
Perl contrib выдает результат, настолько похожий на снимки экрана Trac, что вполне вероятно, что Trac его использует:Установить с помощью:
Переместите файл
diff-highlight
в~/bin/
каталог (или где-нибудь$PATH
еще), а затем добавьте в свой~/.gitconfig
:Установка с одной копией вставки, предложенная @cirosantilli:
источник
git add -p
. Также добавьте:git config --global interactive.diffFilter diff-highlight
При использовании
git diff
илиgit log
и, возможно, других, используйте опцию--word-diff=color
(есть также другие режимы для word diffs BTW)источник
--word-diff=color
действительно лучше (особенно сgit config color.diff.old "red reverse"
иgit config color.diff.new "green reverse"
), но это не то, что я хочу :(git add --patch
: stackoverflow.com/questions/10873882/…diff-highlight
заключается в том, что он хорошо работает как для слов, так и для строк.diff-so-fancy
-diff
осветитель, предназначенный для глаз человека.Он удаляет начальные
+
/,-
которые раздражают при вырезании / вставке, и очищает разделы между файлами.Цветное
git
(слева) противdiff-so-fancy
(справа - обратите внимание на выделение на уровне персонажа):Если вы хотите, чтобы
diff-so-fancy
вывод (правая сторона) не ограничивался файлами вgit
репозитории, добавьте следующую функцию в свой,.bashrc
чтобы использовать ее для любых файлов:Например:
Подсветка уровня символов и стандартный
diff
форматЕсли вам не нравится нестандартное форматирование
diff-so-fancy
, но вы все же хотитеgit
выделить на уровне символов , используйтеdiff-highlight
which, чтобы получитьgit
вывод в действительноdiff
красивом стандартном формате:Чтобы использовать его по умолчанию из
git
, добавьте в свой.gitconfig
:В этом
[pager]
разделе говоритсяgit
о конвейере уже окрашенного вывода,diff-highlight
который раскрашивается на уровне символа, а затем выводит вывод с меньшим количеством страниц (если требуется), а не просто с использованием значения по умолчаниюless
.источник
gitconfig
вариантах?dsf()
.Желаемое поведение теперь доступно в самом git (как было указано в комментарии naught101). Чтобы включить его, вам нужно настроить свой пейджер на
где
/usr/share/doc/git/contrib/diff-highlight/diff-highlight
находится скрипт подсветки в Ubuntu 13.10 (я понятия не имею, почему он вdoc
папке). Если его нет в вашей системе, попробуйте использовать,locate diff-highlight
чтобы найти его. Обратите внимание, что сценарий выделения не является исполняемым (по крайней мере, на моем компьютере), следовательно, требуетсяperl
.Чтобы всегда использовать маркер для различных команд, подобных различию, просто добавьте в свой
~/.gitconfig
файл следующее:Я добавил это как новый ответ, комментарий naught101 похоронен, и потому что настройка не так тривиальна, как должна быть, и, по крайней мере, в той версии Ubuntu, в которой у меня есть инструкции в README , не работают.
источник
git add -p
(интерактивный режим). Я не знаю, как это можно исправить, просто добавление добавления в список приводит к зависанию.git config interactive.diffFilter diff-highlight
diff-highlight
это не было на моем пути, поэтому мне пришлось сначала найти его. Подробности в моем ответе ниже.Утилита для сравнения на основе байтов распространяется с официальным Git начиная с версии 1.7.8 1 . Вам просто нужно найти, где он установлен на вашем компьютере, и включить его.
Найдите, где установлен Git
/usr/local/opt/git
cd / && pwd -W
чтобы найти установочный каталог.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
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 , но с тех пор было внесено много изменений .
источник
which git
требует, чтобы он был в PATH в первую очередь, поэтому он не будет работать, если это не так :-)diff-highlight
, на самом деле он не устанавливает его, поэтому шаг символьной ссылки действительно необходим (по крайней мере, в macOS). Если вы обнаружите, что это не обязательно для вашей платформы, снова не стесняйтесь обновить ответ. В то же время, какwhich git
правило , делает работу, потому что Git делает установкиgit
бинарного где - то на пути..perl
. Компиляция тривиальна: просто запуститеsudo make
вdiff-highlight
каталоге.Я использую
--color-words
вариант, и он мне подходит:источник
как говорит @dshepherd :
Но
diff-highlight
находится в DOC и недоступен из оболочки.Чтобы установить
diff-highlight
в свой~/bin
каталог, выполните следующие действия (это сохранит ваш ввод):Затем настройте свой
.gitconfig
как официальный документ:UPD
Также вы можете попробовать следующее
git
без установки:Более сложный:
источник
В Emacs есть функция ediff-patch-buffer, которая должна удовлетворить ваши потребности.
Откройте файл без исправлений в emacs типа ESC-x, ediff-patch-buffer.
Следуйте инструкциям, и вы должны увидеть выделенное сравнение исправленной и исходной версий вашего файла.
В соответствии с вашим комментарием следующее даст вам решение bash, требующее только dwdiff:
источник
colordiff -u <(patch original_file -i patch_file -o -) <(cat original_file)
но это только выделит измененные строки, а не кусочки ...dwdiff -c --diff-input diff_file
Диффи
GitLab использует Diffy https://github.com/samg/diffy (Ruby) для достижения вывода, аналогичного GitHub и diff-highlight:
Diffy сам делает различие, используя тот же алгоритм, что и Git, и поддерживает различные типы вывода, включая вывод HTML, который использует GitLab:
Выход:
Обратите внимание, как
strong
были добавлены измененные байты.источник
Да, Vim делает это, включая выделение текста, измененного внутри строки.
Смотрите
:h diff
и:h 08.7
для получения дополнительной информации о том, как сравнивать файлы.Vim использует довольно простой алгоритм выделения. Он ищет в строке первый измененный символ, а затем последний измененный символ и просто выделяет все символы между ними.
Это означает, что у вас не может быть нескольких основных моментов в строке - многие дизайнерские решения в Vim отдают приоритет эффективности.
источник
vimdiff file1 file2
отобразит посимвольную разницу между двумя файлами.vimdiff - это инструмент сравнения, включенный в vim. (Vim должен был быть скомпилирован с опцией + diff, чтобы убедиться, что вы можете проверить
:version
)Вы также можете запустить его из vim. См.
:help diff
Дополнительную информацию и команды.источник
vimdiff file.old file.new -c 'FormatCommand diffformat' -c 'w! file.diff.html' -c 'qa!'
.screen -D -m
добавление или добавление&>/dev/null
(вариант / dev / null иногда вызывает странные ошибки), если вы не хотите видеть мигание терминала) и выйдет из vim после завершения форматирования, но это чистый vimscript и даже с моей оптимизацией это очень медленно для больших файлов.Примечание . Это дубликат того, что можно найти здесь: Как улучшить выделение различий в git? . Публикую свой ответ и здесь, так как он может быть полезен некоторым людям, которые напрямую находят эту тему :)
Как было сказано в некоторых предыдущих ответах, это возможно только с помощью git. Я публикую это, так как инструкции могут быть немного проще в зависимости от вашей системы, но это похоже на несколько других ответов.
Одно решение, которое полностью полагается на git и его вклад. Для этого не требуются дополнительные файлы, кроме того, что поставляется с git . Все объяснения относятся к Ubuntu (протестировано на 18.04LTS), должно работать аналогично в других системах Linux:
в моей системе единственный правильный ответ:
~/.gitconfig
чтобы получить желаемый результат, добавив (обратите внимание, что это ТАБЛИЦЫ, а не 4 пробела):источник