138

当我运行'git gui'时,我会弹出一个说

该存储库当前大约有 1500 个松散对象。

然后它建议压缩数据库。我以前做过这个,它将松散的对象减少到大约 250 个,但这并没有抑制弹出窗口。再次压缩不会改变松散对象的数量。

当我们从 Perforce 过渡时,我们当前的工作流程需要大量使用“rebase”,而 Perforce 仍然是规范的 SCM。一旦 Git 成为规范的 SCM,我们将进行定期合并,并且应该大大缓解松散对象问题。

同时,我真的很想让这个“有用的”弹出窗口消失。

4

5 回答 5

190

由于没有人得到答案,我查看了代码以了解如何删除显示该对话框的代码。我找到了执行此操作的hint_gc程序以及调用它的位置。与此同时,我注意到 2011 年末添加了一个用于禁用对话框的配置选项。此更改(git-gui 0.16.0 的一部分)于2011-12-14合并到 Git 的主线。

因此,如果您使用 Git v1.7.9 或更新版本,您可以使用以下命令禁用警告对话框:

git config --global gui.gcwarning false

如果您使用的是旧版本,则可以编辑/lib/git-core/git-gui和删除该after 1000 hint_gc行,或者编辑/usr/share/git-gui/lib/database.tcl和删除过程的主体hint_gc。(这些文件路径位于 Cygwin 上 - 在其他环境中,文件可能位于不同的位置。对于 Windows,它是c:\Program Files\Git\mingw64\libexec\git-core\git-gui.tcl

于 2012-04-12T20:51:19.600 回答
53

更新:git prune将“解决”该问题,因为它将删除那些松散的对象
git gc调用git prune,但默认情况下仅适用于两周以上的松散对象)。
然而,正如OP Michael Donohue在评论中提到的那样:

我确实喜欢将松散的物体放置两周的安全方面,如果我想回去查看一些旧的修订版,所以我不太喜欢这个解决方案。
我对 git 的大小或性能没有任何问题,只是 'git gui' 坚持要求我压缩数据库,即使压缩数据库没有效果。


原答案:

git gc” 没有移除所有松散物体的问题之前已经报告过(2008年末,“ git gc“似乎不再移除松散物体

git gc只移除超过两周的松散物体,如果你现在真的想移除它们,运行 git prune。
但是请确保在您运行它时没有其他 git 进程处于活动状态,否则它可能会踩到某些东西。

" git gc" 将解包已变得无法访问且当前在包中的对象。
因此,git 存储库使用的磁盘空间量实际上会在“”操作急剧增加git gc,这对于在文件系统上运行接近满的人来说可能是令人惊讶的,从跟踪存储库中删除了许多分支,然后再做一个“ git gc”可能会得到一个非常不愉快的惊喜。

[示例:]旧分支通过诸如next-20081204.
如果你每天更新你的本地仓库副本linux-next,你会积累大量这些旧的分支标签。
如果你然后删除一整串,然后运行git-gc,操作将需要相当长的时间,并且使用的块和 inode 的数量会显着增加。

它们会在“”之后消失git prune,但是当我做这个家务操作时,我经常希望有一个--yes-I-know-what-I-am-doing-and-it's-unsafe-but-just-drop-the-unreachable-objects-cause-this-is-just-a-tracking-repository“git gc”的选项。

所以在你的情况下,“ git prune”会有帮助吗?

(可能在配置变量中使用“now”,这gc.pruneexpire是发生上述行为所必需的)。


你也有(来自同一个线程):

repack -a -d -l

注意小写的“a”。

git-gc用大写的“A”调用重新打包,这就是导致无法访问的对象被解包的原因。Little 'a' 是为那些知道自己在做什么并希望 git 丢弃无法访问的对象的人准备的。

于 2009-07-10T06:58:45.617 回答
36

当“Loose Object”弹出窗口时,我知道是时候运行 git 的垃圾收集器了:

git gc

之后弹出窗口消失。

更新:(由于 TED 的建议)

我从中提取了以下例程,git/share/git-gui/lib/database.tcl
您可以对其进行修改以满足您的需要。

proc hint_gc {} {
    set object_limit 8
    if {[is_Windows]} {
        set object_limit 1
    }

    set objects_current [llength [glob \
        -directory [gitdir objects 42] \
        -nocomplain \
        -tails \
        -- \
        *]]

    if {$objects_current >= $object_limit} {
        set objects_current [expr {$objects_current * 256}]
        set object_limit    [expr {$object_limit    * 256}]
        if {[ask_popup \
            [mc "This repository currently has approximately %i loose objects.

To maintain optimal performance it is strongly recommended that you compress the database when more than %i loose objects exist.

Compress the database now?" $objects_current $object_limit]] eq yes} {
            do_gc
        }
    }
}
于 2009-07-09T21:58:31.920 回答
3

嗯....我在docs中没有看到命令行参数。

我想你总是可以拉下它的源代码,取出对话框的代码,然后重新构建。

于 2009-07-09T21:59:48.953 回答
0

添加到答案和解释:

如果您想继续监视松散的对象,但不希望弹出窗口完全消失(对于较大的项目,它一直弹出),您可以修改可能位于此文件夹中的 database.tcl:

C:\Program Files\Git\mingw64\share\git-gui\lib\

在函数 proc hint_gc {}

proc hint_gc {} {

set ndirs 1
set limit 8
if {[is_Windows]} {
    set ndirs 8
    set limit 1
}

您可以更改

set ndirs 8

set ndirs 32

例如。

于 2021-11-18T09:42:26.770 回答