Интерактивное сравнение в git-е
Когда я перешёл с Mercurial-а на git, меня постигло небольшое разочарование:
я не нашёл аналога расширению
extdiff.
А конфигурационный параметр diff.external работал не так, как я этого
ожидал.
Зачем нужен extdiff и как он работает? Это расширение позволяет использовать внешние программы для сравнения файлов. Преимуществ перед внутренним diff-ом несколько:
- сравнение файлов «боб о бок» (side by side) — иногда это нагляднее;
- правка по месту и желанию, т. к. неудобно сравнивать в одной программе, а искать и исправлять в другой;
- дерево всех изменённых файлов.
extdiff создаёт две временные директории, воссоздаёт в них структуру сравниваемых commit-ов и запускает внешнюю программу для сравнения этих двух папок. После завершения те файлы что были взяты из рабочей директории (разумеется, если это имело место быть) возвращаются назад.
git работает иначе: он запускает diff.external отдельно для каждой пары
изменённых файлов. И всё.
Решение проблемы. В общем-то, git прав, поскольку работает по принципу KISS. Но от этого не легче. Поиск готового решения привёл к GitDiff.bat и GitDiff.rb, которые меня не устроили как минимум по причине зависимостей от Ruby и Windows-а. И я решил написать своё на Perl-е.
Предлагаю вашему вниманию скрипт git-idiff.
Для начала работы переопределите переменную $diff и вызов вашей любимой
программы для сравнивания (в коде есть примеры). Запускать так же как
и git diff, например:
git-idiff --cached
Поскольку git для работы требует Perl, то для работы git-idiff-а у вас уже всё есть. Работоспособность проверялась на GNU/Linux-е с git-ом версии 1.6.2.1 и на Windows-е XP с msysGit-ом версии 1.6.5.1. При использовании Perl-а из пакета msysGit-а есть некоторые нерешённые проблемы.