2015-03-24 4 views
1

У меня есть локальный репозиторий, и я хотел бы просмотреть все версии файла. Я могу сделать это грубо сначала найти все совершают идентификаторы:Ускоренный способ «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 непосредственно получить доступ к содержимому файла в различных изменениях (без порождения нового подпроцесса для каждого отдельного пересмотра)
  • другого инструмента или библиотеки, который делает то, что я хочу больше прямо или без труда. Мое конечное приложение должно иметь расширенный инструмент «винить», который показывает каждую строку в каждой версии файла с изменениями, в которых они были введены и удалены.

Любые предложения?

ответ

1

Я спросил в списке рассылки git, и git cat-file --batch - это то, что вам нужно. Он принимает пары REV:FILE на стандартном входе и выводит содержимое файла на стандартный вывод в том же порядке. Каждый файл имеет префикс строки заголовка, дающий длину в байтах.

Смежные вопросы