从Git历史记录中删除具有历史记录的特定文件
答
听起来像你想git filter-branch
。
但是,请务必考虑该名男子页上的警告:
警告!重写的历史记录 对于所有的 对象具有不同的对象名称,并且不会与 原始分支会聚。 不会是 能够在 原始分支的顶部轻松推送并分发 重写的分支。如果您不知道 的全部含义,请不要使用 此命令,并且无论如何只要简单的单一提交 就足以解决您的问题,无论如何不要使用 。 (请参见“恢复上游 REBASE”的混帐底垫(1) 更多信息有关改写 公布的历史部分。)
手册页的"Examples"部分显示了如何卸下历史的给定文件。这对你来说应该是一个很好的起点。
假设你想从所有 提交删除文件 (包含机密信息的 或侵犯版权):
git filter-branch --tree-filter 'rm filename' -- --all
答
如果你真的不想要删除从历史的承诺,如Tim Henigan所说,filter-branch
就是要走的路。然而,他从manpage引用的警告有很好的理由,很可能你会找到另一种解决方案。
要扭转单一的影响提交,你可以简单地使用:
git revert <commit> # that's the SHA1 hash of the commit
这将创建一个新的提交,在当前的分支,它反转指定的所有更改的顶部提交。
谢谢,这看起来正是我所需要的。原谅无知,但是在这个例子中HEAD是我想要删除的版本号? – Alexander 2010-09-10 15:35:58
@Alexander:HEAD指定要重写哪个参考历史。该示例试图从HEAD的所有祖先中删除“坏”文件(在该示例本身后面描述)。 – wRAR 2010-09-10 15:40:29
这个例子实际上不会重写任何分支。如果你真的想要重写所有的分支,你可以用' - --all'来代替'HEAD'。 – Cascabel 2010-09-10 18:15:22