代码之家  ›  专栏  ›  技术社区  ›  Mark Longair

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

git
  •  22
  • Mark Longair  · 技术社区  · 15 年前

    我在几个地方读到有可能分享 objects 多个Git存储库之间的目录,例如带有符号链接的目录。我想这样做是为了在同一目录中的几个裸存储库之间共享对象数据库:

    shared-objects-database/
    foo.git/
      objects -> ../shared-objects-database
    bar.git/
      objects -> ../shared-objects-database
    baz.git/
      objects -> ../shared-objects-database
    

    (我这么做是因为每个objects目录中都会有大量的大blob冗余存储,否则就没有了。)

    我担心的是当使用这些存储库时, git gc 将自动调用,并导致无法从一个存储库访问的对象被修剪,从而使其他存储库不完整。有什么简单的方法可以确保这不会发生吗?例如,是否有一个配置选项将强制 --no-prune 默认为 气相色谱-气相色谱法 ,如果是,那么这是否足以在不丢失数据的情况下使用此设置?

    目前,我正在使用 objects/info/alternates 在这些存储库之间共享对象的机制,但是维护从每个存储库到所有其他存储库的指针有点麻烦。

    (我的另一个选择是只有一个裸存储库,其中包含 foo.git , bar.git baz.git 命名 foo-master , foo-testing , bar-master ,等等。但是,这需要管理更多的工作,因此如果symlinked objects目录可以安全地工作,我宁愿这样做。)

    您可能会猜到这是其中一个使用git的人,但我希望这个问题仍然是明确和有效的;)

    2 回复  |  直到 8 年前
        1
  •  9
  •   Cascabel    15 年前

    为什么不把 gc.pruneExpire 变量高达 never ?你不太可能有1000年前不想删除的松散对象。

    为了确保真正应该修剪的东西得到修剪,您可以保留一个repo,其中所有其他的都作为远程。 git gc 在那个里面会很安全,因为它知道什么是不可能达到的。

    编辑:好吧,我对时间的限制有点漫不经心;正如评论中所指出的,1000年不会有太好的效果,但是新纪元的开始会,或者 从未

        2
  •  7
  •   Tobias Kienzler    8 年前

    也许这是在问/答完这个问题之后添加到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 意味着它将只在 打包文件(严格地说,它会从 另外还有一棵树,所以你会有一个完整的归档文件,但是 不会复制已打包在备用项中的对象 树)