Как определить достижимость определенного коммита? - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь очистить репо:

local FIRST_COMMIT="bf450342272a94117d78eae34a140a2a39359dad"
git branch -d bad-master
git remote remove bad-remote
git rev-parse ${FIRST_COMMIT} > .git/shallow
git fsck --unreachable
git gc --prune=now

Идея заключается в следующем:

  • сохранить одну ветвь (develop) ветвь
  • удалить все ненужные ссылки
  • вырезать историю в ветке develop, с .git/shallow / gc --prune

После этого я проверил следующее:

  • пульты не определены
  • теги не определены
  • есть одна ветка: develop
  • история в ветви develop действительно сокращена до указанного коммита

Но есть еще проблема:

git rev-list --all

Список коммитов, которые недоступны через ветку develop!

Я не понимаю, почему git fsck --unreachable не перечисляет это и почему git gc --prune=now не удаляет эти коммиты. Единственное объяснение состоит в том, что эти коммиты достижимы , через другие ссылки. Какие из них?

Как мне определить, как достижим данный коммит?

То, что я ожидаю, это:

  • определить ссылку, которую я пропустил до сих пор (филиал / удаленный / тег / ???)
  • удалить эту ссылку
  • после этого prune удалит нежелательные коммиты.

1 Ответ

0 голосов
/ 16 января 2019

Используйте git for-each-ref для перебора всех ссылок (по умолчанию они отображаются, их хэш-идентификаторы и типы объектов).

Обратите внимание, что git for-each-ref смотрит только на ссылки, а не на соответствующие ссылки. Используйте git reflog на каждом рефере для проверки (или истечения срока действия) их рефлогов. Удаление ref удаляет его reflog, поэтому, если других ссылок нет, скорее всего, проблема в reflog для develop; однако git rev-list --all просматривает все ссылки, но не повторные, поэтому я ожидаю, что есть другие ссылки, находящие эти коммиты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...