一尘不染

在服务器上对Git分支进行重复数据删除

linux

有没有一种方法可以硬链接包含多个Git存储库的文件夹中的所有重复对象?

说明:

我在公司服务器(Linux计算机)上托管了一个Git服务器。这个想法是拥有一个主规范存储库,每个用户都没有推送访问权限,但是每个用户都派生规范存储库(将规范存储库克隆到用户的主目录,从而实际上创建硬链接)。

/ canonical / Repo / Dev1 / Repo(最初克隆时硬链接到/ canonical / Repo的对象)/ Dev2 /
Repo(最初克隆时硬链接到/ canonical / Repo的对象)

这一切都很好。在以下情况下会出现问题:

Dev1:在服务器(/ Dev1 /
Repo)上将大量提交推送到他的fork上Dev2:在他的本地系统上获取该提交,进行自己的更改并将其推送到他在服务器(/ Dev2 /
Repo)上自己的fork

(现在,相同的“巨大”文件位于服务器上开发人员的两个分支中。它不会自动创建硬链接。)

这真是疯狂地吞噬了我的服务器空间!

我该如何在两个分支之间重复的对象之间创建硬链接,或者在该问题上是规范的,以便节省服务器空间,并且每个开发人员从其本地计算机上的他/她的分支中克隆时都将获取所有数据?


阅读 308

收藏
2020-06-07

共1个答案

一尘不染

我决定这样做:

 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文件中都有一个条目,该条目提供了到对象数据库存储库的相对路径。

使对象数据库成为存储库非常重要,因为我们可以保存具有相同名称的存储库的不同用户的对象和引用。

脚步:

  1. git init --bare shared-object-database.git
  2. 每当有任何推送(通过后接收)或运行cronjob时,我都会运行以下代码行
    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 也是一个选择!

这样,我们可以节省空间,以便两个用户在服务器上各自的分支上推送相同的数据将共享对象。

我们需要在共享对象数据库中将gc.pruneExpire变量设置为never。为了安全起见!

要偶尔修剪对象,请将所有派生作为远程对象添加到共享,提取和修剪中!Git会做剩下的!

2020-06-07