我想在推送到Github的所有消息中grep和更改特定字符串。这可能吗?如何?我知道如何更改git commit --amend
的最后一条消息,但我想更改所有提交的所有消息。
使用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,以便得到你的更新反映在那里…
一步一步首先克隆一个新鲜的副本,使用--mirror
标志:
$ git clone --mirror git://example.com/my-repo.git
这是一个裸repo,这意味着你的普通文件将不可见,但它是你的存储库的Git数据库的完整副本,此时你应该做一个备份,以确保你没有丢失任何东西。
现在你可以运行git-filter-branch
来修复你的提交消息:
git filter-branch -f --msg-filter 'sed "s/git-svn.*$//g"' -- --all
一旦你对你的repo的更新状态感到满意,把它推回来(注意,因为你的克隆命令使用了--mirror
标志,这个推将更新在你的远程服务器上的所有 refs):
$ git push
此时,您已经准备好让每个人(包括您自己)抛弃旧的repo副本,并对漂亮的新原始数据进行新的克隆。
…我不得不指出,在清理Git历史记录方面,BFG通常比git-filter-branch
要好得多,但在这种情况下,git-filter-branch
听起来很适合您的需要。