10

我正在使用 Git 对一系列二进制文件进行版本控制。它们压缩得很好,但是当我推送它们时,我的中央存储库似乎没有压缩。他们吃掉了我相当数量的配额,所以我想看看是否有办法强制远程仓库进行 GC。

这可能吗?我正在开发Project Locker,所以我不相信我可以通过 SSH 访问并自己 GC 存储库。有任何想法吗?谢谢。

4

3 回答 3

8

如果你不能自己运行git gc,你将不得不欺骗它自动运行。那时您将无法完全控制它,但您至少应该能够让它运行。

git gc --auto由多个命令运行;这里相关的是receive-pack,它在遥控器上运行以接收包作为推送的一部分。gc --auto只有当有足够的松散物体时才会重新包装;截止由配置参数确定gc.auto,默认为 6700。

如果您有权访问远程的 gitconfig,则可以将该截止值临时设置为 1。在 repo 中应该肯定至少有 1 个松散的对象,所以gc --auto下次推送时应该会执行它的操作。

如果您无权访问远程的 gitconfig,我所能想到的就是人为地创建一堆松散的对象。你可以通过创建一个分支,向它提交一堆小文件(具有不同的内容),将分支推送到远程,然后从远程删除分支来做到这一点。(重要的是改变内容,否则他们只会使用相同的斑点。)冲洗并重复。

于 2010-11-18T07:11:25.080 回答
2

这确实是他们最终需要解决的问题。他们可以通过 post-receive 钩子或 cron 作业或类似的东西来做到这一点,但是如果他们应该维护您的存储库,那么出于多种原因,这就是其中的一部分。

于 2010-11-18T07:11:50.393 回答
1

表单git-gc 手册页

一些 git 命令可能会自动运行 git gc;有关详细信息,请参阅下面的 --auto 标志。

并进一步:

- 汽车

使用此选项, git gc 会检查是否需要进行任何内务处理;如果没有,它会退出而不执行任何工作。一些 git 命令在执行可能创建许多松散对象的操作后运行 git gc --auto。

如果存储库中有太多松散的对象或太多的包,则需要进行内务管理。如果松散对象的数量超过 gc.auto 配置变量的值,则使用 git repack -d -l 将所有松散对象组合成一个包。将 gc.auto 的值设置为 0 将禁用松散对象的自动打包。

如果包的数量超过了 gc.autopacklimit 的值,那么现有的包(标有 .keep 文件的包除外)通过使用 git repack 的 -A 选项合并为一个包。将 gc.autopacklimit 设置为 0 将禁用包的自动合并。

最后:

git gc --auto 命令将运行pre-auto-gc钩子。有关更多信息,请参阅 githooks(5)。

于 2010-11-18T07:09:43.623 回答