我已经在几个地方读过,可以objects
在多个git存储库之间共享目录,例如使用符号链接.我想这样做在同一目录中的几个裸存储库之间共享对象数据库:
shared-objects-database/
foo.git/
objects -> ../shared-objects-database
bar.git/
objects -> ../shared-objects-database
baz.git/
objects -> ../shared-objects-database
Run Code Online (Sandbox Code Playgroud)
(我这样做是因为在每个对象目录中会有大量冗余存储的大blob.)
我对此的关注是,在使用这些存储库时,git gc
将自动调用并导致从一个存储库无法访问的对象被修剪,从而使其他存储库不完整.有没有简单的方法可以确保不会发生这种情况?例如,是否存在一个强制--no-prune
为默认值的配置选项git gc
,如果是这样,是否足以使用此设置而不会有丢失数据的风险?
目前,我一直在使用这种objects/info/alternates
机制在这些存储库之间共享对象,但是将这些指针从每个存储库维护到所有其他存储库都有点笨拙.
(我的另一种方法是只具有单一的裸库,与各分支机构foo.git
,bar.git
并baz.git
命名为foo-master
,foo-testing
,bar-master
,等.然而,这会是一个有点更多的工作来管理,因此,如果符号链接的对象目录可以安全地工作,我宁愿那样做.)
您可能会猜到这是使用Git For It It It Not It用例的其中一个,但我希望这个问题清晰有效;)
Chr*_*man 10
在问到/回答这个问题之后,也许这被添加到git中:现在似乎有一种方法可以明确地做到这一点.它在这里描述:
https://git.wiki.kernel.org/index.php/Git_FAQ#How_to_share_objects_between_existing_repositories.3F
如何在现有存储库之间共享对象?做
Run Code Online (Sandbox Code Playgroud)echo "/source/git/project/.git/objects/" > .git/objects/info/alternates
然后跟进
Run Code Online (Sandbox Code Playgroud)git repack -a -d -l
这
-l
意味着它只会在包文件中放入"本地"对象(严格来说,它也会从备用树中放置任何松散的对象,所以你将拥有一个完全打包的存档,但它不会已经在备用树中打包的重复对象).
为什么不把gc.pruneExpire
变量调到最近never
?您不可能拥有1000年前不想删除的松散物体.
为了确保真正应该修剪的东西得到修剪,你可以保留一个包含所有其他作为遥控器的回购.git gc
因为它确实知道什么是无法到达的,所以在那个方面会非常安全.
编辑:好的,我对时间限制有点骑士; 正如评论中指出的那样,1000年不会太好用,但是这个时代的开始会,或者never
.