我想在推送到 Github 的所有消息中对特定字符串进行 grep 和更改。是否可以?如何?我知道如何更改最后一条消息git commit --amend
,但我想更改所有提交的所有消息。
1 回答
git-filter-branch
与它的--msg-filter
选项一起使用,例如:
git filter-branch -f --msg-filter 'sed "s/git-svn.*$//g"' -- --all
请注意,这几乎会更改您的 repo 中的所有提交 ID,因此在您的项目上工作的每个人都需要进行新的克隆。
有关更多讨论,请参阅此博客文章:
http://mm0hai.net/blog/2011/03/10/rewriting-git-commit-message-history.html
请注意,上述命令仅针对您的本地副本执行,您需要推送到 GitHub 以使您的更新反映在那里...
一步步
首先使用以下标志克隆您的 repo 的新副本:--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
一旦您对 repo 的更新状态感到满意,请将其推送回来(请注意,由于您的 clone 命令使用了--mirror
标志,此推送将更新远程服务器上的所有refs):
$ git push
在这一点上,你已经准备好让每个人——包括你自己——放弃他们旧的 repo 副本,并对漂亮的新原始数据进行新的克隆。
...我不得不指出,BFG通常比git-filter-branch
清理 Git 历史要好得多,但在这种情况下,这git-filter-branch
听起来很适合您的需求。