Как можно безопасно использовать базу данных общих объектов в 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 означает, что он будет помещать только "локальные" объекты в пакетный файл (строго говоря, он также будет помещать любые свободные объекты из альтернативного дерева, поэтому у вас будет полностью упакованный архив, но он не будет дублировать объекты которые уже упакованы в альтернативное дерево).

Другие вопросы по тегам