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

标签 git

我在几个地方读到可以在多个 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.gitbar.gitbaz.git 的所有分支 命名为 foo-masterfoo-testingbar-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/

相关文章:

git - 我在 GitHub 上编辑了自述文件,现在如何压缩编辑内容

git - 如何判断哪个 git 分支被 checkout ?

git filter-branch --msg-filter 重写推送的提交消息

Git制作和master不一样

linux - Gitlab CE 不向authorized_keys 添加公钥

python - Unicode解码错误: 'utf8' codec can't decode byte 0xf6 in position 178175077: invalid start byte

java - Git:查找仅更改了serialVersionUID的文件

git - 如果我在一个分支上标记 HEAD 并删除该分支,我可以从该标记重新创建该分支吗?

git - 只为一个子目录创建一个分支

git rebase --继续,但在冲突解决期间修改提交消息以记录更改?