У меня есть локальный репозиторий, и я хотел бы просмотреть все версии файла. Я могу сделать это грубо сначала найти все совершают идентификаторы:Ускоренный способ «git show» без запуска процесса каждый раз
% git log FILE | perl -nE '/\Acommit ([0-9a-f]+)\s*\z/ && say $1' log >commits
, а затем получить текст файла для каждого идентификатора:
% for i in `cat commits`; do git show $i:FILE; done
Это запускает один процесс «GIT» для каждой версии, которая медленнее чем это должно быть. (Git работает быстро, но не так быстро, что я хочу развить подпроцесс для каждой ревизии файла. Быстрый тест показывает, что запуск отдельного процесса «git show» для каждой ревизии прерывается примерно через 50 коммитов в секунду, и у меня есть более 5000 коммитов к этому файлу.)
Удачно 'git show' позволяет вам просматривать более одной версии за раз, например
% git show REV1:FILE REV2:FILE
Это работает только под одним подпроцессом для всех ревизий. Но он объединяет их вместе без маркера, поэтому программе было бы сложно определить, где заканчивается, а затем начинается. Хотя есть опция --format
, она не применяется для сброса простого содержимого и, похоже, не имеет никакого эффекта.
Есть ли способ получить все версии файла без наложения подпроцесса для каждой ревизии? Я знаю о модуле Perl Git
, но хотя он имеет метод cat_blob
, у меня пока есть только идентификатор самих коммитов, а не идентификатор, который будет соответствовать одному файлу в коммите (если такая вещь даже существует).
Итак, по-видимому, три альтернативные пути вперед:
- Некоторые опции для «мерзавца шоу», которая позволит мне выделить различные ревизии в своей продукции, или писать их в отдельные файлы и т.д.
- Некоторые из способов использования
Git
или других библиотек Perl непосредственно получить доступ к содержимому файла в различных изменениях (без порождения нового подпроцесса для каждого отдельного пересмотра) - другого инструмента или библиотеки, который делает то, что я хочу больше прямо или без труда. Мое конечное приложение должно иметь расширенный инструмент «винить», который показывает каждую строку в каждой версии файла с изменениями, в которых они были введены и удалены.
Любые предложения?