mirror of
https://github.com/git/git.git
synced 2025-04-11 08:16:13 +00:00
git-gui: Change our initial GC hint to be an estimate
Instead of running a full git-count-objects to count all of the loose objects we can get a reasonably close approximation by counting the number of files in the .git/objects/42 subdirectory. This works out reasonably well because the SHA-1 hash has a fairly even distribution, so every .git/objects/?? subdirectory should get a relatively equal number of files. If we have at least 8 files in .git/objects/42 than it is very likely there is about 8 files in every other directory, leaving us with around 2048 loose objects. This check is much faster, as we need to only perform a readdir of a single directory, and we can do it directly from Tcl and avoid the costly fork+exec. All of the credit on how clever this is goes to Linus Torvalds; he suggested using this trick in a post commit hook to repack every so often. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
parent
2370164f3c
commit
d164b7548a
19
git-gui.sh
19
git-gui.sh
@ -2560,12 +2560,21 @@ if {[is_enabled transport]} {
|
||||
# -- Only suggest a gc run if we are going to stay running.
|
||||
#
|
||||
if {[is_enabled multicommit]} {
|
||||
set object_limit 2000
|
||||
if {[is_Windows]} {set object_limit 200}
|
||||
regexp {^([0-9]+) objects,} [git count-objects] _junk objects_current
|
||||
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 \
|
||||
"This repository currently has $objects_current loose objects.
|
||||
"This repository currently has approximately $objects_current loose objects.
|
||||
|
||||
To maintain optimal performance it is strongly recommended that you compress the database when more than $object_limit loose objects exist.
|
||||
|
||||
@ -2573,7 +2582,7 @@ Compress the database now?"] eq yes} {
|
||||
do_gc
|
||||
}
|
||||
}
|
||||
unset object_limit _junk objects_current
|
||||
unset object_limit objects_current
|
||||
}
|
||||
|
||||
lock_index begin-read
|
||||
|
Loading…
x
Reference in New Issue
Block a user