ChatGPT解决这个技术问题 Extra ChatGPT

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

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

This repository currently has approximately 1500 loose objects.

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

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

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

该对话框是许多人希望它不存在的“功能”的一个很好的例子。它不仅令人讨厌,它还可以删除在硬重置后变得分离的重要提交。

s
sashoalm

由于没有人得到答案,我查看了代码以了解如何删除显示该对话框的代码。我找到了执行此操作的 hint_gc 过程以及调用它的位置。同时我注意到在 2011 年末添加了 a configuration option for disabling the dialog。此更改(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


我们可以增加 after 1000 hint_gc 以便在 10000 个松散对象之后发生警告吗?
@sashoalm 我同意。它在那里是有原因的。
@sashoalm:也许这就是您的意思,但是 after 1000 的“1000”是指等待显示对话框的毫秒数。通过将其增加到“10000”,对话框仍然会出现,但它需要 10 秒才能这样做。
但是,正如@NickDandoulakis 的回答中提到的,database.tcl 包含限制的定义,并且可以增加以降低对话频率。
@AlainD git 已经不时地自己进行垃圾收集,作为其他 git 命令的一部分,当它认为有必要时。所以我认为 git gui 的警告和手动运行 git gc 的用户(通常)是不必要的,并且不必要地固执己见 git gui。
C
Community

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

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

原答案:

git gc”没有删除所有个松散对象的问题之前已经报告过(2008 年末,“"git gc" doesn't seem to remove loose objects any more

git gc 仅删除超过两周的松散对象,如果您现在真的想删除它们,请运行 git prune。但是请确保在您运行它时没有其他 git 进程处于活动状态,否则它可能会踩到某些东西。 “git gc”将解压已经无法访问且当前在包中的对象。结果,在“git gc”操作之后,git 存储库使用的磁盘空间量实际上会急剧增加,这对于在文件系统上运行接近满的人来说可能是令人惊讶的,从跟踪存储库,然后执行“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”会有所帮助吗?

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

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

repack -a -d -l

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


'git prune' 可能会解决我眼前的问题 - 我会在今天晚些时候尝试。但是,我确实喜欢将松散的物体保留两周的安全方面,如果我想回去看看一些旧的修订版,所以我不太喜欢这个解决方案。我对 git 的大小或性能没有任何问题,只是 'git gui' 坚持要求我压缩数据库,即使压缩数据库也没有效果。
很有帮助的评论。那个烦人的“松散对象”消息变得非常烦人。无论如何,这个计数是从哪里来的?也许是 git-fsck 的输出?
谢谢 - 我也有 git gc 没有删除的松散物体 - git prune 是答案。
我在任何存储库之外做了一个 git prune 并清除了一些对象。然后我进入问题存储库并做了一个 git prune 并且所有问题都消失了。
“git prune”解决了 OP(和我)遇到的问题:“我以前做过这个,它将松散的对象减少到大约 250 个,但这不会抑制弹出窗口。”
N
Nick Dandoulakis

当“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
        }
    }
}

在对话框中单击“确定”不是这样做的吗?如果 gc 没有摆脱所有松散的对象,他仍然会得到对话框。
我点击了“确定”并从命令行运行了“git gc”——它们都让我降到了 250,但再次这样做并没有进一步的进展。
我知道这很奇怪,但是从 gui 上清理底座有时会留下松散的物体。我关闭 gui,运行 git-gc,然后所有垃圾都消失了。
更改 tcl 修复它 - 我刚刚将 windows 限制提高到 10 * 250。谢谢!
对我来说,从命令行运行 git gc 解决了问题......只是在 git gui 中单击 ok 并没有解决问题......
T
T.E.D.

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

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


V
Valmond

添加到答案和解释:

如果您想继续监视松散的对象,但不希望弹出窗口完全消失(对于较大的项目,它一直弹出),您可以修改可能位于此文件夹中的 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

例如。