LibGit2Sharp Подсчитайте, как часто файл изменялся

У меня есть репозиторий с более чем 10 000 записей. Я не хочу заботиться о переименованных файлах. Каков наилучший подход для подсчета количества изменений, внесенных в файл?

Моя идея состояла в том, чтобы перебрать все коммиты и сравнить target.sha файла с его родительским коммитом. Если SHA тот же, файл не был изменен. Если SHA отличается, значит, было найдено изменение файла, что означает, что это новая версия.

foreach(Commit c in repository.Commits)
{
//DO THE WORK
}

Это занимает некоторое время, но это было самое быстрое, что я мог получить на данный момент.

Может быть, у кого-то есть идея получше?


person JoeLiBuDa    schedule 14.04.2014    source источник


Ответы (2)


То, как вы описываете, в основном так быстро, как вы собираетесь его получить. Что осталось, так это любые оптимизации, специфичные для вашей реализации решения, но без публикации кода мы не можем это комментировать.

Возможно, стоит сравнить деревья, которые ведут к файлу, а не только к файлу, чтобы сэкономить несколько аллокаций и затрат на сортировку; но вы действительно не станете лучше алгоритмически, чем сравнивая записи дерева.

person Carlos Martín Nieto    schedule 14.04.2014

На самом деле это будет ваш лучший выбор. Это такой же подход, который использует Git для решения проблемы, поэтому это займет много времени. работы, чтобы заставить его работать лучше, быстрее и надежнее. Вы можете попробовать использовать более быстрый алгоритм хеширования, такой как MD5, если все, что вам нужно, это подсчет количества коммитов, в которых вносятся изменения.

ПРИМЕЧАНИЕ. Теоретически вы можете столкнуться с некоторыми проблемами точности с MD5, но только для невероятно больших наборов данных, и этого должно быть достаточно для ваших нужд.

person gfish3000    schedule 14.04.2014
comment
Что вы имеете в виду, используя алгоритм MD5 с LibGit2Sharp. Как это должно работать? Я не хочу вносить изменения в библиотеку. - person JoeLiBuDa; 14.04.2014
comment
Содержимое уже хешировано. Этот подход сравнивает идентификаторы коммитов, которые представляют собой уже вычисленный хэш, а не пересчитывает хэш. Это действительно будет очень дорого! - person Edward Thomson; 14.04.2014