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

当我运行'git gui'时,出现一个popup窗口

这个版本库目前有大约1500个松散对象。

然后build议压缩数据库。 我之前做过这件事,它将松散的对象减less到大约250个,但是这不会抑制popup。 再次压缩不会改变松散对象的数量。

我们目前的工作stream程需要在从Perforce转换时大量使用“rebase”,而Perforce仍然是规范的SCM。 一旦Git是规范的SCM,我们会定期合并,松散对象问题应该大大减轻。

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

由于没有人有答案,我查看了代码,看看如何删除显示该对话框的代码。 我发现了hint_gc过程,它和它被调用的地方。 同时我注意到,2011年末,添加了禁用对话框的configuration选项 。 这个变化(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_gcafter 1000 hint_gc行,或者编辑/usr/share/git-gui/lib/database.tcl并删除主体的hint_gc过程。 (这些文件path在Cygwin上 – 在其他环境下,这些文件可能位于不同的位置,对于Windows,它是c:\Program Files\Git\mingw64\libexec\git-core\git-gui.tcl

更新: git prune将“解决”这个问题,因为它将删除那些松散的对象
git gc调用git prune ,但仅适用于两周以前的松散对象)。
然而,正如OP的Michael Donohue在评论中提到的那样:

我喜欢将松动的物体放置两周的安全方面,如果我想回头看看一些旧版本,所以我不太喜欢这个解决scheme。
我对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.pruneexpireconfigurationvariables中的“now”时,需要上述行为发生)。


你也有(从同一个线程):

 repack -a -d -l 

注意小写的'a'。

git-gc调用用大写字母“A”来重新包装,这是导致不可达对象被解压缩的原因。 小'​​a',是为了知道自己在做什么的人,并希望git只删除不可访问的对象。

当“Loose Object”popup时,我知道是时候运行git的垃圾回收器了:

 git gc 

之后popup消失。

更新:(由于TED的build议)

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

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

我想你总是可以拉下来源,取出对话框的代码,然后重build。