如何在运行 git gui 时跳过“ Loose Object”弹出窗口

当我运行“ git gui”时,我会看到一个弹出窗口说

This repository currently has approximately 1500 loose objects.

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

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

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

25631 次浏览

当“ Loose Object”弹出时,我知道是时候运行 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
}
}
}

嗯... ... 我在 医生中没有看到这样的命令行参数。

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

更新: git prune将“解决”这个问题,因为它将删除那些松散的对象
(git gc调用 git prune,但是默认情况下,只对大于两周的松散对象调用 git prune)。
然而,正如 观察员 Michael Donohue在评论中提到的:

我确实喜欢保持松散的对象周围两个星期的安全方面,我应该回去看看一些旧的修订,所以我真的不喜欢这个解决方案。
我对 git 的大小和性能没有任何问题,只是“ git gui”坚持要求我压缩数据库,即使压缩数据库也没有任何效果。


原答案:

git gc”没有清除 所有松散物体的问题以前曾被报道过(2008年底,“ git gc”似乎不再移除松散的对象

git gc只删除两周以上的松散对象,如果你真的想现在删除它们,运行 git prune。
但要确保在运行它时没有其他 git 进程处于活动状态,或者它可能单步执行 什么东西上。

git gc”将 打开行李对象已成为无法到达,目前在包中。
因此,在执行“ git gc”操作之后,git 存储库所使用的磁盘空间实际上可以急剧增加到 起来,这对于那些在自己的文件系统上运行得接近满负荷的人来说可能会很惊讶,他们会从跟踪存储库中删除一些分支,然后执行“ 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”重新打包,这会导致无法到达的对象被解包。小‘ a’表示那些知道自己在做什么并希望 git 只删除不可访问对象的人。

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

因此,如果您使用 Gitv1.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 上——在其他环境中,文件可能位于不同的位置。视窗是 c:\Program Files\Git\mingw64\libexec\git-core\git-gui.tcl)

补充给出答案和解释:

如果你想继续监视松散的对象,但又不想让弹出窗口完全消失(对于大型项目,它总是弹出) ,你可以修改 datase.tcl,它可能在这个文件夹中:

C: Program Files 程序文件 Git ming w64 share Git-gui lib

在函数 proc tip _ 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

比如说。