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 ответ
Судя по повторяющейся истории, кажется, что ваша попытка удалить старую, теперь переписанную историю фиксации после запуска BFG не удалась. Это может произойти по ряду причин, но основной myrepo.git
не является репозиторием "голый / зеркальный клон", как указано в инструкциях BFG.
Что-то сохранило старую историю переписывания перед BFG, которая теперь отображается как дубликат. Возможно или даже вероятно, что эта история хранится в удаленном, таком как origin
и это также объясняет, почему ваш filter-branch
не удаляет все пустые коммиты, которые вы ожидаете.
Наконец, вас может заинтересовать текущий запрос на добавление --prune-empty-commits
особенность BFG - она работает хорошо и, как и все BFG, на несколько порядков быстрее, чем работает filter-branch
,