Я пытался закодировать эксперимент, который включает в себя размещение следующего кода в хуке post-receive
git:
unset GIT_DIR
cd (path to some temp directory outside the repository)
git clone --local (path to repository just pushed to) .
git checkout dev
git reset --hard HEAD^
git reflog expire --expire=now --all
git gc --aggressive --prune=now
По сути, я клонирую только что отправленный репозиторий, делаю полный сброс для удаления последней фиксации, а затем выполняю сборку мусора, чтобы удалить следы последней фиксации из истории. Чтобы убедиться, что сборка мусора действительно выполняет свою работу, я фиксирую огромный 4-мегабайтный файл в последнем коммите, а затем проверяю размер .git, чтобы убедиться, что он был удален.
Поэтому, когда я запускаю этот код внутри хука git «post-receive», сброс, кажется, работает нормально; клонированный репозиторий вернулся в состояние без огромного файла. Однако сборка мусора, похоже, не сработала. Размер .git по-прежнему огромен.
С другой стороны, если я вручную запускаю «git reflog» и «git gc» из командной строки в этот момент, он правильно удаляет следы огромного файла, а размер .git восстанавливается до управляемого размера.
Любые идеи, почему сборка мусора может вести себя по-разному при запуске в «после получения», а не в командной строке?