当我运行'git gui'时,我会弹出一个说
This repository currently has approximately 1500 loose objects.
然后它建议压缩数据库。我以前做过这个,它将松散的对象减少到大约 250 个,但这并没有抑制弹出窗口。再次压缩不会改变松散对象的数量。
当我们从 Perforce 过渡时,我们当前的工作流程需要大量使用“rebase”,而 Perforce 仍然是规范的 SCM。一旦 Git 成为规范的 SCM,我们将进行定期合并,并且应该大大缓解松散对象问题。
同时,我真的很想让这个“有用的”弹出窗口消失。
由于没有人得到答案,我查看了代码以了解如何删除显示该对话框的代码。我找到了执行此操作的 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
)
更新: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”之后消失,但是当我做这个家务操作时,我经常希望 --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
注意小写的“a”。 git-gc 用大写的“A”调用 repack,这就是导致无法访问的对象被解包的原因。 Little 'a' 是为那些知道自己在做什么并希望 git 丢弃无法访问的对象的人准备的。
当“Loose Object”弹出窗口时,我知道是时候运行 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
}
}
}
git gc
解决了问题......只是在 git gui 中单击 ok
并没有解决问题......
添加到答案和解释:
如果您想继续监视松散的对象,但不希望弹出窗口完全消失(对于较大的项目,它一直弹出),您可以修改可能位于此文件夹中的 database.tcl:
C:\Program Files\Git\mingw64\share\git-gui\lib\
在函数 proc hint_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
例如。
不定期副业成功案例分享
after 1000 hint_gc
以便在10000
个松散对象之后发生警告吗?after 1000
的“1000”是指等待显示对话框的毫秒数。通过将其增加到“10000”,对话框仍然会出现,但它需要 10 秒才能这样做。database.tcl
包含限制的定义,并且可以增加以降低对话频率。git gc
的用户(通常)是不必要的,并且不必要地固执己见 git gui。