Как изменить конкретную строку во всех коммитах сообщений git?

Я хочу выполнить grep и изменить определенную строку во всех сообщениях, которые отправляются на Github. Является ли это возможным? Как? Я знаю, как изменить последнее сообщение до свидания git commit --amend, но я хочу изменить все сообщения всех коммитов.


person Milad Khajavi    schedule 08.04.2013    source источник


Ответы (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 звучит идеально для ваших нужд.

person Roberto Tyley    schedule 08.04.2013
comment
Спасибо, Роберто, я изменил все, что было в моей истории коммитов (у меня плохой английский :D). почему Github не показывает фактические строки? см. здесь: github.com/khajavi/Design-Patterns/tree/master/Behavioural и здесь github.com/khajavi/Design-Patterns/commits/ master/Behavioural сравните. почему они разные???! - person Milad Khajavi; 08.04.2013
comment
@Khajavi, это, вероятно, была просто проблема с обновлением браузера, сообщения фиксации на обеих страницах совпадали, когда я только что их проверял - например, было добавлено последнее сообщение фиксации Behavioural. для обоих. - person Roberto Tyley; 08.04.2013