2

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

4

1 回答 1

5

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听起来很适合您的需求。

于 2013-04-08T08:09:25.040 回答