我在几个地方读到可以在多个 git 存储库之间共享 objects
目录,例如带有符号链接(symbolic link)。我想这样做是为了在同一目录中的几个裸存储库之间共享对象数据库:
shared-objects-database/
foo.git/
objects -> ../shared-objects-database
bar.git/
objects -> ../shared-objects-database
baz.git/
objects -> ../shared-objects-database
(我这样做是因为否则每个对象目录中都会冗余存储大量大 blob。)
我担心的是,当使用这些存储库时,git gc
将被自动调用,并导致从一个存储库无法访问的对象被修剪,从而使其他存储库不完整。有什么简单的方法可以确保不会发生这种情况吗?例如,是否有一个配置选项会强制 --no-prune
成为 git gc
的默认值,如果是这样,是否足以使用它在不冒丢失数据风险的情况下进行设置?
目前,我一直在使用 objects/info/alternates
机制在这些存储库之间共享对象,但是维护从每个存储库到所有其他存储库的这些指针有点老套。
(我的另一个选择是只拥有一个裸存储库,包含 foo.git
、bar.git
和 baz.git 的所有分支
命名为 foo-master
、foo-testing
、bar-master
等。但是,这会多一些工作管理,所以如果符号链接(symbolic link)对象目录可以安全地工作,我宁愿这样做。)
您可能会猜到这是将 Git 用于非预期用途的用例之一,但我希望这个问题仍然清晰有效;)
最佳答案
也许这是在询问/回答这个问题后添加到 git 中的:现在似乎有一种方法可以明确地做到这一点。在这里描述:
https://git.wiki.kernel.org/index.php/Git_FAQ#How_to_share_objects_between_existing_repositories.3F
How to share objects between existing repositories? Do
echo "/source/git/project/.git/objects/" > .git/objects/info/alternates
and then follow it up with
git repack -a -d -l
where the
-l
means that it will only put ''local'' objects in the pack-file (strictly speaking, it will put any loose objects from the alternate tree too, so you'll have a fully packed archive, but it won't duplicate objects that are already packed in the alternate tree).
关于git - 如何在 git 中安全地使用共享对象数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2350996/