如何在所有Git提交消息中更改特定字符串?

3

我想在所有推送到Github上的消息中查找并更改特定字符串。这可能吗?如何实现? 我知道如何通过git commit --amend更改最后一条消息,但我想更改所有提交的所有消息。

1个回答

6
使用 git-filter-branch 命令并使用其 --msg-filter 选项,例如:
git filter-branch -f --msg-filter 'sed "s/git-svn.*$//g"' -- --all

请注意,这将基本上更改您存储库中的所有提交 ID,因此每个参与项目的人都需要进行全新的克隆。
请参阅此博客文章以获取更多讨论: 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

当您满意于仓库的更新状态后,将其上传(请注意,由于克隆命令使用了--mirror标志,因此此推送将更新远程服务器上的所有引用):

$ git push

此时,您已准备好让每个人(包括自己)放弃旧的代码库副本,并进行新的克隆以获取全新的原始数据。

...我不得不指出,相比于使用 git-filter-branch 来清理 Git 历史记录,The BFG 往往更加优秀,但在这种情况下,仅使用 git-filter-branch 就足够了。


感谢Roberto,我已经在我的提交历史中将所有的“is”改为了“was”(我的英语太烂了:D)。为什么Github不显示实际的字符串?请看这里:https://github.com/khajavi/Design-Patterns/tree/master/Behavioural和这里https://github.com/khajavi/Design-Patterns/commits/master/Behavioural进行比较。为什么它们不同?! - Milad Khajavi
@Khajavi,那可能只是浏览器刷新的问题,因为我刚刚检查了两个页面上的提交消息,它们是匹配的 - 例如,最新的提交消息对于两者都是“Behavioural's readme was added.”。 - Roberto Tyley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接