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


123

当我运行'git gui'时,我会弹出一个对话框

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

然后建议压缩数据库。我之前已经做过,它可以将松散的对象减少到250个左右,但这并不能抑制弹出窗口。再次压缩不会更改松散对象的数量。

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

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


1
该对话框是许多人希望它不存在的“功能”的一个很好的例子。它不仅令人烦恼,而且可以擦除在硬重置后变得分离的重要提交。
adelriosantiago

Answers:


169

由于尚无人提供答案,因此我查看了代码,以了解如何删除显示该对话框的代码。我找到了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


3
我们可以增加,after 1000 hint_gc以便在10000松动的物体之后发出警告吗?
sashoalm

@sashoalm我同意。它在那里是有原因的。
HankCa

不知道到底是什么好原因,这种对话是如此痛苦,而没有清楚地解释好理由,我当然很想打扰上面的命令。
乔什·麦克

2
@sashoalm:也许这就是您的意思,但是“ 1000”表示after 1000等待显示对话框之前要等待的毫秒数。通过将其增加到“ 10000”,对话框仍然会出现,但是要花10秒钟。
fuglede

1
但是,如@NickDandoulakis的答案database.tcl中所述,包含限制的定义,可以增加限制以减少对话的频率。
fuglede

50

更新: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,则该操作将花费一段时间,并且所使用的块和索引节点的数量将显着增加。

它们将在“ 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需要在config变量中使用“ now” ,才能实现上述行为)。


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

repack -a -d -l

注意小写字母“ a”。

git-gc调用以大写字母“ A”重新打包,这是导致无法访问的对象被拆包的原因。小“ a”是给知道自己在做什么并且希望git丢弃不可达对象的人的。


1
'git prune'可能会解决我眼前的问题-我将在今天晚些时候尝试。但是,我确实喜欢将松散的物体保持两周的安全性,如果我想回过头来看看一些旧的修订版,那么我真的不喜欢这种解决方案。我对git的大小或性能没有任何问题,只是'git gui'坚持要求我压缩数据库,即使压缩数据库没有任何效果。
Michael Donohue,2009年

非常有帮助的评论。那个令人讨厌的“松散对象”消息变得非常令人讨厌。无论如何,这算什么呢?git-fsck的输出,也许?
David Dombrowsky,2009年

谢谢-我还有git gc不能删除的松散物体-git prune是答案。
shedd 2012年

我在任何存储库之外进行了git prune操作,它清除了一些对象。然后我进入问题库,进行了git prune,所有问题都消失了。
Nicholas Orlowski

“ git prune”解决了OP(和我)曾经遇到的问题:“我以前已经这样做过,它可以将松散的对象减少到250个左右,但这并不能抑制弹出窗口。”
Eike

32

当弹出“松散对象”时,我知道该运行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
        }
    }
}

1
不能在对话框中单击“确定”吗?如果gc没有清除所有松散的对象,他仍然会显示对话框。
TED

我单击了“确定”,然后从命令行运行了“ git gc”,它们都使我的速度降到了250,但是再做一次则没有任何进一步的进展。
Michael Donohue 2009年

3
我知道这很奇怪,但是从gui清洁底座有时会留下松散的物体。我关闭gui,运行git-gc,然后所有垃圾都消失了。
尼克·丹杜拉基斯

3
更改tcl可以解决问题-我只是将Windows限制提高到10 *250。谢谢!
Michael Donohue

对我来说git gc,从命令行运行可以解决问题...只是ok在git gui中单击却无法解决问题...
raphael

3

嗯。。。我在文档中没有看到命令行参数。

我想您总是可以删除其源代码,取出对话框的代码,然后重新构建。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.