Подтвердить что ты не робот

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

Вы можете догадаться, что это один из тех, кто использует git Для чего это не предназначено для использования, но я надеюсь, что вопрос ясен и действителен, тем не менее;)

4b9b3361

Ответ 1

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

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

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

Ответ 2

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