当我运行'git gui'时,我会弹出一个说
的弹出窗口This repository currently has approximately 1500 loose objects.
然后建议压缩数据库。我以前做过这个,它将松散的对象减少到大约250,但这并不会抑制弹出窗口。再次压缩不会改变松散物体的数量。
我们当前的工作流程需要大量使用'rebase',因为我们正在从Perforce过渡,而Perforce仍然是规范的SCM。一旦Git是规范的SCM,我们将定期进行合并,并且应该大大减轻松散的对象问题。
与此同时,我真的想让这个“有用”的弹出窗口消失。
答案 0 :(得分:148)
由于没有人有答案,我查看了代码,看看如何删除显示该对话框的代码。我找到了执行它的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
)
答案 1 :(得分:47)
更新: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
”之后消失,但是当我执行此内务操作时,我经常希望{gn 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”调用repack,这是导致无法访问的对象被解压缩的原因。小'a',适用于那些知道自己在做什么的人,并希望git只是丢弃无法访问的对象。
答案 2 :(得分:30)
当“松散对象”弹出窗口时,我知道是时候运行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
}
}
}
答案 3 :(得分:3)
嗯......我在docs中没有看到命令行参数。
我想你总是可以下载它的源代码,取出对话框的代码,然后重建。