Я работаю над курсом git и хотел бы упомянуть, что потерянные ссылки действительно не потеряны до запуска git gc
. Но, подтвердив это, я узнал, что это не так. Даже после запуска git gc --prune=all --aggressive
потерянные ссылки все еще там.Когда именно git обрезает объекты: почему «git gc» не удаляет коммиты?
Очевидно, я что-то не понял. И прежде чем сказать что-то неправильное в курсе, я хочу получить мои факты прямо! Ниже приведен пример сценарий иллюстрирует эффект:
#!/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;
Этот скрипт добавит 10 манекена совершившее, сбросить до 5 фиксаций в прошлом, и добавить еще 10 фиксаций. Как раз перед сбросом, он напечатает хеш текущего HEAD.
Я хотел бы ожидать, чтобы потерять объект в CURRENT
после запуска git gc --prune=all
. Тем не менее, я все еще могу запустить git show
на этом хэше.
Я понимаю, что после запуска git reset
и добавления новых коммитов я по существу создал новую ветку. Но у моей оригинальной ветки больше нет ссылок, поэтому она не отображается в git log --all
. Я также предполагаю, что это не будет перенесено на любой отдаленный объект.
Мое понимание git gc
было удалено из этих объектов. Кажется, это не так.
Почему? И , когда точно git gc
удалить объекты?
Ваш рефлок по-прежнему содержит ссылки на то, что вы «удалили». Пока этот тайм-аут или вы явно не закончите их, они не будут обрезаны. – twalberg
Интересно. Я просмотрел https://git-scm.com/docs/git-reflog и запустил 'git reflog --expire = all'. После чего объект был * еще * там. Затем я запустил еще один «gc», и он все еще был там. Даже другой «git gc --aggressive --prune = all» не помог. – exhuma
Вам нужно '--expire = all -all' или запустить его как на' HEAD' (по умолчанию), так и на 'master'. Или вы можете вручную удалить определенные записи (или посмотреть ответ ниже). – torek