gpt4 book ai didi

git - 使用 git filter-branch 通过提交消息删除提交

转载 作者:太空狗 更新时间:2023-10-29 12:45:41 26 4
gpt4 key购买 nike

简单版:

如果我有一个分支“foo-555”,有一堆带有如下消息的提交:

  • foo 555:废话
  • foo 123:等等
  • foo 555:等等等等
  • foo 321:废话

我想删除所有不以“foo 555:”开头的提交,有没有办法使用 git filter-branch(或任何其他工具)来做到这一点?

原版(更详细):

在我们的存储库中,我们有一个约定,其中每个提交消息都以特定模式开头:

Redmine #555: SOME_MESSAGE

我们还做了一些 rebase ,以将潜在发布分支的更改引入特定问题的分支。换句话说,我可能有分支“foo-555”,但在我将它 merge 到分支“预发布”之前,我需要获得预发布有 foo-555 没有的任何提交(所以 foo- 555 可以快进 merge 到预发布)。

但是,由于预发布有时会发生变化,我们有时会遇到这样的情况:您从预发布中引入了一个提交,但随后该提交又从预发布中删除了。很容易识别来自预发布的提交,因为他们的提交消息中的数字与分支号不匹配;例如,如果我在我的 foo-555 分支中看到“Redmine #123: ...”,我知道它不是来 self 的分支的提交。

那么现在的问题是:我想删除所有“不属于”分支的提交;换句话说,任何提交:

  • 在我的 foo-555 分支中,但不在预发布分支 (pre-release..foo-555) 中
  • 有一个不以“Redmine #555”开头的提交信息

但是“555”当然会因分支机构而异。有什么方法可以使用 filter-branch (或任何其他工具)来完成此操作?目前我能看到的唯一方法是进行交互式 rebase(“git rebase -i”)并手动删除所有“错误”提交。

最佳答案

这是一个使用 filter-branch 而不是 rebase 的快速解决方案。没有交互性,也不需要解决冲突。

git filter-branch --commit-filter '
if [ `git rev-list --all --grep "<log-pattern>" | grep -c "$GIT_COMMIT"` -gt 0 ]
then
skip_commit "$@";
else
git commit-tree "$@";
fi' HEAD

然后您可能想要清理:

git reflog expire --expire=now
git gc --prune=now

关于git - 使用 git filter-branch 通过提交消息删除提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4558162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com