git:如何删除带有模式的所有提交?

时间:2015-10-03 00:44:44

标签: git github version-control

我们使用git进行源代码控制。每次开发人员提交时,脚本都会修改构建文件并检入文件。该脚本使用遵循模式的消息向构建文件提交。因此,提交历史记录如下:

  • script checkin build file 003
  • 修复此错误
  • script checkin build file 002
  • 解决这个故事

我想要做的是删除脚本的所有提交。现在,显然,这与删除特定提交非常不同。

我可以通过从现有存储库复制来自由创建一个全新的存储库,但我仍然希望保留"开发人员的提交历史记录"尽可能地摆脱"脚本的提交历史记录"。

这可能吗?

注意 - "脚本的提交"仅更改了此单个文件(即构建文件),并且未更改任何其他文件。而且,没有"开发者的承诺"曾经改变过这个特定的文件。

到目前为止,我一直在做的是运行" bfg工具"从git repo中删除该特定的构建文件。只有来自脚本的提交才更改了构建文件,所以我希望通过删除构建文件,相关的提交将被git压掉。

但是,我发现的是:构建文件已经消失,但所有提交都被保留了,而那些提交,奇怪的是,有#34; 0更改"。

所以我的下一个问题是:是否有可能要求git删除提交" 0更改"?

3 个答案:

答案 0 :(得分:0)

您可以使用git filter-branch。一种简单的方法是,如果您的脚本具有唯一的作者名称。然后你可以做类似的事情:

git filter-branch --commit-filter '
    if [ "$GIT_AUTHOR_NAME" = "Script Person" ];
    then
        skip_commit "$@";
    else
        git commit-tree "$@";
    fi' HEAD

这几乎完全在手册页之外。如果还有其他一些内容可以将您的脚本唯一标识为提交者,则可以检查一些不同的变量。

答案 1 :(得分:0)

Squash your commits

最近,我遇到了同样的问题,我的拉请求有41次提交。我只会触及我所实施的内容。

例如,如果您有3次提交,则可以使用交互式rebase将它们压缩并合并为一次。见下面的命令:

$ git rebase -i HEAD~n

例如,您想要压缩3个提交:

$ git rebase -i HEAD~3

现在,您将看到一个交互式rebase界面,您可以在第一次提交时编写reword / pick并在其余部分中进行压缩。请参阅此视频以便更好地理解。

Squashing commits video

  

这很容易,不会花费更长的时间。我努力了。

答案 2 :(得分:0)

是的,git filter-branch有一个选项来修剪最终为空的提交。检查其联机帮助页以获取确切的名称。