当我运行'git gui'时,我会弹出一个说
该存储库当前大约有 1500 个松散对象。
然后它建议压缩数据库。我以前做过这个,它将松散的对象减少到大约 250 个,但这并没有抑制弹出窗口。再次压缩不会改变松散对象的数量。
当我们从 Perforce 过渡时,我们当前的工作流程需要大量使用“rebase”,而 Perforce 仍然是规范的 SCM。一旦 Git 成为规范的 SCM,我们将进行定期合并,并且应该大大缓解松散对象问题。
同时,我真的很想让这个“有用的”弹出窗口消失。
当我运行'git gui'时,我会弹出一个说
该存储库当前大约有 1500 个松散对象。
然后它建议压缩数据库。我以前做过这个,它将松散的对象减少到大约 250 个,但这并没有抑制弹出窗口。再次压缩不会改变松散对象的数量。
当我们从 Perforce 过渡时,我们当前的工作流程需要大量使用“rebase”,而 Perforce 仍然是规范的 SCM。一旦 Git 成为规范的 SCM,我们将进行定期合并,并且应该大大缓解松散对象问题。
同时,我真的很想让这个“有用的”弹出窗口消失。
由于没有人得到答案,我查看了代码以了解如何删除显示该对话框的代码。我找到了执行此操作的hint_gc
程序以及调用它的位置。与此同时,我注意到 2011 年末添加了一个用于禁用对话框的配置选项。此更改(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
“似乎不再移除松散物体”
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
”会有帮助吗?
(可能在配置变量中使用“now”,这gc.pruneexpire
是发生上述行为所必需的)。
你也有(来自同一个线程):
repack -a -d -l
注意小写的“a”。
git-gc
用大写的“A”调用重新打包,这就是导致无法访问的对象被解包的原因。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
}
}
}
嗯....我在docs中没有看到命令行参数。
我想你总是可以拉下它的源代码,取出对话框的代码,然后重新构建。
添加到答案和解释:
如果您想继续监视松散的对象,但不希望弹出窗口完全消失(对于较大的项目,它一直弹出),您可以修改可能位于此文件夹中的 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
例如。