Как можно безопасно использовать базу данных общих объектов в git?
Я прочитал в нескольких местах, что можно поделиться objects
каталог между несколькими git-репозиториями, например, с символическими ссылками. Я хотел бы сделать это, чтобы разделить объектные базы данных между несколькими пустыми репозиториями в одном каталоге:
shared-objects-database/
foo.git/
objects -> ../shared-objects-database
bar.git/
objects -> ../shared-objects-database
baz.git/
objects -> ../shared-objects-database
(Я делаю это, потому что в противном случае в каждом каталоге объектов будет много избыточных больших объектов.)
Меня беспокоит то, что при использовании этих репозиториев, git gc
будет вызван автоматически и приведет к удалению объектов, недоступных из одного хранилища, что сделает другие хранилища неполными. Есть ли простой способ убедиться, что этого не произойдет? Например, есть ли опция конфигурации, которая заставит --no-prune
быть по умолчанию для git gc
и, если да, будет ли этого достаточно, чтобы использовать эту настройку, не рискуя потерять данные?
На данный момент я использую objects/info/alternates
механизм для обмена объектами между этими репозиториями, но поддержание этих указателей из каждого репозитория для всех остальных является немного хакерским.
(Моя другая альтернатива - просто иметь один пустой репозиторий со всеми ветвями foo.git
, bar.git
а также baz.git
названный foo-master
, foo-testing
, bar-master
и т. д. Однако управлять этим было бы немного больше, поэтому, если каталог объектов с символическими ссылками может работать безопасно, я бы предпочел сделать это.)
Вы можете догадаться, что это один из тех, кто использует Git для случаев, когда это не было задумано, но я надеюсь, что вопрос ясен и тем не менее действителен;)
2 ответа
Почему бы просто не провернуть gc.pruneExpire
переменная до never
? Маловероятно, что у вас когда-нибудь будут свободные объекты 1000 лет, которые вы не хотите удалять.
Чтобы убедиться, что вещи, которые действительно должны быть обрезаны, обрезаны, вы можете оставить один репозиторий, в котором все остальные будут удаленными. git gc
было бы довольно безопасно в этом, так как он действительно знает, что недоступно.
Изменить: Хорошо, я был немного кавалерным по поводу ограничения времени; как отмечено в комментариях, 1000 лет не будут работать слишком хорошо, но начало эпохи будет, или never
,
Возможно, это было добавлено в git после того, как на этот вопрос был задан / получен ответ: кажется, теперь есть способ сделать это явно. Это описано здесь:
https://git.wiki.kernel.org/index.php/Git_FAQ
Как разделить объекты между существующими репозиториями? Делать
echo "/source/git/project/.git/objects/" > .git/objects/info/alternates
а затем проследить
git repack -a -d -l
где
-l
означает, что он будет помещать только "локальные" объекты в пакетный файл (строго говоря, он также будет помещать любые свободные объекты из альтернативного дерева, поэтому у вас будет полностью упакованный архив, но он не будет дублировать объекты которые уже упакованы в альтернативное дерево).