Перед публикацией проекта я хотел бы очистить хранилище, что означает:
- удаление всех коммитов старше определенного тега (но остальная часть истории и текущая версия остаются без изменений)
- изменение имени автора и коммиттера и адреса электронной почты на что-то значимое
Дерево довольно простое, есть только одна ветвь (кроме другой, которая меня не интересует). Но есть следующие осложнения:
- У меня есть теги (с описаниями), которые я хочу сохранить (но и здесь имя тегера и адрес электронной почты должны быть изменены при сохранении отметки времени)
- У меня есть ссылки (сообщения коммита типа «исправляет ошибку, введенную в коммите X»), которые необходимо адаптировать
- У меня есть заметки (например, «оказалось, что это привело к ошибке, исправленной в коммите Y»), которую я хочу сохранить
Я нашел этот ответ, чтобы обрезать историю:
$ git checkout --orphan temp <newroot-sha1>
$ git commit -C <newroot-sha1>
$ git commit --ammend
$ git rebase --onto temp <newroot-sha1> master
$ git checkout master
$ git branch -d temp
Хотя это обрезает начало по желанию, оно создает новую историю без тегов и заметок, и ссылки не обновляются. Я пробовал git rebasetags, но он не хранит описания тегов и присваивает тегам неправильный коммит, если два коммита имеют одно и то же сообщение. Это не касается вопроса заметок и ссылок.
Я нашел этот ответ, чтобы изменить имя и адрес электронной почты коммитов. Он изменяет имя и адрес электронной почты коммитов по своему усмотрению, и хотя он перезаписывает историю, он даже сохраняет теги с их сообщениями, но не меняет имя тегера и адрес электронной почты тегов. Он не хранит заметки и не обновляет ссылки.
$ git filter-branch --env-filter '
WRONG_EMAIL="old-email"
NEW_NAME="new-name"
NEW_EMAIL="new-email"
if [ "$GIT_COMMITTER_EMAIL" = "$WRONG_EMAIL" ]
then
export GIT_COMMITTER_NAME="$NEW_NAME"
export GIT_COMMITTER_EMAIL="$NEW_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$WRONG_EMAIL" ]
then
export GIT_AUTHOR_NAME="$NEW_NAME"
export GIT_AUTHOR_EMAIL="$NEW_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
Как я могу обрезать историю и изменить имя и адрес электронной почты всех коммитов и тэгов, сохраняя при этом тэги и заметки (и их временные метки), и обновлять шейд-идентификаторы коммитов, упомянутые в сообщениях и коммитах коммитов? (Я не вижу возможности показать автора заметки. Есть ли заметки у автора? Если так, я бы тоже хотел это изменить.)