Как можно безопасно использовать базу данных общих объектов в git? - PullRequest
23 голосов
/ 28 февраля 2010

В нескольких местах я прочитал, что каталог 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 ]

9 голосов
/ 03 ноября 2014

Возможно, это было добавлено в git после того, как на этот вопрос был задан / дан ответ: похоже, теперь есть способ сделать это явно Это описано здесь:

https://git.wiki.kernel.org/index.php/Git_FAQ#How_to_share_objects_between_existing_repositories.3F

Как поделиться объектами между существующими репозиториями? У

echo "/source/git/project/.git/objects/" > .git/objects/info/alternates

, а затем добавьте

git repack -a -d -l

, где -l означает, что он помещает только '' локальные '' объекты в pack-file (строго говоря, он будет помещать любые свободные объекты из альтернативное дерево тоже, так что вы будете иметь полностью упакованный архив, но это не будет дублировать объекты, которые уже упакованы в запасной дерево).

9 голосов
/ 04 марта 2010

Почему бы просто не провернуть переменную gc.pruneExpire до never? Маловероятно, что у вас когда-нибудь будут свободные объекты 1000 лет, которые вы не хотите удалять.

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

Редактировать: Хорошо, я был немного кавалерным по поводу ограничения времени; как отмечено в комментариях, 1000 лет не будут работать слишком хорошо, но начало эпохи будет, или never.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...