Алгоритм для системы управления версиями?

Мне нужно написать простую систему управления версиями и задаться вопросом, какой алгоритм я буду использовать для различий файлов?

Я не хочу изучать существующий исходный код из-за проблем с лицензией. Мне нужно, чтобы он был лицензирован в MPL, поэтому я не могу смотреть на какие-либо существующие системы, такие как CVS или Mercurial, поскольку они все лицензированы GPL.

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

В целом действительно простой материал, моя единственная проблема заключается в том, как хранить только различия в файле от пересмотра до версии, не тратя слишком много места, но также не будучи слишком неэффективным (возможно, хранить полную версию каждый X-изменений, Ключевые кадры в видео?)

Ответ 1

Алгоритмы Longest Common Subsequence являются основным механизмом, используемым средствами сравнения, и могут быть использованы системой управления исходным кодом.

"Обратные Deltas" - общий подход к хранению, поскольку вам в первую очередь нужно двигаться назад во времени из самой последней версии.

Ответ 2

Patience Diff - хороший алгоритм для поиска дельт между двумя файлами, которые могут иметь смысл для людей. Это часто дает лучшие результаты, чем наивный алгоритм "самой длинной общей подпоследовательности", но результаты субъективны.

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

Ответ 3

Как насчет поиска исходного кода Subversion? его лицензия под лицензией Apache 2.0

Ответ 4

Джин Майерс написал хорошую бумагу Алгоритм разложения (ND) и его вариации. Когда дело доходит до сравнения последовательностей, Майерс - это человек. Вероятно, вы также должны прочитать статью Уолтера Тичи о RCS; он объясняет, как хранить набор файлов, сохраняя самую последнюю версию плюс отличия.

Ответ 5

Хотя ископаемое является GPL, алгоритм дельта основан на rsync и описывается здесь

Ответ 6

Идея хранения дельт (вперед или назад) является классической в ​​отношении контроля версий. Вопрос всегда был: "Какую дельта вы храните?"

Многие системы управления источниками хранят дельта, которые вычисляются по существу с помощью "diff", например, линейно-ориентированного дополнения к самым длинным общим подпоследовательностям. Но вы можете вычислить дельт для определенных типов документов таким образом, который подходит для этих документов, чтобы получить меньшие (и часто более понятные) дельта.

Для исходного кода языков программирования можно вычислить расстояния Левенштейна над структурами программ. Набор инструментов для выполнения этого для множества популярных языков программирования можно найти на Smart Differencer

Если вы храните нетекстовые файлы, вы можете использовать их структуру для вычисления меньших дельт.

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

Ответ 7

Я действительно думал о чем-то подобном этому на днях... (странно, да?)

У меня нет отличного ответа для вас, но я пришел к выводу, что если бы я написал файл diff diff, то я бы сделал это с помощью алгоритма (для поиска diff), который работает примерно так же, как REGEXes с их жадностью.

Как для хранения DIFF... Если бы я был вами, вместо хранения передних DIFF (то есть вы начинаете с исходного файла, а затем компьютер 150 отличается от него, когда вы работаете с версией 151), используйте хранимые DIFF для вашей истории, но ваш последний файл хранится как полная версия. Если вы сделаете это так, то всякий раз, когда вы работаете с последним файлом (вероятно, в 99% случаев), вы получите максимальную производительность.