Bug report: git -L requires excessive memory.
- From
- man dog <dogman888888@gmail.com>
- Date
- Oct 29, 2022, 16:59 UTC
- Message-ID
- <CAFOPqVXz2XwzX8vGU7wLuqb2ZuwTuOFAzBLRM_QPk+NJa=eC-g@mail.gmail.com>
Thank you for filling out a Git bug report! Please answer the following questions to help us understand your issue.
What did you do before the bug happened? (Steps to reproduce your issue) git log -L /regex/,/regex/:myfile to a repo in which 2MB text file is committed about 2800 times.
What did you expect to happen? (Expected behavior) get the result.
What happened instead? (Actual behavior) fatal: Out of memory, malloc failed (tried to allocate 2346801 bytes)
What's different between what you expected and what actually happened? The function requires too much memory. -n option should work for -L function.
Anything else you want to add: I made a script to reproduce this. Please run the script below. Results in each environments are in its header. A workaround which is given in other BBS is included also.
#!/bin/bash # # Bug report: git -L requires excessive memory. # Run this script to reproduce # # MINGW32(git version 2.38.1.windows.1) fatal: Out of memory, malloc failed (tried to allocate 2346801 bytes) # MINGW64(git version 2.38.1.windows.1) requires 8.6GB # Linux64(git version 2.20.1 ) requires 13.1GB #
git --version
if [ ! -d .git ]; then
git init
c=${1:-3000}
for (( i=0;i<c;i++)); do
gawk -v r="$i" '
BEGIN{
for (i=0;i<100;i++) {
if (r>=i) {
printf("function func_%03d(){ // revised at %d\n",i,
int((r-i)/100)*100+i%100)
printf(" // contents of function\n")
printf("}\n")
make_subfuncs(i);
}
}
exit
}
function make_subfuncs(i, j){
for (j=0;j<300;j++) {
printf("function func_%03d_sub%03d(){\n",i,j)
printf(" // contents of sub functions are NOT revised.\n")
printf("}\n")
}
}' > test.txt
git add test.txt
git commit -m "revision $i"
done
git gc
figit log -L /func_007\(/,/}$/:test.txt # this command requires excessive memory. git log -L /func_007\(/,/}$/:test.txt -n 10 # -n option doesn't work also. #git log -L /func_007\(/,/}$/:test.txt HEAD~10..HEAD~0 # this works.
#
# This can be a workaround
#
step=50
num=`git log | grep -c commit`
for ((i=0;i<$num;i+=$step)); do
end=$((i+$step))
range=HEAD~$end..HEAD~$i
if [ $end -ge $num ]; then
range=HEAD~$i
fi
# echo $range
git --no-pager log -L /func_007\(/,/}$/:test.txt $range
done[System Info] [Enabled Hooks]