¿Cuándo exactamente git poda los objetos: por qué "git gc" no elimina commits?
Estoy trabajando en un curso de git y quería mencionar que los árbitros perdidos no se pierden realmente hasta que se ejecutangit gc
. Pero al verificar esto, descubrí que este no es el caso. Incluso después de corrergit gc --prune=all --aggressive
los árbitros perdidos todavía están allí.
Claramente entendí mal algo. Y antes de decir algo incorrecto en el curso, ¡quiero aclarar mis hechos! Aquí hay un script de ejemplo que ilustra el efecto:
#!/bin/bash
git init
# add 10 dummy commits
for i in {1..10}; do
date > foo.txt
git add foo.txt
git commit -m "bump" foo.txt
sleep 1
done;
CURRENT=$(git rev-parse HEAD)
echo HEAD before reset: ${CURRENT}
# rewind
git reset --hard HEAD~5
# add another 10 commits
for i in {1..10}; do
date > foo.txt
git add foo.txt
git commit -m "bump" foo.txt
sleep 1
done;
Este script agregará 10 confirmaciones ficticias, se restablecerá a 5 confirmaciones en el pasado y agregará otras 10 confirmaciones. Justo antes de reiniciar, imprimirá el hash de su HEAD actual.
me gustaríaesperar perder el objeto enCURRENT
despues de corrergit gc --prune=all
. Sin embargo, todavía puedo corrergit show
en ese hash
Entiendo que después de corrergit reset
y agregando nuevos commits, esencialmente he creado una nueva rama. Pero mi rama original ya no tiene ninguna referencia, por lo que no aparece engit log --all
. Tampoco sería empujado a ningún control remoto, supongo.
Mi comprensión degit gc
fue eso quita esos objetos. Este no parece ser el caso.
¿Por qué? Ycuando exactamente, sígit gc
eliminar objetos?