有没有一种方法可以硬链接包含多个Git存储库的文件夹中的所有重复对象?
说明:
我在公司服务器(Linux计算机)上托管了一个Git服务器。这个想法是拥有一个主规范存储库,每个用户都没有推送访问权限,但是每个用户都派生规范存储库(将规范存储库克隆到用户的主目录,从而实际上创建硬链接)。
/ canonical / Repo / Dev1 / Repo(最初克隆时硬链接到/ canonical / Repo的对象)/ Dev2 / Repo(最初克隆时硬链接到/ canonical / Repo的对象)
这一切都很好。在以下情况下会出现问题:
Dev1:在服务器(/ Dev1 / Repo)上将大量提交推送到他的fork上Dev2:在他的本地系统上获取该提交,进行自己的更改并将其推送到他在服务器(/ Dev2 / Repo)上自己的fork
(现在,相同的“巨大”文件位于服务器上开发人员的两个分支中。它不会自动创建硬链接。)
这真是疯狂地吞噬了我的服务器空间!
我该如何在两个分支之间重复的对象之间创建硬链接,或者在该问题上是规范的,以便节省服务器空间,并且每个开发人员从其本地计算机上的他/她的分支中克隆时都将获取所有数据?
我决定这样做:
shared-objects-database.git/ foo.git/ objects/info/alternate (will have ../../shared-objects-database.git/objects) bar.git/ objects/info/alternate (will have ../../shared-objects-database.git/objects) baz.git/ objects/info/alternate (will have ../../shared-objects-database.git/objects)
所有分叉在其object / info / alternates文件中都有一个条目,该条目提供了到对象数据库存储库的相对路径。
使对象数据库成为存储库非常重要,因为我们可以保存具有相同名称的存储库的不同用户的对象和引用。
脚步:
git init --bare shared-object-database.git
for r in list-of-forks do
(cd“ $ r” && git push ../shared-objects-database.git“ refs / :refs / remotes / $ r / ” && echo ../../shared-objects-database.git / objects>对象/ info / alternates#要保存的代码每次完成时,我都将“ fat”对象添加到备用对象中
然后,在下一个“ git gc”中,将替代已存在的fork中的所有对象。
git repack -adl 也是一个选择!
git repack -adl
这样,我们可以节省空间,以便两个用户在服务器上各自的分支上推送相同的数据将共享对象。
我们需要在共享对象数据库中将gc.pruneExpire变量设置为never。为了安全起见!
gc.pruneExpire
never
要偶尔修剪对象,请将所有派生作为远程对象添加到共享,提取和修剪中!Git会做剩下的!