Как системы контроля версий генерируют оригинальный файл с длинной историей так быстро? - PullRequest
1 голос
/ 19 сентября 2019

Я работаю над простой системой управления версиями текстовых файлов в Java.Когда используется команда commit, я вычисляю разницу между последней версией и последней зафиксированной версией и сохраняю ее.Я написал код для создания файла сравнения и восстановления исходного файла.Проблема здесь в том, что я чувствую, что для очень большой истории коммитов мне придется воссоздать последнюю зафиксированную версию и затем использовать diff.Это также будет иметь место, когда я извлекаю предыдущую версию файла.Таким образом, используя мой алгоритм, мне придется использовать мой первый коммит (который содержит все исходные данные, а не diff), а затем продолжать применять алгоритм регенерации для следующего diff.Это займет очень много времени.Я с нетерпением жду, чтобы сделать это быстрее и эффективнее.Можете ли вы сказать мне, как мне это сделать?

Кроме того, не все различия рассчитываются в том же порядке, который указан. То есть, если у меня есть два файла, file1 и file2, я вычисляю разницу какэто: diff(file1, file2); и diff(file2, file1);.И я сохраняю только файл, который меньше по размеру.Другой файл, я его удаляю.Я хотел бы знать, если это хороший подход?

Мне нужен только какой-то способ решения этой проблемы.Не исходный код.

1 Ответ

1 голос
/ 23 сентября 2019

Допустим, у вас есть огромный файл, 10000 строк, и у вас есть много коммитов в этом файле.

В случае, если вы хотите вернуться назад / вперед более чем на один коммит, вы не должны применятькаждый коммит в огромный файл.Вместо этого, начиная с первого коммита, создайте файл diff с номерами строк.Потому что, когда 1-й коммит добавляет строку X, 2-й коммит может удалять строку X. Таким образом, вам не нужно иметь дело с файлом дважды.Если вы сохраняете файл diff только с номерами строк, то при последнем коммите вы можете начать применять diff.

Существуют всевозможные оптимизации, которые вы можете сделать поверх этого, но исходя из своего объяснения, а не воссозданияфайл является наиболее важным.

...