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

Mic*_*hue 115 git garbage-collection rebase git-gui git-gc

当我运行'git gui'时,我会得到一个弹出窗口

This repository currently has approximately 1500 loose objects.

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

我们当前的工作流程需要大量使用'rebase',因为我们正在从Perforce过渡,而Perforce仍然是规范的SCM.一旦Git是规范的SCM,我们将定期进行合并,并且应该大大减轻松散的对象问题.

与此同时,我真的想让这个"有用"的弹出窗口消失.

Esk*_*ola 156

由于没有人有答案,我查看了代码,看看如何删除显示该对话框的代码.我找到了hint_gc做它的程序和它被调用的地方.与此同时,我注意到2011年末添加了一个用于禁用对话框的配置选项.这个变化(git-gui 0.16.0的一部分)在2011-12-14被合并到Git的主线上.

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

git config --global gui.gcwarning false
Run Code Online (Sandbox Code Playgroud)

如果您使用的是旧版本,则可以编辑/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)

  • 我们可以在1000 hint_gc之后增加`所以警告发生在`10000`松散的物体之后? (3认同)
  • @sashoalm:也许这就是你的意思,但是"1000之后"的"1000"是指在显示对话框之前要等待的毫秒数.通过将其增加到"10000",对话框仍然会出现,但它需要10秒才能完成. (2认同)
  • 解决问题比禁用警告更好。关闭“Git GUI”,打开“Git Bash”并运行命令“git gc --aggressive”。现在重新打开 `Git GUI`。 (2认同)
  • @AlainD git 已经在它认为有必要时时不时地自行进行垃圾收集,作为其他 git 命令的一部分。所以我认为 git gui 的警告和用户手动运行 `git gc` 是(通常)不必要的,并且不必要地对 git gui 固执己见。 (2认同)

Von*_*onC 48

更新: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"会有帮助吗?

(可能在gc.pruneexpire配置变量中使用"now",以便发生上述行为).


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

repack -a -d -l
Run Code Online (Sandbox Code Playgroud)

注意小写的'a'.

git-gc使用大写的"A"调用repack,这是导致无法访问的对象被解压缩的原因.小'​​a',适用于那些知道自己在做什么的人,并希望git只是删除无法访问的对象.


Nic*_*kis 30

当"松散对象"弹出窗口时,我知道是时候运行git的垃圾收集器了:

git gc
Run Code Online (Sandbox Code Playgroud)

之后弹出窗口消失了.

更新:(由于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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我知道这很奇怪但是从gui清洁基地有时会留下松散的物体.我关闭gui,运行git-gc,然后所有垃圾都消失了. (3认同)
  • 更改tcl修复它 - 我刚刚将窗口限制为10*250.谢谢! (3认同)