如何在运行 "git gui" 时跳过“松散对象”弹出窗口?

146

当我运行'git gui'时,弹出一个窗口显示:

此存储库当前具有约1500个松散对象。

它随后建议压缩数据库。我以前做过这件事,并将松散对象减少到大约250个,但这并不能消除弹出窗口。再次压缩不会改变松散对象的数量。

我们目前的工作流程需要大量使用'rebase',因为我们正在从Perforce进行转换,而Perforce仍然是规范的源代码管理工具。一旦Git成为规范的源代码管理工具,我们将执行常规合并操作,而松散对象问题应该得到很大缓解。

在此期间,我真的很想让这个“有用”的弹出窗口消失。


4
那个对话框是许多人希望不存在的“功能”的一个很好的例子。它不仅令人烦恼,还会删除在强制重置后变得分离的重要提交记录。 - adelriosantiago
5个回答

202

由于没有人给出答案,我查看了代码以确定如何删除显示该对话框的代码。我找到了 hint_gc 过程及其被调用的位置。与此同时,我注意到在2011年底添加了一个用于禁用对话框的配置选项。这个变化(git-gui 0.16.0 的一部分)已经合并到 Git 主线上,日期为 2011-12-14

因此,如果您使用 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

4
我们能否将 after 1000 hint_gc 值增加,以便在出现 10000 松散对象后再发出警告? - sashoalm
4
也许这就是你的意思,但 after 1000 中的“1000”是指等待对话框出现的毫秒数。将其增加到“10000”,对话框仍将出现,但需要10秒钟才会出现。 - fuglede
1
然而,如@NickDandoulakis的答案中所提到的,database.tcl包含了限制的定义,并且可以增加以使对话框出现的频率较少。 - fuglede
1
不要禁用警告,而是更好地处理问题。关闭 Git GUI,打开 Git Bash 并运行命令 git gc --aggressive。现在重新打开 Git GUI - AlainD
1
@AlainD git已经会定期进行垃圾回收,作为其他git命令的一部分,在它认为必要时进行。因此,我认为git gui的警告和用户手动运行git gc通常是不必要的,并且对于git gui来说是不必要的主观看法。 - tjalling
显示剩余2条评论

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

我确实喜欢保留松散的对象两周的安全性方面,以防我想要回去查看一些旧版本,所以我不太喜欢这个解决方案。我的git大小和性能都没有问题,只是“git gui”坚持要求我压缩数据库,即使压缩数据库也没有效果。


原始答案: < p >之前有报道过“ git gc ”无法删除所有松散对象的问题(2008年底,“" git gc "似乎不再删除松散的对象”)。

git gc 只会删除两周以前的松散对象,如果你现在要删除他们,请运行 git prune。
但请确保没有其他正在运行的 git 进程,否则它可能会影响其他操作。

"git gc" 将 展开 已成为不可访问并且目前在包中的对象。
因此,在 "git gc" 操作之后,存储库使用的磁盘空间实际上可能会显著增加,这对于那些在文件系统空间不足的情况下删除了跟踪存储库中的一些分支然后执行 "git gc" 的人来说可能会感到惊讶。

[示例:]旧分支通过标记(例如 next-20081204)进行保留。
如果您每天更新本地副本的 linux-next 存储库,您将积累大量这些旧分支标记。
如果您随后删除了整个系列,并运行 git-gc,该操作将需要相当长的时间,并且使用的块和inode数量将显著增加。

它们将在 "git prune" 之后消失,但在进行此清理操作时,我经常希望 "git gc" 有一个 --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 prune" 是否有帮助?

(可能需要使用 gc.pruneexpire 配置变量中的 "now" 来实现上述行为)。


您还有(来自同一线程):

repack -a -d -l

注意小写的 'a'。 git-gc 会以大写的 'A' 调用 repack,这是导致不可访问对象被解压缩的原因。小写的 'a' 是给知道自己在做什么并且希望 git 只删除不可访问对象的人使用的。

1
“git prune” 可能会解决我目前的问题 - 我今天稍后会尝试。然而,我喜欢保留松散对象两周的安全性方面,以便我想回顾一些旧版本时使用,所以我不太喜欢这个解决方案。我没有遇到 git 的大小或性能方面的任何问题,只是 “git gui” 坚持要求我压缩数据库,即使压缩数据库也没有任何效果。 - Michael Donohue
非常有用的评论。那个烦人的“松散对象”消息真的很烦人。那个计数是从哪里来的呢?也许是git-fsck的输出? - David Dombrowsky
谢谢 - 我也有一些松散的对象,git gc 没有删除它们 - git prune 是答案。 - shedd
我在任何存储库之外执行了git prune并清除了一些对象。然后我进入有问题的存储库并执行了git prune,所有问题都消失了。 - Nicholas Orlowski
"git prune" 解决了 OP(和我)遇到的问题:“我以前做过这个,它可以将松散的对象减少到大约250个,但这并不能抑制弹出窗口。” - Eike
显示剩余3条评论

38

当出现“松散对象”弹窗时,我知道是时候运行git的垃圾回收器了:

git gc

随后弹出窗口消失。

更新: (因为T.E.D.的建议)

我从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
        }
    }
}

1
点击对话框中的“确定”按钮不就是这样吗?如果垃圾回收器没有清除所有的松散对象,他仍然会得到该对话框。 - T.E.D.
我已经点击了“确定”并从命令行运行了“git gc” - 它们都将我的大小降低到250,但再次执行没有进一步的进展。 - Michael Donohue
3
我知道这很奇怪,但有时从图形界面清理基础环境会留下松散的物体。我关闭 GUI,运行 git-gc,然后所有垃圾都会被清除。 - Nick Dandoulakis
3
改变tcl代码可以解决这个问题——我把Windows限制提高到10*250了。谢谢! - Michael Donohue
1
对我来说,从命令行运行 git gc 解决了问题……只是在 git gui 中点击“确定”似乎没有起作用…… - raphael

3

嗯......我在文档中没有看到针对这方面的命令行参数。

我想你可以下载源代码,删除对话框的代码并重新构建它。


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

例如。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接