Я хочу выполнить grep и изменить определенную строку во всех сообщениях, которые отправляются на Github. Является ли это возможным? Как? Я знаю, как изменить последнее сообщение до свидания git commit --amend
, но я хочу изменить все сообщения всех коммитов.
Как изменить конкретную строку во всех коммитах сообщений git?
Ответы (1)
Используйте git-filter-branch
с параметром --msg-filter
, например:
git filter-branch -f --msg-filter 'sed "s/git-svn.*$//g"' -- --all
Обратите внимание, что это изменит почти все все ваши идентификаторы коммитов в вашем репозитории, поэтому всем, кто работает над вашим проектом, потребуется сделать новый клон.
См. этот пост в блоге для дальнейшего обсуждения:
http://mm0hai.net/blog/2011/03/10/rewriting-git-commit-message-history.html
Обратите внимание, что приведенная выше команда выполняется только для вашей локальной копии, и вам нужно отправить ее на GitHub, чтобы ваши обновления отражались там...
Шаг за шагом
Сначала клонируйте свежую копию вашего репозитория, используя флаг --mirror
:
$ git clone --mirror git://example.com/my-repo.git
Это пустое репо, что означает, что ваши обычные файлы не будут видны, но это полная копия базы данных Git вашего репозитория, и на этом этапе вы должны сделать ее резервную копию, чтобы убедитесь, что вы ничего не теряете.
Теперь вы можете запустить git-filter-branch
, чтобы исправить ваши сообщения фиксации:
git filter-branch -f --msg-filter 'sed "s/git-svn.*$//g"' -- --all
Как только вы будете довольны обновленным состоянием вашего репозитория, отправьте его обратно (обратите внимание, что, поскольку ваша команда clone использовала флаг --mirror
, эта отправка обновит все ссылки на вашем удаленном сервере):
$ git push
На этом этапе вы готовы к тому, что все, включая вас самих, избавятся от своих старых копий репозитория и создадут новые клоны новых, нетронутых данных.
...Я вынужден отметить, что BFG часто намного лучше, чем git-filter-branch
для очистки истории Git, но в этом случае просто git-filter-branch
звучит идеально для ваших нужд.