git: --prune-empty после использования bfg дублирует коммиты

Я использую bfg для удаления некоторых подкаталогов из (клона) репозитория git:

java -jar bfg-1.12.12.jar --delete-folders {folder1,folder2,folder3} --no-blob-protection myrepo.git/
git reflog expire --expire=now --all && git gc --prune=now --aggressive

Это работает нормально, но после того, как я использовал bfg, у меня много пустых коммитов (т.е. коммиты с хорошими сообщениями журнала, но без изменений, потому что они касались только тех файлов, которые были удалены сейчас).

Так что в качестве следующего шага я попытался использовать

git filter-branch --commit-filter 'git_commit_non_empty_tree "$@"' HEAD

или же

git filter-branch --prune-empty --tag-name-filter cat -- --all

Обе версии не имеют желаемого эффекта (удаление пустых коммитов).

Вместо этого я получаю хранилище (см. Скриншот ниже, слева - до обрезки, справа - после):

  1. несколько пустых коммитов были удалены
  2. остаются самые пустые коммиты
  3. непустые коммиты дублируются в отдельных последовательностях коммитов

Любой совет?

1 ответ

Решение

Судя по повторяющейся истории, кажется, что ваша попытка удалить старую, теперь переписанную историю фиксации после запуска BFG не удалась. Это может произойти по ряду причин, но основной myrepo.git не является репозиторием "голый / зеркальный клон", как указано в инструкциях BFG.

Что-то сохранило старую историю переписывания перед BFG, которая теперь отображается как дубликат. Возможно или даже вероятно, что эта история хранится в удаленном, таком как origin и это также объясняет, почему ваш filter-branch не удаляет все пустые коммиты, которые вы ожидаете.

Наконец, вас может заинтересовать текущий запрос на добавление --prune-empty-commits особенность BFG - она ​​работает хорошо и, как и все BFG, на несколько порядков быстрее, чем работает filter-branch,

Другие вопросы по тегам