Бэкэнда реляционной базы данных для меркуриального или git

Что мне нравится в fossil, так это то, что он использует простой старый sqlite для хранения наборов изменений, файлов и т.д. Я могу использовать его командную строку инструмент для запроса в репозиторий, но если я хочу что-то, не поддерживаемое им, я могу отказаться от написания SQL-запроса.

Mercurial и git более зрелые, у них больше библиотек, больше импульсов, но они используют собственный формат репозитория. Интересно, возможно ли иметь sqlite в качестве своего репозитория. (Я знаю, что есть инструменты для запроса репозитория mercurial или git, но sql кажется проще.)

Ответы

Ответ 1

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

Я не читал ни одного из ртутного источника, но я думаю, что ситуация не сильно отличается.

Как я и предложил в своем комментарии, я не совсем уверен, почему вы хотите это сделать. Для git, чтобы все еще иметь все свои преимущества, вам нужно будет хранить объекты git в вашей базе данных sqlite. Вам все равно понадобятся все низкоуровневые инструменты git для доступа и манипулирования ими - вы не будете просто искать капли и деревья своими SHA1 и выполнять всю оставшуюся работу самостоятельно. (И даже если по какой-то причине вы захотели, вы можете сделать это так же легко, посмотрев каталог git objects.)

Мое предложение состояло бы в том, что если вы обнаружите, что есть операции, которые вы хотите выполнить в git, которые не поддерживаются, вы знакомитесь с некоторыми командами сантехники и выясните, как писать их как скрипты. git действительно выделяет почти самый низкий уровень операций, который вы могли бы захотеть.

P.S. Если вам нужно найти определенную неподдерживаемую операцию, которую вы хотите сделать, и у вас возникли проблемы с поиском сантехники, необходимой для ее выполнения, или с помощью скриптов, необходимых для ее реализации, отправьте вопрос здесь! Нет причин застревать только потому, что вы не можете использовать sql.

Ответ 2

Как пишет Jefromi, Mercurial также использует пользовательский формат для достижения высокого сжатия и быстрого доступа к любой версии. Это revlog format, который представляет собой структуру данных только для присоединения, которая использует неизменность наборов изменений в Mercurial.

Однако, конечно, можно заменить этот формат хранения другим, если хотите. Google сделал это, когда разместил Mercurial на Bigtable для code.google.com. Одно смешное следствие их использования их собственного бэкэнд-формата состоит в том, что вы не видите никаких номеров версий в своем веб-интерфейсе. В обычном Mercurial номера версий (только локальное целое число, которое вы можете использовать вместо полного хэша изменений) - это индекс наборов изменений в revlog. Когда ревизии не хранятся в ревломах, нет никакого естественного индекса, и поэтому Google не показывает вам номера ревизий.

Ответ 3

Это возможно с помощью libgit2: https://github.com/libgit2/libgit2-backends/blob/master/sqlite/sqlite.c

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

Ответ 4

Говоря о Git, вы не можете использовать разные бэкэнд с официальными двоичными файлами. Однако проект libgit2 позволяет использовать разные серверы для хранения базы данных. Тем не менее, вам нужно будет создать все исполняемые файлы, которые вы хотите использовать для совершения, слияния, нажатия, вытягивания, перезагрузки и т.д. Кроме того, вы не сможете изменить свой репозиторий с помощью официальных двоичных файлов. Сначала вам нужно нажать его на стандартное репо.