git remove非交互式提交

时间:2014-09-20 11:30:35

标签: git

我想非交互式从我的历史记录中删除包含主题关键字的未提交的提交(类似于删除包含该关键字的行的交互式rebase)。

〜/ .gitconfig中的以下 nocommit 函数几乎可以实现我想要的功能,除了创建一个新的结果分支。

nocommit = "!f() { \
    for i in `git log --oneline FETCH_HEAD.. |grep NOCOMMIT | awk '{ print $1 }'`; \
    do \
        git log -n1 --oneline $i; \
        git rebase --onto $i^ $i HEAD; \
    done; \
}; f"

也应该可以使用git push hook来实现这一点,但我们已经有三个钩子,我不想修改它。

编辑:使用此命令解决(灵感来自安德鲁C的答案):

GIT_EDITOR="sed -i '/NOCOMMIT/d'" git rebase -i @{upstream}

1 个答案:

答案 0 :(得分:1)

一些评论。

您正在通过提交“向后”,从最新到最旧。 rebase从最旧到最新运行的原因是你只处理每次提交一次。

您的脚本的第一行可能最好写成

for i in `git rev-list --grep=NOCOMMIT @{u}..HEAD`

使用FETCH_HEAD不是限制提交的好方法,并且不需要使用grep和awk管道。

为了让它更像你需要跟踪ORIG_HEAD,请从git merge-base ORIG_HEAD ${u}签出一个新分支,然后运行从最旧到最新( - 反向)的提交,挑选任何没有它们中没有NOCOMMIT,然后在最后更新分支。

另一种选择是通过保存编辑器设置并用刚刚删除包含NOCOMMIT的行的脚本替换它来欺骗交互式rebase以实现您想要的功能。所以你可以正常调用git rebase -i,但是没有获得编辑器窗口sed只会删除你不想要的提交,它会继续。