如何在git中安全地使用共享对象数据库?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

我在几个地方读到过可以分享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.gitbar.gitbaz.git命名foo-masterfoo-testingbar-master等。但是,这需要管理的工作要多一点,所以如果符号链接对象目录能够安全地工作,我宁愿这样做。)

你可能会猜到,这是那些使用Git的人之一,但我希望这个问题是明确和有效的)

提问于
用户回答回答于

为什么不把gc.pruneExpire变量最多可达never是吗?这是不可能的,你永远不会有松散的对象1000岁,你不想删除。

为了确保真正应该修剪的东西确实被修剪了,可以保留一个回购,其中所有的其他作为遥控器。git gc因为它确实知道什么是不可及的。

用户回答回答于

也许在这个问题被问到/回答之后,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/交替 然后跟进 git repack-a-d-l 在那里-l这意味着它只会将‘本地’对象放在包文件中(严格地说,它也会从备用树中放置任何松散的对象,因此你将有一个完全打包的存档,但它不会复制已经打包在备用树中的对象)。

扫码关注云+社区