我正在与其他几个人一起开发一个 git repo,他们设法在几个提交中包含了几个大型 DDL 文件。有没有办法让我从所有过去的提交中删除它们?不幸的是,它不像针对特定提交那么容易,因为它们无处不在。
我将满足于只保留 master 上的最新提交并删除它之前的所有内容。
我正在与其他几个人一起开发一个 git repo,他们设法在几个提交中包含了几个大型 DDL 文件。有没有办法让我从所有过去的提交中删除它们?不幸的是,它不像针对特定提交那么容易,因为它们无处不在。
我将满足于只保留 master 上的最新提交并删除它之前的所有内容。
http://git-scm.com/book/en/Git-Tools-Rewriting-History
核选项:过滤器分支
如果您需要以某种可编写脚本的方式重写大量提交,您可以使用另一个历史重写选项——例如,全局更改您的电子邮件地址或从每个提交中删除一个文件。该命令是 filter-branch,它可以重写您的大量历史记录,因此您可能不应该使用它,除非您的项目尚未公开并且其他人还没有基于您将要重写的提交的工作. 但是,它可能非常有用。您将学习一些常见用途,以便了解它的一些功能。
从每次提交中删除文件
这种情况相当普遍。有人不小心用一个粗心的 git add . 提交了一个巨大的二进制文件,而你想到处删除它。也许你不小心提交了一个包含密码的文件,并且你想让你的项目开源。filter-branch 是您可能想要用来清理整个历史记录的工具。要从整个历史记录中删除名为 passwords.txt 的文件,可以使用 --tree-filter 选项来过滤分支:
$ git filter-branch --tree-filter 'rm -f passwords.txt' HEAD
重写 6b9b3cf04e7c5686a9cb838c3f36a8cb6a0fc2bd (21/21)
Ref 'refs/heads/master' 被重写
--tree-filter 选项在每次签出项目后运行指定的命令,然后重新提交结果。在这种情况下,您从每个快照中删除一个名为 passwords.txt 的文件,无论它是否存在。如果要删除所有意外提交的编辑器备份文件,可以运行 git filter-branch --tree-filter "rm -f *~" HEAD 之类的命令。
您将能够看到 Git 重写树和提交,然后在最后移动分支指针。通常最好在测试分支中执行此操作,然后在确定结果是您真正想要的结果后硬重置您的主分支。要在所有分支上运行 filter-branch,可以将 --all 传递给命令。
当心它是一个强大但也很危险的工具,告诉你的同事不要推动任何提交以防止历史混乱。