В CMS на основе git, как однозначно идентифицировать файлы в репозитории git? - PullRequest
0 голосов
/ 14 августа 2010

Я работаю над простой CMS (основанной на Django, не то чтобы это имеет значение), похожей на Jekyll и Hyde , но динамической, а не статической.Идея состоит в том, что на сервере есть копия репозитория, я могу вставить туда информацию, и CMS автоматически подберет новый контент.

Допустим, записи блога в формате Markdown в моем репозитории следуют этомусхема именования файлов:

/blog/2010/08/14/my-blog-post.md

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

Проблема заключается в создании URL-адресов.таким образом, что они могут быть сопоставлены с файлами в хранилище.Я вижу несколько вариантов:

  1. /blog/2010/08/14/my-blog-post
    Если я просто сопоставлю (частично) URL-адрес с именем файла, переименование файла приведет к разрыву всех ссылок, указывающих на этот файл.Администратор контента может оставить символическую ссылку вместо старого файла, который CMS может отобразить в перенаправлении HTTP, но это требует работы, которую легко забыть.

  2. /blog/2010/08/14/271-my-blog-post
    Если я добавлю идентификатор базы данных в каждый URL, очистка или перестройка кэша приведет к аннулированию всех идентификаторов, что еще хуже.Я хотел бы, чтобы репозиторий git был единственным, что представляет содержимое сайта;все остальное должно быть восстановлено из этого.

  3. /blog/2010/08/14/528dc05-my-blog-post
    Единственная вещь, которая однозначно идентифицирует файл в репо со временем, насколько я могу судить, это пара (имя файла, SHA1).Этот файл гарантированно существует в этом коммите, и мы можем отследить его до текущего HEAD через журнал git.
    (Я не буду включать полный SHA1, но достаточно, чтобы коллизии были достаточно маловероятными.позже.)

Мой вопрос состоит из двух частей:

  • Существует ли простой и быстрый способ отслеживания пары (имя файла, SHA1)путем переименования в соответствующее имя файла в текущем заголовке?

  • Есть ли лучший способ для достижения моих целей: не ломать существующие URL-адреса, но по-прежнему разрешать переименования и перестройку кэша?

1 Ответ

0 голосов
/ 14 августа 2010

Easy / быстро?Не уверен, но я так не думаю.Git отслеживает содержимое файлов в виде BLOB-объектов.Имена файлов этих BLOB-объектов затем сохраняются в объектах дерева.Затем коммиты указывают на объекты дерева и добавляют некоторые метаданные, такие как коммиттер, datetime и родительский коммит.

Я не думаю, что Git на самом деле сохраняет переименования как таковые, это просто разница между деревьями, указывающими на одно и то жеblobs.

Я думаю, что лучшее, что вы можете сделать, - это иметь / path / to / file в качестве URL, а когда вы не найдете этот файл в HEAD, итеративно сканируйте в обратном направлении историю, чтобы найти коммит, гдебыл один.

Если вы собираетесь делать такие вещи на уровне репозитория, я рекомендую вам взять копию Git Internals Peepcode, которая довольно четко объясняет внутреннюю работу репозитория git.

...