Как очистить Git-репозиторий с коммитом, которого нет в рабочем дереве - PullRequest
1 голос
/ 26 октября 2019

Я очистил Git-репозиторий (облако Bitbucket) с помощью bfg, но последний коммит остался не очищенным (как написано в документации bfg: по умолчанию BFG не изменяет содержимое вашего последнего коммита на вашем мастер-устройстве (или 'HEAD)') ветку, даже если она очистит все коммиты до нее.).

Однако я ее не видел и хотел запустить git gc в Bitbucket.
Для этого я сделал "git reset --hard HEAD "и затем откатился на него" git push --force ".
Но размер хранилища увеличился?!

Теперь у меня есть этот коммит со старой историей, оставленной в хранилище, и bfg не может его очистить, что мне делать?
Как я могу удалить его, так как он больше не привязан к рабочему дереву?

Ответы [ 3 ]

0 голосов
/ 26 октября 2019

Попробуйте еще раз, на этот раз используя newren/git-filter-repo, который заменит BFG и ветвь фильтра git

Как упомянуто в документации:

[есть] дополнительные шаги, чтобы удалить другие теги и сделать другой gc, все еще требуются, чтобы очистить старые объекты и избежать смешивания новой и старой истории, прежде чем нажать куда-нибудь

git filter-repo избегает путаницы с пользователями (и предотвращает случайное повторное нажатие старого материала) из-за смешивания старого и переписанного репо.


Примечание: на стороне сервер (т.е. , где вы нажимаете), необходимо запустить git gc, что выполняется регулярно, но не сразу.
Это случай для GitHub , а также для BitBucket.

См. Документацию Atlassian " Как выполнить сборку мусора вручную в хранилище "

Bitbucket реализует свою собственную логику сбора мусора, не полагаясь больше на git gc (это достигаетсянастройка [gc] авто= 0 во всех репозиториях).
При создании форка pruneexpire = никогда не добавляется в конфигурацию git и удаляется при удалении последнего форка.

As упомянутое здесь :

BitBucket запустит git gc самостоятельно в ответ на выполнение git reset --hard HEAD~1 (который отбрасывает последний коммит), за которым следует git push -f.

Итак, в вашем случае:

git commit --allow-empty -m "empty commit"
git push

git reflog expire --expire-unreachable="30m" --all
git prune --expire="30m" -v
git gc --prune="30m"
git reset --hard HEAD~1
git push -f

И git gc должно быть сделано на стороне BitBucket!

0 голосов
/ 28 октября 2019

Я написал в поддержку bitbucket, они запустили скрипт "git gc" на сервере, и старая история была очищена

0 голосов
/ 26 октября 2019

Вы также можете указать BFG изменить последний коммит с флагом --no-blob-protection. * (Это из документации BFG-Repo-Cleander).

Кроме того, вы можете создать новый коммит, который удалит поврежденный файл, и затем запустить BFG в обычном режиме.

...