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

Mil*_*avi 3 git version-control github rebase git-rewrite-history

我想 grep 并更改推送到 Github 的所有消息中的特定字符串。是否可以?如何?我知道如何更改最后一条消息git commit --amend,但我想更改所有提交的所有消息。

Rob*_*ley 6

git-filter-branch与它的--msg-filter选项一起使用,例如:

git filter-branch -f --msg-filter 'sed "s/git-svn.*$//g"' -- --all
Run Code Online (Sandbox Code Playgroud)

请注意,这将改变您存储库中的几乎所有提交 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
Run Code Online (Sandbox Code Playgroud)

这是一个裸存储库,这意味着您的普通文件将不可见,但它存储库的 Git 数据库的完整副本,此时您应该对其进行备份以确保不会丢失任何内容。

现在您可以运行git-filter-branch来修复您的提交消息:

git filter-branch -f --msg-filter 'sed "s/git-svn.*$//g"' -- --all
Run Code Online (Sandbox Code Playgroud)

一旦您对存储库的更新状态感到满意,请将其推送回去(请注意,因为您的克隆命令使用了该--mirror标志,所以此推送将更新远程服务器上的所有引用):

$ git push
Run Code Online (Sandbox Code Playgroud)

此时,您已经准备好让每个人(包括您自己)放弃旧的存储库副本,并为漂亮的新原始数据进行新的克隆。

...我不得不指出,BFGgit-filter-branch通常比清理 Git 历史记录要好得多,但在这种情况下git-filter-branch,听起来非常适合您的需求。