通过`git rebase`中的提交消息删除提交

时间:2017-01-19 22:56:57

标签: regex git terminal git-rebase

我想做一个jdbcTemplate.update(update);并删除其提交消息与某个正则表达式匹配的提交。例如,它可能像

一样工作
git rebase

这会在删除包含字符串git rebase --drop="deletme|temporary" master master的所有提交时对deleteme进行重组。

使用标准Git工具可以做到这一点吗?如果没有,是否可以使用第三方Git工具?特别是,我希望它是一个单一的,非交互式的命令。

2 个答案:

答案 0 :(得分:1)

你可以。 G。使用交互式rebase。那么请执行git rebase -i<不应该触及的第一个提交>,然后在vim中你有提交列表,你可以这样做:%s / ^ [^] * \([^] * issue \) / d \ 1 / g对所有提交消息以问题开头的提交使用drop节。但请注意,git rebase在使用merge提交时效果不佳。默认情况下,它们会被跳过并且历史记录会变平,但您可以尝试使用参数保留它们。

答案 1 :(得分:1)

这可以使用我在this answer中使用的相同方法来完成。

首先,我们需要找到相关的提交。你可以用以下的东西来做到这一点:

git log --format=format:"%H %s" master..HEAD | grep -E "deleteme|temporary"

这将为您提供包含deletemetemporary的提交消息的提交列表,这些提交消息介于master与您当前的分支之间。这些是需要删除的提交。

将此脚本保存在您可以访问的位置:

#!/bin/bash

for sha in $(git log --format=format:"%H %s" master..HEAD | grep -E "deleteme|temporary" | cut -d " " -f 1)
do
  sha=${sha:0:7}
  sed -i "s/pick $sha/drop $sha/" $@
done

然后将rebase运行为:

GIT_SEQUENCE_EDITOR=/path/to/script.sh git rebase -i

这将自动删除其提交消息中包含deletemetemporary的所有提交。

正如我在其他答案中提到的那样:

  

[这个脚本不允许]你自定义运行什么命令来计算要使用的提交,但如果这是一个问题,你可以传入一个环境变量来允许这样的自定义。

强制性警告:由于rebase会重写历史记录,因此对于在此分支上工作的其他人来说,这可能会造成危险/破坏。请务必清楚地告知您与正在合作的任何人所做的事情。